Все прочитали, вроде даже поняли, взяли паяльник - а нифига не получается? Скорее сюда! Поможем. Чем можем...
Ответить

Нелинейность ШИМ при управлении светодиодной лентой(Arduino)

Пт сен 25, 2020 17:42:43

Добрый день, коллеги.
Намедни собрал простейшую схему управления светодиодной лентой. В составе: Arduino, мосфет IRLZ24NPBF, резистор 20 Ом между микроконтроллером и затвором, резистор 10 кОм между затвором и стоком. Думаю, схема ни к чему, и так все понятно.

Заработало все с первой попытки, яркость ленты меняется при изменении коэффициента заполнения с помощью команды analogWrite, но есть две проблемы:
1. Слишком ступенчатое изменение яркости в начале диапазона;
2. Резкий переход между уровнем 254 и 255. Не могу понять, с чем связано это явление.

Хотелось бы избавиться от этих недостатков.

ШИМ 8 бит, частота около 15 кГц. Мосфет абсолютно холодный. Осциллографа, к сожалению, нет. Что посоветуете?

Re: Нелинейность ШИМ при управлении светодиодной лентой(Ardu

Пт сен 25, 2020 23:55:53

так и будет... глаз - штука логарифмическая и не видит что яркость меняется одинаковыми ступенями, но видит, что например при изменении ШИМА с 1/256 на 2/256 (=1/128) яркость ленты меняется сразу в 2 раза... а при изменении с 254/256 на 255/256 всего на доли процента...
как выход - или сделать меньше ступеней яркости и распределить их более-менее равномерно для глаза, или применить более высокоразрядный таймер, или делать програманый ШИМ с нелинейным шагом.

Re: Нелинейность ШИМ при управлении светодиодной лентой(Ardu

Сб сен 26, 2020 00:27:23

Избавиться от недостатков только повышением разрядности ШИМ.
А зачем резистор с затвора на сток? То есть в случае чего он будет постоянно открыт? Странно.

Re: Нелинейность ШИМ при управлении светодиодной лентой(Ardu

Сб сен 26, 2020 10:00:37

ШИМ 15кГц ??? Ну-ну...

Re: Нелинейность ШИМ при управлении светодиодной лентой(Ardu

Сб сен 26, 2020 10:44:50

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

Спасибо за советы.

Действительно, увеличил разрядность ШИМ до 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

16-разрядный ШИМ спокохонько на АВРке делается (полный комплект Т1).
Да еще и с раздельной регулировкой по минимум 4 каналам.
:wink:
Другое дело что использовать ВСЕ возможности в "линейном примитиве" не получится - надо подбирать хотя бы по зрительному восприятию разницу в стответствии яркости и заданного кода.
8)

Re: Нелинейность ШИМ при управлении светодиодной лентой(Ardu

Пн сен 28, 2020 10:49:24

15000/256=<60 будет мерцать, краем глаза будет видно.

Классно вы частоту на разрядность поделили. Как назовёте новую полученную величину? Герцбит? :music:

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

Не максимум. У 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-ти битный режим уже не сможет обеспечить приемлемую частоту, скорее всего.


А чем вы меняли разрядность ШИМ, если в ардуино оно тупо 8 бит всегда?
https://www.arduino.cc/reference/en/lan ... alogwrite/


Вы же сами двумя строками выше привели ссылку на библиотеку, которая позволяет это реализовать :) На самом деле, хитрости вообще никакой в этом не увидел - это всего лишь 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

Согласен, но на этот таймер, как я понял, завязаны функции времени из стандартной библиотеки, и манипуляции с его настройками приведут к некорректной работе этих функций. Для моих целей это не подходит.

Нет, вы ошибаетесь. Для функций времени используется Timer0. Timer1 будет использоваться только для ШИМ, если вы задействуете его на пине, который привязан к таймеру 1. Но если вы будете ШИМ использовать только через библиотеку TimerOne - никаких проблем не будет и вы получите нормальные функции нормального ШИМ с полной разрядностью до 16 бит .

Вы же сами двумя строками выше привели ссылку на библиотеку, которая позволяет это реализовать

О которой вы не знали. )

В интернете масса статей на эту тему, например: http://mypractic.ru/urok-37-shirotno-im ... duino.html

Статья - херня, потому что разрешение меняется, но при этом продолжает использоватсья стандартная analogWrite(), с ситуацией при установке там 255 вы уже сами напоролись и прям в 1ом комментарии там это написано.

Честно сказать, не силен в теоретической части, но практика говорит об обратном. Как я уже писал выше, в режиме 4 кГц писк из БП слышно отчетливо. Ради интереса я нашел в интернете генератор звукового сигнала заданной частоты, вбил туда 4 кГц, и услышал тот же звук, что из БП. При этом режим 15 кГц слышно только вплотную к БП, 31 кГц не слышно вообще по понятным причинам.

Я обсчитался и посчитал для 12 бит. А вот теорию всё-таки стоит знать. По писку определять частоту... ну так себе метод. Простая формула есть в ДШ. Частота МК / прескейлер * (1 + максимальное значение счета таймера). Минимальный прескейлер = 1. При 10 битах максимальный счет таймера - 1023. Итого делим 16000000 / 1024 = 15625 Гц частота ШИМ в этом случае. Но для LED ленты вам с головой хватит и куда меньшей частоты. Вы же не на дроссель подаете, а на полевик. Пищать будет нечему )

Re: Нелинейность ШИМ при управлении светодиодной лентой(Ardu

Вт сен 29, 2020 21:50:48

Но если вы будете ШИМ использовать только через библиотеку 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

Прочитал статью по ссылке - пока что не увидел для себя преимуществ в использовании библиотеки.

как я уже сказал, пока что не вижу преимуществ относительно установки режима работы таймера с помощью записи в регистры МК.

Еще раз - вы уже напоролись на проблемы 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

Еще раз - вы уже напоролись на проблемы analogWrite(255).

Еще раз - не вижу смысла тащить к себе чужой код, который по набору define'ов в конечном счете выставляет нужные значения регистров. Поведение на верхней границе диапазона восьмибитного ШИМ меня не расстраивает.

Чтобы настраивать периферию напрямую регистрами Ардуино, нужно хорошо понимать, что там в ардуино происходит. Не в самом МК, а именно ядре адруины. А вы пока это понимаете очень поверхностно.


Использование библиотеки этому явно не способствует.

Вообще-то в БП дроссель есть. Он и пищит.

Ну я в курсе. Это был ответ на ваши слова:
Вы же не на дроссель подаете, а на полевик. Пищать будет нечему )

Re: Нелинейность ШИМ при управлении светодиодной лентой(Ardu

Вт сен 29, 2020 23:50:37

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

Конструирование устройств и написание программ под ардуино весьма отличается от работы с "чистым МК".
Это надо воспринимать как ПРАВИЛО.
И соответственно использовать в каждом конкретном случае соответствующие инструменты.
Кто мешает топикстартеру самостоятельно сделать автономный кристалл-расширитель на основе "классической АВР(ПИК или MCS51)" под "чистым Си" и/или "чистым ассемблером" и прицепить его к адуринке каким-либо "стандартным протоколом" обмена?
Т.е. самостоятельно спроектированную из имеющегося в наличии арсенала СБИС расширения.
Я в принципе именно такой подход использую в том же КОТУИНКО (и экспериментах с адуринкой https://radiokot.ru/forum/viewtopic.php?f=62&t=156720)...
В системе ардуино (да и в классике МК) такой подход повсеместно применяется - только в виде уже готовых СБИС.
В то же время никакой разницы в тех СБИС и малых МК, спроектированных под конкретную задачу в совместном устройстве НЕТУ.
Разве что ПРИВЫЧКА к проектированию устройства на единственном МК с каждым годом все более засасывает.
8)

Re: Нелинейность ШИМ при управлении светодиодной лентой(Ardu

Ср окт 07, 2020 21:46:48

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


Подумал над этими словами... и перешел на использование библиотек TimerOne и TimerThree.

Глянул внимательнее - каналов то вообще 3. Только у таймера3 выведен только А, а остальные 2 на пины не выведены. Но вам надо 4 - вот они 4 и есть. 3 у таймера1 и 1 у таймера3.

Спасибо за наводку. После этих слов более гуглинг заиграл новыми красками. Действительно удалось использовать все три канала первого таймера.

Не понял. При чем здесь писк дросселя в БП и ваш пост, где вы собираетесь ШИМить mosfet + led?

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

PS: http://microsin.net/programming/avr/fas ... nardo.html


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

Спасибо за ответы.

Re: Нелинейность ШИМ при управлении светодиодной лентой(Ardu

Ср окт 07, 2020 22:46:50

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

Re: Нелинейность ШИМ при управлении светодиодной лентой(Ardu

Ср окт 07, 2020 23:20:25

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


Правильно я понимаю, что нужны электролиты на каждый из каналов ленты?

Re: Нелинейность ШИМ при управлении светодиодной лентой(Ardu

Чт окт 08, 2020 09:08:43

Электролит адекватной ёмкости - это как минимум. На каждую ленту или достаточно одного на все - не скажу, не видя схемы и монтажа. По-хорошему электролит ещё бы и керамикой зашунтировать, хватит, пожалуй, 1 мкФ.
Ответить