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

Все прочитали, вроде даже поняли, взяли паяльник - а нифига не получается? Скорее сюда! Поможем. Чем можем...
Morgen.Kot
Родился
Сообщения: 8
Зарегистрирован: Пт сен 25, 2020 17:33:33

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

Сообщение Morgen.Kot »

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

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

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

ШИМ 8 бит, частота около 15 кГц. Мосфет абсолютно холодный. Осциллографа, к сожалению, нет. Что посоветуете?
Реклама
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

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

Сообщение Ivanoff-iv »

так и будет... глаз - штука логарифмическая и не видит что яркость меняется одинаковыми ступенями, но видит, что например при изменении ШИМА с 1/256 на 2/256 (=1/128) яркость ленты меняется сразу в 2 раза... а при изменении с 254/256 на 255/256 всего на доли процента...
как выход - или сделать меньше ступеней яркости и распределить их более-менее равномерно для глаза, или применить более высокоразрядный таймер, или делать програманый ШИМ с нелинейным шагом.
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Реклама
Аватара пользователя
AndTer
Поставщик валерьянки для Кота
Сообщения: 2406
Зарегистрирован: Ср фев 23, 2011 12:12:31

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

Сообщение AndTer »

Избавиться от недостатков только повышением разрядности ШИМ.
А зачем резистор с затвора на сток? То есть в случае чего он будет постоянно открыт? Странно.
Глупый не задает вопросы. Глупый и так все знает.
Аватара пользователя
Flasher
Мудрый кот
Сообщения: 1802
Зарегистрирован: Ср сен 07, 2011 21:40:30

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

Сообщение Flasher »

ШИМ 15кГц ??? Ну-ну...
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
AndTer
Поставщик валерьянки для Кота
Сообщения: 2406
Зарегистрирован: Ср фев 23, 2011 12:12:31

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

Сообщение AndTer »

15000/256=<60 будет мерцать, краем глаза будет видно. Но на яркость это не влияет.
Кстати, какой режим ШИМа? Там можно и накосячить, он лишнее время будет светить и по тому ярче. Впрочем в корне ситуацию не изменит.
Глупый не задает вопросы. Глупый и так все знает.
Реклама
Аватара пользователя
ПростоНуб
Собутыльник Кота
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

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

Сообщение ПростоНуб »

Morgen.Kot, 16-битный PWM нужен. Я именно по этой причине отказался от Arduino и сделал это на STM8S103F3, так как делалось для двух RGB лент и нужны были шесть PWM каналов.
Реклама
Morgen.Kot
Родился
Сообщения: 8
Зарегистрирован: Пт сен 25, 2020 17:33:33

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

Сообщение 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 не так уж плохо вроде.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15581
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

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

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

Сообщение NStorm »

[uquote="AndTer",url="/forum/viewtopic.php?p=3897950#p3897950"]15000/256=<60 будет мерцать, краем глаза будет видно.[/uquote]
Классно вы частоту на разрядность поделили. Как назовёте новую полученную величину? Герцбит? :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.
Morgen.Kot
Родился
Сообщения: 8
Зарегистрирован: Пт сен 25, 2020 17:33:33

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

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

А чем вы меняли разрядность ШИМ, если в ардуино оно тупо 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 кГц не слышно вообще по понятным причинам.
NStorm
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

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

Сообщение NStorm »

Согласен, но на этот таймер, как я понял, завязаны функции времени из стандартной библиотеки, и манипуляции с его настройками приведут к некорректной работе этих функций. Для моих целей это не подходит.
Нет, вы ошибаетесь. Для функций времени используется 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 ленты вам с головой хватит и куда меньшей частоты. Вы же не на дроссель подаете, а на полевик. Пищать будет нечему )
Morgen.Kot
Родился
Сообщения: 8
Зарегистрирован: Пт сен 25, 2020 17:33:33

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

Сообщение 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 кГц.
NStorm
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

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

Сообщение 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 кГц.
Вообще-то в БП дроссель есть. Он и пищит.
Morgen.Kot
Родился
Сообщения: 8
Зарегистрирован: Пт сен 25, 2020 17:33:33

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

