Вождение светодиодного DIM/Glow с использованием PWM -контактов и MOSFET

Стэнлисеоу
Пт, 01 декабря 2017 г., 6:03
Привет,

Я рассчитал, что таблетки с красной/синей, в общей сложности 15 штифтов монтажного монтажа, и я хотел бы использовать все они для управления светодиодом 12 В, используя Mosfet логического уровня...

Есть ли какие -либо ограничения на использование всех булавок PWM с использованием Analogwrite ?

Любой конфликт таймеров ?

Спасибо

Стэнли

Rogerclark
Пт 01 декабря 2017 г. 8:53 утра
Афик

Поскольку на HE F103C есть только 4 таймера, вы сможете вывести только 4 уникальных значения ШИМ

Если вы хотите больше, вам, вероятно, придется сделать это через ISR и какой -то код.

Существует хорошая ссылка для Maple Mini, которая дает больше информации о PWM

http: // docs.Leaflabs.com/static.Leaflab ... м.html#pwm

Конкретно

http: // docs.Leaflabs.com/static.Leaflab ... -конфликты

Стивестронг
Пт, 01 декабря 2017 г. 14:28
Я думаю, что можно использовать все каналы таймера, но с одинаковой базовой частотой для всех, разные служебные циклы выполнены, хотя.

Стэнлисеоу
Пт, 01 декабря 2017 г. 14:54
Мне, вероятно, нужно только все булавки, чтобы быть только на 2 уникальных значениях ШИМ ... Так что это означает, что я могу использовать все 15 штифтов ?

Спасибо

Rogerclark
Пт, 01 декабря 2017 г. 18:37
[Стэнлисеоу - Пт, 01 декабря 2017 г. 14:54] - Мне, вероятно, нужно только все булавки, чтобы быть только на 2 уникальных значениях ШИМ ... Так что это означает, что я могу использовать все 15 штифтов ?

Спасибо
Вы можете объяснить более подробно ...

victor_pv
Пт, 01 декабря 2017 г. 20:39
Есть 4 таймера с 4 каналами каждый.
Одиночная частота на таймер, но каждый канал может иметь другой рабочее цикл, как указал Стив, поэтому вы получаете до 16 различных поездок ШИМ, сгруппировано 4 на 4 на одной и той же частоте.

В другом потоке также есть код, чтобы выполнить SWM с помощью программного обеспечения в любом порту и в любом PIN -код. В этом случае частота одинакова для всех выводов, которые вы управляете одним и тем же кодом, но каждый может иметь другой работник. Вы можете использовать аппаратный ШИМ в некоторых булавках и программное ШИМ в других, если хотите.

Если вы хотите управлять несколькими светодиодами с одинаковой частотой и обязанностью ШИМ, я думаю, что было бы лучшей идеей использовать FET, это позволит гораздо более высокую нагрузку, чем MCU. Я вижу, вы уже планировали использовать FET.

Таким образом, ваше ограничение - это всего лишь 4 таймеры, каждый может иметь определенную частоту. 4 канала на таймер, каждый может иметь свой рабочий цикл.

Rogerclark
Пт, 01 декабря 2017 г., 8:50 вечера
Спасибо, ребята.

Я не заметил настройку канала, но не был уверен, что это позволило бы изменить рабочее цикл независимо.

Документы Leaflabs, кажется, довольно вводят в заблуждение, если можно изменить рабочий цикл на основе комбинации таймера и канала

Стэнлисеоу
Сб 02 декабря 2017 г. 8:17
Вот более подробная информация...

Я планирует управлять N-канальным логическим уровнем MOSFET с помощью PWM-контактов (программное обеспечение или аппаратное обеспечение) ...

Обычно для контроля яркости светодиода, на 2 уровнях ... говорит 30% яркости в некоторых булавках и 90% яркости в других булавках ...

Я не знал о программном платеже... Позвольте мне искать это и проверить это ...

Спасибо

