Страница 1 из 2
Нелинейность ШИМ при управлении светодиодной лентой(Arduino)
Добавлено: Пт сен 25, 2020 17:42:43
Morgen.Kot
Добрый день, коллеги.
Намедни собрал простейшую схему управления светодиодной лентой. В составе: Arduino, мосфет IRLZ24NPBF, резистор 20 Ом между микроконтроллером и затвором, резистор 10 кОм между затвором и стоком. Думаю, схема ни к чему, и так все понятно.
Заработало все с первой попытки, яркость ленты меняется при изменении коэффициента заполнения с помощью команды analogWrite, но есть две проблемы:
1. Слишком ступенчатое изменение яркости в начале диапазона;
2. Резкий переход между уровнем 254 и 255. Не могу понять, с чем связано это явление.
Хотелось бы избавиться от этих недостатков.
ШИМ 8 бит, частота около 15 кГц. Мосфет абсолютно холодный. Осциллографа, к сожалению, нет. Что посоветуете?
Re: Нелинейность ШИМ при управлении светодиодной лентой(Ardu
Добавлено: Пт сен 25, 2020 23:55:53
Ivanoff-iv
так и будет... глаз - штука логарифмическая и не видит что яркость меняется одинаковыми ступенями, но видит, что например при изменении ШИМА с 1/256 на 2/256 (=1/128) яркость ленты меняется сразу в 2 раза... а при изменении с 254/256 на 255/256 всего на доли процента...
как выход - или сделать меньше ступеней яркости и распределить их более-менее равномерно для глаза, или применить более высокоразрядный таймер, или делать програманый ШИМ с нелинейным шагом.
Re: Нелинейность ШИМ при управлении светодиодной лентой(Ardu
Добавлено: Сб сен 26, 2020 00:27:23
AndTer
Избавиться от недостатков только повышением разрядности ШИМ.
А зачем резистор с затвора на сток? То есть в случае чего он будет постоянно открыт? Странно.
Re: Нелинейность ШИМ при управлении светодиодной лентой(Ardu
Добавлено: Сб сен 26, 2020 10:00:37
Flasher
ШИМ 15кГц ??? Ну-ну...
Re: Нелинейность ШИМ при управлении светодиодной лентой(Ardu
Добавлено: Сб сен 26, 2020 10:44:50
AndTer
15000/256=<60 будет мерцать, краем глаза будет видно. Но на яркость это не влияет.
Кстати, какой режим ШИМа? Там можно и накосячить, он лишнее время будет светить и по тому ярче. Впрочем в корне ситуацию не изменит.
Re: Нелинейность ШИМ при управлении светодиодной лентой(Ardu
Добавлено: Сб сен 26, 2020 11:57:32
ПростоНуб
Morgen.Kot, 16-битный PWM нужен. Я именно по этой причине отказался от Arduino и сделал это на STM8S103F3, так как делалось для двух RGB лент и нужны были шесть PWM каналов.
Re: Нелинейность ШИМ при управлении светодиодной лентой(Ardu
Добавлено: Вс сен 27, 2020 23:32:01
Morgen.Kot
Спасибо за советы.
Действительно, увеличил разрядность ШИМ до 10-ти бит (максимум, что можно выжать с AVR), и стало заметно лучше.
Проблема резкого скачка от 254 к 255 была вот в чем:
1. Режим ШИМ на самом деле был 9 бит, а не 8 - я сначала сам запутался, а потом и вас ввел в заблуждение
2. Само по себе это обстоятельство могло бы ничего не означать, если бы не баг в стандартной библиотеке Arduino: при установке ШИМ = 255 она принудительно выдает на выход логическую единицу, при этом не важно, какая реально была установлена разрядность ШИМ, потому что стандартная библиотека ориентирована на ШИМ 8 бит.
Вот и получается, что сначала было заполнение 254/512, а потом сразу 512/512, отсюда и скачок.
А зачем резистор с затвора на сток? То есть в случае чего он будет постоянно открыт? Странно.
Опечатка. Между затвором и истоком, разумеется.
ШИМ 15кГц ??? Ну-ну...
Можно как-то пояснить свою мысль?
Morgen.Kot, 16-битный PWM нужен. Я именно по этой причине отказался от Arduino и сделал это на STM8S103F3, так как делалось для двух RGB лент и нужны были шесть PWM каналов.
Так у классической ардуины 7 PWM каналов же? А на меге и того больше... Другое дело что 16-ю битами там конечно не пахло, но и 10 не так уж плохо вроде.
Re: Нелинейность ШИМ при управлении светодиодной лентой(Ardu
Добавлено: Пн сен 28, 2020 10:23:21
BOB51
16-разрядный ШИМ спокохонько на АВРке делается (полный комплект Т1).
Да еще и с раздельной регулировкой по минимум 4 каналам.
Другое дело что использовать ВСЕ возможности в "линейном примитиве" не получится - надо подбирать хотя бы по зрительному восприятию разницу в стответствии яркости и заданного кода.

Re: Нелинейность ШИМ при управлении светодиодной лентой(Ardu
Добавлено: Пн сен 28, 2020 10:49:24
NStorm
[uquote="AndTer",url="/forum/viewtopic.php?p=3897950#p3897950"]15000/256=<60 будет мерцать, краем глаза будет видно.[/uquote]
Классно вы частоту на разрядность поделили. Как назовёте новую полученную величину? Герцбит?
Morgen.Kot писал(а):
Действительно, увеличил разрядность ШИМ до 10-ти бит (максимум, что можно выжать с AVR), и стало заметно лучше.
Не максимум. У atmega328p есть 16-битный Timer1, которым можно управлять и выдавать настоящий 16-битный ШИМ. Для ардуины есть библиотека даже:
http://robocraft.ru/blog/arduino/614.html
Но чем больше разрешение, тем соотв. меньше частота ШИМ.
Morgen.Kot писал(а):
Проблема резкого скачка от 254 к 255 была вот в чем:
1. Режим ШИМ на самом деле был 9 бит, а не 8 - я сначала сам запутался, а потом и вас ввел в заблуждение
2. Само по себе это обстоятельство могло бы ничего не означать, если бы не баг в стандартной библиотеке Arduino: при установке ШИМ = 255 она принудительно выдает на выход логическую единицу, при этом не важно, какая реально была установлена разрядность ШИМ, потому что стандартная библиотека ориентирована на ШИМ 8 бит.
А чем вы меняли разрядность ШИМ, если в ардуино оно тупо 8 бит всегда?
https://www.arduino.cc/reference/en/lan ... alogwrite/
Morgen.Kot писал(а):
Можно как-то пояснить свою мысль?
По той же ссылке выше видно, что стандартная частота ШИМ у ардуино меньше 1 кГц. Да и в 10-битном режиме, с тактовой в 16 МГц вы 3.9 кГц получите, а никак не 15.
Re: Нелинейность ШИМ при управлении светодиодной лентой(Ardu
Добавлено: Пн сен 28, 2020 12:43:12
Morgen.Kot
Не максимум. У atmega328p есть 16-битный Timer1, которым можно управлять и выдавать настоящий 16-битный ШИМ.
Согласен, но на этот таймер, как я понял, завязаны функции времени из стандартной библиотеки, и манипуляции с его настройками приведут к некорректной работе этих функций. Для моих целей это не подходит. Но в теории - да, есть. Не только в atmega328p, например, из документации к ATmega32u4 (на которой сделана моя Arduino Leonardo):
– Four PWM Channels with Programmable Resolution from 2 to 16 Bits
– Six PWM Channels for High Speed Operation, with Programmable Resolution from
2 to 11 Bits
Вот, оказывается, 10 бит - не максимум и в моем случае

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

На самом деле, хитрости вообще никакой в этом не увидел - это всего лишь 2 строчки кода в скетче. В интернете масса статей на эту тему, например:
http://mypractic.ru/urok-37-shirotno-im ... duino.html
Причем эти две строчки явно работают. Это видно визуально (частота, разрядность) и даже слышно - дроссели в БП пищат на частоте ШИМ. Разумеется, на 15 кГц их слышно только если поднести ухо к БП, зато 4 кГц слышно просто великолепно.
Да и в 10-битном режиме, с тактовой в 16 МГц вы 3.9 кГц получите, а никак не 15.
Честно сказать, не силен в теоретической части, но практика говорит об обратном. Как я уже писал выше, в режиме 4 кГц писк из БП слышно отчетливо. Ради интереса я нашел в интернете генератор звукового сигнала заданной частоты, вбил туда 4 кГц, и услышал тот же звук, что из БП. При этом режим 15 кГц слышно только вплотную к БП, 31 кГц не слышно вообще по понятным причинам.
Re: Нелинейность ШИМ при управлении светодиодной лентой(Ardu
Добавлено: Пн сен 28, 2020 13:28:21
NStorm
Согласен, но на этот таймер, как я понял, завязаны функции времени из стандартной библиотеки, и манипуляции с его настройками приведут к некорректной работе этих функций. Для моих целей это не подходит.
Нет, вы ошибаетесь. Для функций времени используется Timer0. Timer1 будет использоваться только для ШИМ, если вы задействуете его на пине, который привязан к таймеру 1. Но если вы будете ШИМ использовать только через библиотеку TimerOne - никаких проблем не будет и вы получите нормальные функции нормального ШИМ с полной разрядностью до 16 бит .
Вы же сами двумя строками выше привели ссылку на библиотеку, которая позволяет это реализовать
О которой вы не знали. )
Статья - херня, потому что разрешение меняется, но при этом продолжает использоватсья стандартная analogWrite(), с ситуацией при установке там 255 вы уже сами напоролись и прям в 1ом комментарии там это написано.
Честно сказать, не силен в теоретической части, но практика говорит об обратном. Как я уже писал выше, в режиме 4 кГц писк из БП слышно отчетливо. Ради интереса я нашел в интернете генератор звукового сигнала заданной частоты, вбил туда 4 кГц, и услышал тот же звук, что из БП. При этом режим 15 кГц слышно только вплотную к БП, 31 кГц не слышно вообще по понятным причинам.
Я обсчитался и посчитал для 12 бит. А вот теорию всё-таки стоит знать. По писку определять частоту... ну так себе метод. Простая формула есть в ДШ. Частота МК / прескейлер * (1 + максимальное значение счета таймера). Минимальный прескейлер = 1. При 10 битах максимальный счет таймера - 1023. Итого делим 16000000 / 1024 = 15625 Гц частота ШИМ в этом случае. Но для LED ленты вам с головой хватит и куда меньшей частоты. Вы же не на дроссель подаете, а на полевик. Пищать будет нечему )
Re: Нелинейность ШИМ при управлении светодиодной лентой(Ardu
Добавлено: Вт сен 29, 2020 21:50:48
Morgen.Kot
Но если вы будете ШИМ использовать только через библиотеку TimerOne - никаких проблем не будет и вы получите нормальные функции нормального ШИМ с полной разрядностью до 16 бит .
Прочитал статью по ссылке - пока что не увидел для себя преимуществ в использовании библиотеки.
О которой вы не знали. )
Это мой первый проект на ардуино, первое знакомство с микроконтроллером и полевыми транзисторами, так что нет ничего удивительного в том, что я чего-то не знал. Впрочем, найти подобную библиотеку я и не пытался - как я уже сказал, пока что не вижу преимуществ относительно установки режима работы таймера с помощью записи в регистры МК.
Статья - херня, потому что разрешение меняется, но при этом продолжает использоватсья стандартная analogWrite(), с ситуацией при установке там 255 вы уже сами напоролись и прям в 1ом комментарии там это написано.
Есть какие-то другие подводные камни analogWrite, ради которых стоит отказаться от использования стандартных функций? Я пока что с ними не столкнулся. Согласен, баг с 255 вводит в некоторое замешательство, но в конечном счете потеря одного уровня из 512 / 1024 - не критична.
В данный момент я использую Timer1 и Timer3 в режиме 10 бит и на частоте 15.625 кГц - меня это вполне устраивает. Проблема лишь в том, что, судя по той документации, что мне на данный момент удалось найти, эти два таймера обеспечивают 3 PWM канала, а мне нужно 4. В моем МК есть еще один Timer4 (Timer0 не рассматриваем - он 8-ми битный, и на него завязаны функции времени), разрядность которого меня устраивает, но на нем завязана работа с USB, и я пока не понял, как управлять его режимами работы, да и смогу ли я вообще сконфигурировать его таким образом, чтобы получить нужный ШИМ сигнал и сохранить живым USB порт.
Но для LED ленты вам с головой хватит и куда меньшей частоты. Вы же не на дроссель подаете, а на полевик. Пищать будет нечему )
И все же БП почему-то пищит при ШИМ на 4 кГц.
Re: Нелинейность ШИМ при управлении светодиодной лентой(Ardu
Добавлено: Вт сен 29, 2020 22:19:49
NStorm
Прочитал статью по ссылке - пока что не увидел для себя преимуществ в использовании библиотеки.
как я уже сказал, пока что не вижу преимуществ относительно установки режима работы таймера с помощью записи в регистры МК.
Еще раз - вы уже напоролись на проблемы analogWrite(255). Библиотека этого лишена, т.к. понимает разрядность ШИМ более 8-бит. Чтобы настраивать периферию напрямую регистрами Ардуино, нужно хорошо понимать, что там в ардуино происходит. Не в самом МК, а именно ядре адруины. А вы пока это понимаете очень поверхностно.
Согласен, баг с 255
Это не баг, а фича. Стандартная либа ардуино рассчитана на 8-битный ШИМ. А мин и макс значения - особый случай, когда ШИМ нужно не запускать, а просто выставить лог 0/1. Баг как раз таки скорее всего то, что выше 255 значения оно в принципе принимает, не генерит при этом ошибку и даже работает. С точки зрения логики ардуино именно это баг.
В данный момент я использую Timer1 и Timer3 в режиме 10 бит и на частоте 15.625 кГц - меня это вполне устраивает. Проблема лишь в том, что, судя по той документации, что мне на данный момент удалось найти, эти два таймера обеспечивают 3 PWM канала, а мне нужно 4. В моем МК есть еще один Timer4 (Timer0 не рассматриваем - он 8-ми битный, и на него завязаны функции времени), разрядность которого меня устраивает, но на нем завязана работа с USB, и я пока не понял, как управлять его режимами работы, да и смогу ли я вообще сконфигурировать его таким образом, чтобы получить нужный ШИМ сигнал и сохранить живым USB порт.
У Timer3 на 32u4 тоже 2 канала, он, судя по ДШ полностью идентичен Timer1. Раздел под них даже один и тот же Timer1/Timer3.
И все же БП почему-то пищит при ШИМ на 4 кГц.
Вообще-то в БП дроссель есть. Он и пищит.
Re: Нелинейность ШИМ при управлении светодиодной лентой(Ardu
Добавлено: Вт сен 29, 2020 22:32:31
Morgen.Kot
Еще раз - вы уже напоролись на проблемы analogWrite(255).
Еще раз - не вижу смысла тащить к себе чужой код, который по набору define'ов в конечном счете выставляет нужные значения регистров. Поведение на верхней границе диапазона восьмибитного ШИМ меня не расстраивает.
Чтобы настраивать периферию напрямую регистрами Ардуино, нужно хорошо понимать, что там в ардуино происходит. Не в самом МК, а именно ядре адруины. А вы пока это понимаете очень поверхностно.
Использование библиотеки этому явно не способствует.
Вообще-то в БП дроссель есть. Он и пищит.
Ну я в курсе. Это был ответ на ваши слова:
Вы же не на дроссель подаете, а на полевик. Пищать будет нечему )
Re: Нелинейность ШИМ при управлении светодиодной лентой(Ardu
Добавлено: Вт сен 29, 2020 23:50:37
NStorm
Morgen.Kot, вы уже используете "чужой код" и библиотеки - Arduino. Всё ядро ардуино тоже не из вакуума сделано. В т.ч. analogWrite() - одна из функций/методов библиотеки. То, что она в ядре, мало что меняет.
Лучше выбрать что-то одно - или писать полностью Arduino-way с использованием библиотек, по-возможности максимально избегая прямой записи в регистры. Или полностью избавьтесь от Arduino и пишите прямо для AVR. Бутлоадер можно оставить )
Добавлено after 9 minutes 17 seconds:
Re: Нелинейность ШИМ при управлении светодиодной лентой(Arduino)
У Timer3 на 32u4 тоже 2 канала, он, судя по ДШ полностью идентичен Timer1. Раздел под них даже один и тот же Timer1/Timer3.
Глянул внимательнее - каналов то вообще 3. Только у таймера3 выведен только А, а остальные 2 на пины не выведены. Но вам надо 4 - вот они 4 и есть. 3 у таймера1 и 1 у таймера3.
Добавлено after 1 minute 18 seconds:
Re: Нелинейность ШИМ при управлении светодиодной лентой(Arduino)
Ну я в курсе. Это был ответ на ваши слова:
Не понял. При чем здесь писк дросселя в БП и ваш пост, где вы собираетесь ШИМить mosfet + led?
Добавлено after 1 minute 44 seconds:
Re: Нелинейность ШИМ при управлении светодиодной лентой(Arduino)
PS:
http://microsin.net/programming/avr/fas ... nardo.html
Re: Нелинейность ШИМ при управлении светодиодной лентой(Ardu
Добавлено: Ср сен 30, 2020 07:50:39
BOB51
Конструирование устройств и написание программ под ардуино весьма отличается от работы с "чистым МК".
Это надо воспринимать как ПРАВИЛО.
И соответственно использовать в каждом конкретном случае соответствующие инструменты.
Кто мешает топикстартеру самостоятельно сделать автономный кристалл-расширитель на основе "классической АВР(ПИК или MCS51)" под "чистым Си" и/или "чистым ассемблером" и прицепить его к адуринке каким-либо "стандартным протоколом" обмена?
Т.е. самостоятельно спроектированную из имеющегося в наличии арсенала СБИС расширения.
Я в принципе именно такой подход использую в том же КОТУИНКО (и экспериментах с адуринкой
https://radiokot.ru/forum/viewtopic.php?f=62&t=156720)...
В системе ардуино (да и в классике МК) такой подход повсеместно применяется - только в виде уже готовых СБИС.
В то же время никакой разницы в тех СБИС и малых МК, спроектированных под конкретную задачу в совместном устройстве НЕТУ.
Разве что ПРИВЫЧКА к проектированию устройства на единственном МК с каждым годом все более засасывает.

Re: Нелинейность ШИМ при управлении светодиодной лентой(Ardu
Добавлено: Ср окт 07, 2020 21:46:48
Morgen.Kot
Лучше выбрать что-то одно - или писать полностью Arduino-way с использованием библиотек, по-возможности максимально избегая прямой записи в регистры.
Подумал над этими словами... и перешел на использование библиотек TimerOne и TimerThree.
Глянул внимательнее - каналов то вообще 3. Только у таймера3 выведен только А, а остальные 2 на пины не выведены. Но вам надо 4 - вот они 4 и есть. 3 у таймера1 и 1 у таймера3.
Спасибо за наводку. После этих слов более гуглинг заиграл новыми красками. Действительно удалось использовать все три канала первого таймера.
Не понял. При чем здесь писк дросселя в БП и ваш пост, где вы собираетесь ШИМить mosfet + led?
Говорил уже - при установке частоты ШИМ на мосфете начинают звучать компоненты блока питания на той же самой частоте. Природу этого явления я объяснить не берусь, но факт есть факт.
Статью эту видел, она действительно полезна для тех, кто хочет глубоко разобраться в железе. Но я для себя решил, что пока потребности в этом у меня нет, поэтому использование готового кода окажется разумным.
Спасибо за ответы.
Re: Нелинейность ШИМ при управлении светодиодной лентой(Ardu
Добавлено: Ср окт 07, 2020 22:46:50
mickbell
[uquote="Morgen.Kot",url="/forum/viewtopic.php?p=3903288#p3903288"]Говорил уже - при установке частоты ШИМ на мосфете начинают звучать компоненты блока питания на той же самой частоте. Природу этого явления я объяснить не берусь, но факт есть факт.[/uquote]Или отсутствует блокировочный конденсатор по питанию ленты, или его ёмкость недостаточна. Соответственно мощные импульсы потребляемого тока берутся прямо с блока питания, чего по-хорошему быть не должно.
Re: Нелинейность ШИМ при управлении светодиодной лентой(Ardu
Добавлено: Ср окт 07, 2020 23:20:25
Morgen.Kot
[uquote="mickbell",url="/forum/viewtopic.php?p=3903313#p3903313"][uquote="Morgen.Kot",url="/forum/viewtopic.php?p=3903288#p3903288"]Говорил уже - при установке частоты ШИМ на мосфете начинают звучать компоненты блока питания на той же самой частоте. Природу этого явления я объяснить не берусь, но факт есть факт.[/uquote]Или отсутствует блокировочный конденсатор по питанию ленты, или его ёмкость недостаточна. Соответственно мощные импульсы потребляемого тока берутся прямо с блока питания, чего по-хорошему быть не должно.[/uquote]
Правильно я понимаю, что нужны электролиты на каждый из каналов ленты?
Re: Нелинейность ШИМ при управлении светодиодной лентой(Ardu
Добавлено: Чт окт 08, 2020 09:08:43
mickbell
Электролит адекватной ёмкости - это как минимум. На каждую ленту или достаточно одного на все - не скажу, не видя схемы и монтажа. По-хорошему электролит ещё бы и керамикой зашунтировать, хватит, пожалуй, 1 мкФ.