При управлении светодиодом с широтно-импульсной модуляцией яркость (как я ее понимаю) не зависит линейно от коэффициента заполнения. Яркость медленно увеличивается, а затем экспоненциально увеличивается с коэффициентом заполнения.
Может ли кто-нибудь предложить практическое правило для использования в качестве поправочного коэффициента или другого обходного пути?
Ответы:
Для 16 уровней легко составить простую справочную таблицу «вручную» и преобразовать 4-битное значение в 8-битное значение для передачи в ШИМ-контроллер: это компонент, который я использовал в своем драйвере светодиодного массива FPGA. Для 8-битного контроллера уровня вам понадобится как минимум 11-12 битный вывод из справочной таблицы.
источник
1
Теоретически это должно быть экспоненциально, но я получил лучшие результаты для затухания с помощью квадратичной функции.
Я также думаю, что вы получили это задом наперед. При малом рабочем цикле воспринимаемое увеличение яркости намного больше, чем при почти полном рабочем цикле, где увеличение яркости практически не заметно.
источник
В течение последних нескольких дней я изучал эту тему, поскольку у меня возникла та же проблема: я пытался затемнить светодиоды с помощью ШИМ с видимой линейностью, но мне нужно полное разрешение 256 шагов. Попытка угадать 256 чисел для создания кривой вручную - задача не из легких!
Я не эксперт по математике, но я знаю достаточно, чтобы генерировать некоторые базовые кривые, комбинируя несколько функций и формул, не зная, как они работают. Я обнаружил, что с помощью электронной таблицы (я использовал Excel) вы можете поиграть с набором чисел от 0 до 255, поместить несколько формул в следующую ячейку и построить их график.
Я использую pic на ассемблере для замирания, поэтому вы даже можете получить электронную таблицу для генерации кода на ассемблере с формулой (
="retlw 0x" & DEC2HEX(A2)
). Это позволяет очень быстро и легко опробовать новую кривую.Немного поиграв с функциями LOG и SIN, усреднением двух и несколькими другими вещами, я не смог получить правильную кривую. Происходит то, что средняя часть замирания происходила медленнее, чем нижний и верхний уровни. Кроме того, если сразу за постепенным исчезновением следует постепенное уменьшение, то наблюдается резкий заметный всплеск интенсивности. Что нужно (на мой взгляд) это S-образная кривая.
При быстром поиске в Википедии была найдена формула, необходимая для кривой S. Я включил это в свою электронную таблицу и сделал несколько корректировок, чтобы он умножился на мой диапазон значений, и придумал следующее:
Я проверил его на своей установке, и он работал прекрасно.
Формула Excel, которую я использовал, была такой:
где A2 - первое значение в столбце A, которое увеличивает A3, A4, ..., A256 для каждого значения.
Я понятия не имею, математически правильно это или нет, но это дает желаемые результаты.
Вот полный набор из 256 уровней, которые я использовал:
источник
Я нашел этого парня, который использует метод, который он называет «Anti-Log Drive». Вот прямая ссылка на его информацию.
источник
Я использовал ATtiny для освещения своей колоды. Яркость контролируется с помощью кюветы, подключенной к выводу АЦП.
Испытанная экспоненциальная функция и ШИМ-выход, основанный на этом, дают линейное увеличение воспринимаемой яркости.
Я использовал эту формулу:
Attiny85 @ 8MHz потребовалось около 210us для выполнения вышеуказанного расчета. Для повышения производительности сделана справочная таблица. Поскольку вход был из 10-битного АЦП и объем памяти ATtiny ограничен, я хотел также создать более короткую таблицу.
Вместо создания таблицы поиска с 1024 записями была создана таблица обратного просмотра с 256 записями (512 байтов) в памяти программ (PGMEM). Была написана функция для выполнения бинарного поиска по этой таблице. Этот метод занимает всего 28 мкс для каждого поиска. Если я использую таблицу прямого просмотра, это потребует 2 КБ памяти, но поиск займет всего 4 мкс или около того.
Вычисленные значения в справочной таблице используют только диапазон ввода 32-991, исключая нижний / верхний диапазон АЦП, в случае возникновения проблем со схемой.
Ниже то, что у меня есть сейчас.
источник
This PDF explains the curve needed, apparently a logarithmic one. If you have a linear dimmer (your PWM value) then the function should be logarithmic.
Here you can find a lookup table for 32 steps of brightness for 8 bit PWM.
Here for 16 steps.
источник
Here is what I have done based on that arduino forum response. I have computed the values from 0 to 255 so it's easy to use with pwm on arduino
Then to use on Arduino just do like that :
Hope it is helpfull for some people ;)
источник
I'm dealing with this now, and I'm taking a slightly different approach. I want 256 levels of brightness, but mapping a linear 0-255 range to a non-linear 0-255 range winds up, as you can see in some of the other answers, with a lot of duplicate entries. (I.e., several of your input values result in the same brightness level.)
I tried modifying the algorithm to map a 0-256 input range to a 0-1023 output range, but even that had several values mapping to 0. So I'm trying something a bit different - I'm using the 0-255 level to generate non-linear values in the range 0-769 (that's 1023 minus 255) using
sin()
, then add that to the input level to get an output in the range 0-1023 with no duplicates. I'll configure a timer to use a counter of 1023, and set the comparator for the PWM output to values from the lookup table based on what lighting level I want (0-255).Here's the C program I used to generate my lookup table:
And here's the table:
I'll probably investigate other functions (like
log()
) once I've got this up and running.источник
For me this law seem to work pretty good: http://www.pyroelectro.com/tutorials/fading_led_pwm/theory2.html
источник