victor_pv
Сб 02 декабря 2017 г. 14:29
Вы можете использовать все штифты PWM для того, что вы описали, так как вы не планируете иметь кучу разных частот, только обязанные циклы.
Каждая из 15 доступных контактов может иметь свой собственный рабочий цикл ШИМ в любой момент времени.
На них есть 16 контактов с каналами таймера, я просто догадываюсь, не глядя на схему, что 1 из них может быть невозможным, потому что у нее есть кнопка ввода или что -то в этом роде, вы дублехеруйте на случай, если вы все еще можете ее использовать.

Стэнлисеоу
Вт 05 декабря 2017 г. 9:45 утра
Спасибо ...
Я проверил его, и он работает на булавки PWM 15 с различным рабочим циклом ....

Я использую следующий MOSFET, IRLZ34N со следующими характеристиками для моего светодиодного светодиода PWM 12V DIMM/Glow
VGS (TH) - 1-2V,
RDS (ON) 35 МОм

Но когда он полностью включен в 3.3V, Analogwrite (xx, 255) или Digitalwrite (xx, высокий). Этот MOSFET должен был быть полностью открыт при 2V.

Я провел сравнение с использованием Arduino Uno 5V с аналогичным PWM/DigitalWrite (High), а светодиод находится в полной яркости при 12V

Я тестировал с другими MOSFET IRF530, VGS (TH) - 2-4V, яркость была еще хуже ...

Любой предлагаемый MOSFET я должен использовать ??

Стэнли

Стивестронг
Вт 05 декабря 2017 г. 9:48 утра
Вы измерили напряжение на выходных выводах для полной яркости?

Стэнлисеоу
Вторник 05 декабря 2017 г. 15:36
Хорошая идея, подключится к источнику питания в MOSFET и медленно увеличивает напряжение ...
[Отредактировано]

Я включаюсь в 3.1 В и выключите в 0.9v в соответствии с моими показаниями напряжения питания ..

Ходидас11
Сб 03 февраля 2018 12:17
Пожалуйста, обратитесь к таблицам данных обоих МОСФОВ. Я думаю, что вам нужно увеличить напряжение затвора для поворота, это можно наблюдать через ваш эксперимент. Поскольку Arduino Uno 5Voutput представляет собой импульсы 5 В от ШИМ и подается на ворота МОСФЕТА. Пока ваш STM32 работает в 3.3V, так что у вас есть импульсы GPIO на 3.3В.

Также в соответствии с теорией, если вы увеличиваете напряжение затвора, то внутреннее сопротивление MOSFET уменьшается, и ток протекает больше.

Пито
Сб 03 февраля 2018 г. 13:04
Вам нужны МОПЕТЫ С 1.0-1.Порог 5 В (называемый «Логический уровень» - вы должны дважды проверить VGS (TH) в таблице данных). Имейте в виду, что порог не является острым, это скорее колено (пороговое напряжение не означает, что MOSFET полностью »полностью», используя «Cull Thucker Tacke). Например, VGS (TH) BSS223PW (низкая мощность P-канала) обычно 0 является 0.9 В измерен при IDS = 1.5UA ток (таблица данных).
Кроме того, чтобы достичь высокой скорости переключения, вы должны управлять MOSFET с довольно более высоким пиковым током из -за емкости ворот и Миллера (на основе MOSFET Type 40PF - 15NF).
При использовании PWM через x каналы вы не используете AnalogWrite () - см., Например, ViewTopic.PHP?F = 19&t = 3037&начало = 10#p39347

Дэнниф
Солнце 11 февраля 2018 г. 12:47

Поскольку на HE F103C есть только 4 таймера, вы сможете вывести только 4 уникальных значения ШИМ
Сам чип гораздо более мощный, чем этот. У меня нет удобного таблица, но TIM1..5 EAGH имеет 4 канала. И другие с 1-2 каналами также. TIM6 и 7 Нет каналов.