Сообщение Morgen.Kot »

Еще раз - вы уже напоролись на проблемы analogWrite(255).
Еще раз - не вижу смысла тащить к себе чужой код, который по набору define'ов в конечном счете выставляет нужные значения регистров. Поведение на верхней границе диапазона восьмибитного ШИМ меня не расстраивает.
Чтобы настраивать периферию напрямую регистрами Ардуино, нужно хорошо понимать, что там в ардуино происходит. Не в самом МК, а именно ядре адруины. А вы пока это понимаете очень поверхностно.
Использование библиотеки этому явно не способствует.
Вообще-то в БП дроссель есть. Он и пищит.
Ну я в курсе. Это был ответ на ваши слова:
Вы же не на дроссель подаете, а на полевик. Пищать будет нечему )
NStorm
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

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

Сообщение 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
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15581
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

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

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

Сообщение Morgen.Kot »

Лучше выбрать что-то одно - или писать полностью Arduino-way с использованием библиотек, по-возможности максимально избегая прямой записи в регистры.
Подумал над этими словами... и перешел на использование библиотек TimerOne и TimerThree.
Глянул внимательнее - каналов то вообще 3. Только у таймера3 выведен только А, а остальные 2 на пины не выведены. Но вам надо 4 - вот они 4 и есть. 3 у таймера1 и 1 у таймера3.
Спасибо за наводку. После этих слов более гуглинг заиграл новыми красками. Действительно удалось использовать все три канала первого таймера.
Не понял. При чем здесь писк дросселя в БП и ваш пост, где вы собираетесь ШИМить mosfet + led?
Говорил уже - при установке частоты ШИМ на мосфете начинают звучать компоненты блока питания на той же самой частоте. Природу этого явления я объяснить не берусь, но факт есть факт.
Статью эту видел, она действительно полезна для тех, кто хочет глубоко разобраться в железе. Но я для себя решил, что пока потребности в этом у меня нет, поэтому использование готового кода окажется разумным.

Спасибо за ответы.
Аватара пользователя
mickbell
Друг Кота
Сообщения: 16507
Зарегистрирован: Пт мар 30, 2012 05:17:29
Откуда: Екатеринбург

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

Сообщение mickbell »

[uquote="Morgen.Kot",url="/forum/viewtopic.php?p=3903288#p3903288"]Говорил уже - при установке частоты ШИМ на мосфете начинают звучать компоненты блока питания на той же самой частоте. Природу этого явления я объяснить не берусь, но факт есть факт.[/uquote]Или отсутствует блокировочный конденсатор по питанию ленты, или его ёмкость недостаточна. Соответственно мощные импульсы потребляемого тока берутся прямо с блока питания, чего по-хорошему быть не должно.
И хрюкотали зелюки,
Как мюмзики в мове.

На каждый РКН
Найдётся VPN.
Morgen.Kot
Родился
Сообщения: 8
Зарегистрирован: Пт сен 25, 2020 17:33:33

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

Сообщение Morgen.Kot »

[uquote="mickbell",url="/forum/viewtopic.php?p=3903313#p3903313"][uquote="Morgen.Kot",url="/forum/viewtopic.php?p=3903288#p3903288"]Говорил уже - при установке частоты ШИМ на мосфете начинают звучать компоненты блока питания на той же самой частоте. Природу этого явления я объяснить не берусь, но факт есть факт.[/uquote]Или отсутствует блокировочный конденсатор по питанию ленты, или его ёмкость недостаточна. Соответственно мощные импульсы потребляемого тока берутся прямо с блока питания, чего по-хорошему быть не должно.[/uquote]

Правильно я понимаю, что нужны электролиты на каждый из каналов ленты?
Аватара пользователя
mickbell
Друг Кота
Сообщения: 16507
Зарегистрирован: Пт мар 30, 2012 05:17:29
Откуда: Екатеринбург

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

Сообщение mickbell »

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

На каждый РКН
Найдётся VPN.
Ответить

Вернуться в «Практика»