Для переписывания Arduino-библиотеки под сабж на STM32 разбираюсь с ней. Открыл совершенно новую для себя вещь
Матрица не имеет встроенного управления яркостью. Фактически она получает в несколько проходов битовые массивы вкл/выкл для каждого светодиода. 2048 светодиодов в 16 блоков, по 128 значений в каждом. Как передаётся конкретное значение — пока не разбирался. Интересное не в этом
Регулировка яркости осуществляется через PWM (ШИМ). Но 2048 светодиодов рулить через ШИМ/PWM — это ж сколько ресурсов нужно!
Так вот, в библиотеке матрицы используют некую модификацию PWM — Binary Code Modulation:
Page 1/5 of the "LED dimming using Binary Code Modulation" article. This page introduces the "LED Binary Code Modulation" article. It introduces the fact that a rapidly blinking LED will appear dimmed to the eye. It also introduces the term "Duty Cycle"..
// www.batsocks.co.uk
На пальцах всё понятно. Вместо того, чтобы, как в PWM выставлять 1, ждать период скважинности, выставлять 0 и ждать полный период мину период скважинности, мы выставляем значение бинарного бита с выводимого уровня и ждём время, пропорциональное значению этого бита:
Для 4-х битного числа 0b1101 = 0xD = 13 (и, соответственно, скважинность 13/15):
При высокой частоте повторения это ничем для глаза не отличается от PWN с линейной скважинностью, но заявляется, что так нагрузка на процессор не зависит от числа каналов.
То есть, у PWM нагрузка на процессор:
- Не зависит от разрешения
- Зависит от числа каналов
У BCM:
- Не зависит от числа каналов
- Зависит от разрешения
Практика показывает, что Arduino отлично справляется. У матрицы 64x32 и 2048 светодиодов максимальная частота обновления где-то на уровне 100Гц.
Но почему получается независимость от числа каналов я пока не понимаю
![:) :)](//s.wrk.ru/s/smile.gif)
В моём представлении всё равно задержка на каждый канал же должна рассчитываться индивидуально. Что-то я недопонимаю...
Ещё ссылки по этому методу (на русском — нет)
Pulse Width Modulation is definitely the preferred method of dimming an LED with a microcontroller, but we were interested in hearing about a different method called Binary Code Modulation. BCM do...
// hackaday.com
So in this article we’re extending the previous example where we learned how to drive 16 LEDs using three pins of the Arduino.
// medium.com
Having seen great success with my Larson Scanner I wanted to look around and see if there was room for improvement. I want to make it expandable and I knew I needed to work on the timing to get eno...
// jumptuck.com
… чтобы понять рекурсию, нужно сперва понять рекурсию …
![4](/_bors/images/browsers/opera.gif)