Так что посмотрите на таблицу данных. Я не проверял код STM32arduino, но я представляю, что он поддерживает или может быть сделан для поддержки, все это.

Вольф
Пн 12 февраля 2018 г. 9:51
С тех пор, как я смотрел на STM32F4, я игнорировал этот форум. Но случается, что несколько недель назад я сделал именно то, что вы ищете.

Первоначально я создал несколько рождественских рыбных чаш, которые имели параллельные светодиодные струны, которые масштабировались вверх и вниз по яркости, контролируемой про-миними, есть шесть строк, каждая из которых контролируется одним из штифтов, способных к ШИМ.

Изображение

Ток каждой строки может подняться до ~ 150 мА, и поэтому управляющий про-минини-штифт пошел к воротам MOSFET (максимум 2N7000 200 мА или BS170 500 мА).

Естественно, я хотел перейти к большему количеству струн, и мне очень нравится STM32F103, так что это был очевидный следующий шаг, но со следующими соображениями:
1. Может 3.Сигнал 3V Эффективно контролирует MOSFET, а не сигнал Pro-Mini 5V?

2. Глядя на различные изображения, доступные в Интернете, есть некоторая несоответствия в отношении тех булавок STM32F103, которые способны ШИМ, и сколько на самом деле есть. Можем ли мы создать окончательный список?

3. Я предпочитаю программировать и отлаживать STMF103, используя сериал, но я отмечаю, что контакты A9 & A10 обозначены как штифты PWM для таймера 1. Могу ли я использовать сериал для программы и отладки, не теряя два штучка ШИМ?

Я рад сообщить, что через некоторое время расследование и экспериментирование ответы да, да, и, да,.

МОПЕТЫ работают довольно счастливо с 3.3V сигнал.

На STM32F103 есть четыре таймера, каждый из которых имеет четыре канала ШИМ, а также выпуску по умолчанию:
TIM1 PA8, PA9, PA10, PA11
TIM2 PA0, PA1, PA2, PA3
TIM3 PA6, PA7, PB0, PB1
TIM4 PB6, PB7, PB8, PB9

По сути, при каждом вызове частоты ШИМ (через регистр автозагрузки Preset и ARR и ARR) для его четырех каналов, а затем установите рабочий цикл для каждого канала. Пример позже.

Посмотрев на The STMCube Thingy, это показывает, что для таймера 1 контакты можно переназначить. Это отличная новость для A9 & A10, все, что нам нужно сделать, это выяснить, как это сделать в Arduino Ide. Посмотрев в таймер.H (благодаря парням здесь за предоставление этого) и сопоставить это с вариантами STMCube, к моему удивлению, первое, что я попробовал, работал. Очень повезло!

Булавки A9 & A10 может быть перенаправлен на PB14 & PB15 с использованием:
Timer1_base->Ccer | = timer_ccer_cc2ne | Timer_ccer_cc3ne

Вот моя тестовая настройка (очевидно, у меня есть светодиоды вместо светодиодных струн, но каждый контролируется MOSFET, который, в свою очередь, контролируется сигналом ШИМ из контакта STM32F103):

Изображение

Вы можете видеть, что серийный UART1 подключен через A9 & A10. Цвет кабеля соответствует таймеру Tim1 = синий, Tim2 = серый, Tim3 = желтый, Tim4 = белый.

Цвет светодиода указывает канал: красный = 1, желтый = 2, зеленый = 3, синий = 4.

(Примечание. В «производственной» среде у меня был бы раскрывающееся резистор 10 км между затвором и землей MOSFET, а также резистор ~ 470 Ом между затвором и штифтом STM32, оба здесь опущены. Первый удерживает светодиоды в течение небольшого периода времени, когда контакты плавают между включенной мощностью и началом MCU. Другое (лучшее) решение было бы иметь отдельные расходные материалы для STM32 и светодиодов, последний включается только после инициализированного STM. Резистор 470 Ом не нужен, если каждый работает счастливо, но в случае проблемы на конец MOSFET / LED он предотвращает любое нежелательное напряжение / ток, возвращающийся к STM.)

Код (примечание: когда я написал это, я был в буквальном смысле «возиться с таймерами», я не ожидал, что кто -то другой увидит его, и он был просто сбит вместе, чтобы проверить, что каждый из шестнадцати каналов может быть независимо контролироваться)::
struct pin_struct { uint8_t id; bool active; uint8_t timer; uint8_t channel; uint16_t intensity; int8_t increment; }; pin_struct pins[16]; void setup() { Serial.begin(115200); // PB10 TX, PB11 RX delay(500); TIMER1_BASE->PSC = 72; TIMER1_BASE->ARR = 1000; TIMER1_BASE->CCER |= TIMER_CCER_CC2NE | TIMER_CCER_CC3NE; TIMER2_BASE->PSC = 72; TIMER2_BASE->ARR = 2000; TIMER3_BASE->PSC = 72; TIMER3_BASE->ARR = 3000; TIMER4_BASE->PSC = 72; TIMER4_BASE->ARR = 4000; pins[0] = (pin_struct){PA8, true, 1, 1, 0, 1}; pins[1] = (pin_struct){PB14, true, 1, 2, 500, 1}; pins[2] = (pin_struct){PB15, true, 1, 3, 1000, -1}; pins[3] = (pin_struct){PA11, true, 1, 4, 500, -1}; pins[4] = (pin_struct){PA6, true, 3, 1, 0, 1}; pins[5] = (pin_struct){PA7, true, 3, 2, 1500, 1}; pins[6] = (pin_struct){PB0, true, 3, 3, 3000, -1}; pins[7] = (pin_struct){PB1, true, 3, 4, 1500, -1}; pins[8] = (pin_struct){PB6, true, 4, 1, 0, 1}; pins[9] = (pin_struct){PB7, true, 4, 2, 2000, 1}; pins[10] = (pin_struct){PB8, true, 4, 3, 4000, -1}; pins[11] = (pin_struct){PB9, true, 4, 4, 2000, -1}; pins[12] = (pin_struct){PA0, true, 2, 1, 0, 1}; pins[13] = (pin_struct){PA1, true, 2, 2, 1000, 1}; pins[14] = (pin_struct){PA2, true, 2, 3, 2000, -1}; pins[15] = (pin_struct){PA4, true, 2, 4, 1000, -1}; for (uint8_t i=0; i<16; i++) pinMode(pins[i].id, PWM); } void loop() { timer_gen_reg_map* timer_base; uint32_t limit; for (uint8_t i=0; i<16; i++) { if (pins[i].timer==1) { limit = TIMER1_BASE->ARR; } else { switch (pins[i].timer) { case 2: timer_base = TIMER2_BASE; break; case 3: timer_base = TIMER3_BASE; break; case 4: timer_base = TIMER4_BASE; break; } limit = timer_base->ARR; } pins[i].intensity += pins[i].increment; if (pins[i].intensity+pins[i].increment<0 || pins[i].intensity+pins[i].increment>limit) pins[i].increment = -pins[i].increment; if (pins[i].timer==1) { switch (pins[i].channel) { case 1: TIMER1_BASE->CCR1 = pins[i].intensity;; break; case 2: TIMER1_BASE->CCR2 = pins[i].intensity;; break; case 3: TIMER1_BASE->CCR3 = pins[i].intensity;; break; case 4: TIMER1_BASE->CCR4 = pins[i].intensity;; break; } } else { switch (pins[i].channel) { case 1: timer_base->CCR1 = pins[i].intensity;; break; case 2: timer_base->CCR2 = pins[i].intensity;; break; case 3: timer_base->CCR3 = pins[i].intensity;; break; case 4: timer_base->CCR4 = pins[i].intensity;; break; } } } delay(1); }