РадиоКот :: Управление светодиодами WS2812B на микроконтроллерах серии EFM8BB5
Например TDA7294

РадиоКот >Статьи >

Теги статьи: Добавить тег

Управление светодиодами WS2812B на микроконтроллерах серии EFM8BB5

Автор: Сергей Безруков (aka Ser60)
Опубликовано 10.02.2022
Создано при помощи КотоРед.

Светодиодные ленты со встроенным контроллером WS2812(B) находят сегодня широкое применение в радиолюбительской практике и не только. Принцип управления каждым пикселем ленты сводится к посылке в него серии из 24 бит, содержащих код цвета, который состоит из полей R (красный), G (зелёный), и B (синий), по 8 бит на каждый цвет. Отсылка битов производится асинхронно по одной сигнальной линии, где каждый бит кодируется как показано ниже. Длительности T0H/T0L и T1H/T1L должны быть около 0.4/0.85 мкс и 0.8/0.45 мкс, соответственно [1], но могут и несколько отличаться в зависимости от производителя ленты. Таким образом, период обоих сигналов для отсылки 0 и 1 равен 1.25 мкс.

Известно несколько способов формирования нужной битовой последовательности. Исключая тривиальный способ формирования временных интервалов, основанный на непосредственном управлении выводами МК, широко применяется способ управления с помощью аппаратного драйвера SPI, имеющимся практически в любом МК (см., например, [2]). При этом для отсылки одного бита на WS2812 приходится посылать целый байт в драйвер. Этот подход приводит к большей чем следует занятости процессора. Лучше в этом плане обстоит дело в МК, содержащих аппаратный драйвер DMA (например, многие ARM), где управляющая последовательность генерируется путём изменения скважности ШИМ. Однако, для питания WS2812 требуется 5V, в то время как напряжение питания большинства (популярных) ARM микроконтроллеров не превосходит 3.6V, что приводит к необходимости вводить в схему LDO для питания ARM и согласователь логических уровней. Наверняка имеются и другие способы формирования битовых последовательностей.

Здесь я хочу обратить внимание читателей на оригинальный способ управления WS2812, пригодный для относительно новых МК серии PIC16, и подробно описанный, например в [3], [4]. В этих МК имеется по нескольку встроенных модулей конфигурируемой логики (CLC), позволяющих на аппаратном уровне сформировать необходимые сигналы с помощью SPI и генератора ШИМ. При этом для формирования последовательности из 8 бит для WS2812 требуется загрузить лишь один байт в блок SPI. Принцип формирования временных последовательностей показан на диаграмме ниже, заимствованной из [3], на примере отсылки байта 10011000 в WS2812.

Три верхние осциллограммы соответствуют сигналам SPI (работающего в режиме master) и ШИМ, соответственно. Ширина импульса SCK должна соответствовать T1H, а ширина импульса ШИМ должна быть равна T0H. Период обоих сигналов SCK и ШИМ должен быть 1.25 мкс, что соответствует частоте 800 КГц. Осциллограмма SCK & SDO представляет собой сформированные из последовательности SDO сигналы единиц в формате WS2812, а осциллограмма SCK & nSDO & PWM – сигналы нулей. Для получения окончательной последовательности, показанной на самой нижней осциллограмме, остаётся применить логическую операцию ИЛИ к указанным выше сигналам нулей и единиц. Важно отметить, что все логические операции производятся аппаратно внутри МК модулями CLC без участия процессора.

Для использования этой идеи на практике необходимо обеспечить синхронность во времени сигналов SCK и PWM. В МК серии PIC это легко достигается генерацией обоих сигналов от одного таймера. К сожалению, такого МК у меня нет, но подобные модули конфигурируемой логики имеются и в МК других производителей. Здесь будет рассказано как реализовать описанный принцип генерации сигналов на микроконтроллерах серии EFM8BB5 фирмы Silicon Labs. Эти МК, так же, как и PIC16, могут питаться непосредственно от 5V, что упрощает их согласование с WS2812. Однако, модули конфигурируемой логики в EFM8BB5х, так же, как и SPI и PWM, построены на несколько иных принципах, что делает невозможным реализацию указанного подхода в полной аналогии с PIC. Тем не менее, оказалось, что заимствованный у PIC подход реализуем на EFM8, что и составило предмет настоящей статьи.

Первой трудностью было получить синхронные сигналы SCK и PWM. В отличии от PIC, для формирования SCK модулем SPI в режиме master и PWM в МК серии EFM8BB5 используется только тактовая частота системы (SYSCLK). Это делает невозможным синхронизацию указанных сигналов, поскольку отсылка байта в модуль SPI (следовательно, начало генерации SCK) производится программно и асинхронно с PWM. Однако, в режиме SPI slave возможна генерация SCK от модуля конфигурируемой логики. Здесь мы подходим плотнее к рассмотрению одного мoдуля CLU (Configurable Logic Unit), которых в МК имеется целых 4.

Сердцем модуля CLUn (n=0,1,2,3) является таблица LUT, позволяющая реализовать любую логическую функцию от трёх переменных. В качестве переменных функции выступают сигналы от мультиплексоров A и B, а также выход модуля CLUn-1 (для модуля CLU0 используется выход модуля CLU3). Отмечу, что все упомянутые выше логические формулы зависят как раз от трёх или меньшего числа переменных. Асинхронный выход модуля можно направить на вывод корпуса, а выход синхронизированный с SYSCLK использовать для управления периферией. При этом, несмотря на наличие XBAR (Priority Crossbar Decoder), конфигурирующего назначение выходов периферии на выводы корпуса, выходы модулей CLUn не контролируются XBAR и их можно вывести только на 4 фиксированных пина корпуса (см. data-sheet). В нашем проекте из четырёх имеющихся модулей CLU используются лишь три (CLU0, CLU1, CLU3) и окончательный сигнал реализуется на выходе CLU1 (P0.5).

Формирование сигналов SCK и PWM у нас производится, соответственно, каналами PWM.0 (CH0X) и PWM.1 (CH1X) периферийного модуля PWM0. Сигналы этих модулей выведены через Crossbar на выводы корпуса P1.3 и P1.4. К сожалению, в этой модели МК невозможно реализовать все необходимые соединения периферийных модулей внутренним образом без использования выводов корпуса. Однако, выходной сигнал какого-либо модуля периферии с вывода корпуса можно непосредственно использовать в качестве входного для другого модуля. В результате, для данного приложения не требуется соединять какие-либо выводы корпуса вместе. Модуль CLU3 используется исключительно для генерации SCK для модуля SPI, работающего в режиме slave. Его выходной сигнал также выводится на вывод P1.5 для обработки модулем CLU1, но только если P0.4=1. Этим предотвращается генерация "лишних" импульсов в конце цикла связи с WS2812. Выводы SCK/SDI/SDO модуля SPI направлены на выводы P1.0/P1.1/P1.2, соответственно. На выходе CLU0 формируется сигнал SCK & nSDO & PWM, который через внутреннее соединение передаётся на модуль CLU1. Последний на своём выходе P0.5 реализует формирование сигнала SCK & SDO и логическое ИЛИ этого сигнала с сигналом SCK & nSDO & PWM от модуля CLU0. Ниже показана конфигурация входов мультиплексоров A и B модулей CLU. Входной сигнал CLU0.С соответствует выходу модуля CLU3, а CLU1.C – выходу модуля CLU0.

CLU0.A CLU0.B CLU0.C CLU1.A CLU1.B CLU1.C CLU3.A CLU3.B
P1.4 (PWM.1) P1.1 (SDO) CLU3 (SCK) P1.5 SCK) P1.1 (SDO) CLU0 P1.3 (PWM.0) P0.4

Логические таблицы выходных сигналов модулей CLU0 (SCK & nSDO & PWM), CLU1 ((SCK & SDO) || CLU0), и CLU3 выглядят следующим образом. Отмечу, что несмотря на внутренее соединение выхода CLU2 со входом CLU3, выходной сигнал последнего в данном случае не зависит от незадействованного модуля CLU2.

PWM SDO SCK CLU0 = SCK & nSDO & PWM
0 0 0 0
0
0
1
0
0
1
0
0
0
1
1
0
1
0
0
0
1
0
1
1
1
1
0
0
1
1
1
0

 

SCK SDO CLU0 CLU1 = (SCK & SDO) || CLU0
0 0 0 0
0 0 1 1
0 1 0 0
0 1 1 1
1 0 0 0
1 0 1 1
1 1 0 1
1 1 1 1

 

PWM.0 P0.4 CLU2 CLU3 = PWM.0 & P0.4
0 0 0 0
0 0 1 0
0 1 0 0
0 1 1 0
1 0 0 0
1 0 1 0
1 1 0 1
1 1 1 1

Соответственно, значения, загружаемые в регистры FNSEL этих модулей, равны 0х20, 0хЕА, и 0хC0 (читаемые в таблицах снизу вверх). Таким образом, получаем следующую картину использования выводов корпуса под внутренние нужды приложения. Поскольку в данном приложении от МК требовалась лишь генерация сигналов для WS2812, минимизация задействованных для этого выводов корпуса не производилась. Как отмечено в [3] и [4], вывод SPI/SDI можно использовать для одновременного ввода данных с внешнего устройства. В нашем случае, поскольку SPI используется в режиме slave, можно производить одновременную выдачу данных SPI на внешнее устройство через вывод SDO = P1.2.

Результат работы драйвера показан ниже на примере посылки в WS2812B трёх байтов цвета 0х89, 0х55, 0хАА (нижняя осциллограмма). Напомню, что поскольку модуль SPI работает в режиме slave, сигнал пересылаемых данных (верхняя осциллограмма) реализуется на выводе SDI. Генерация обоих сигналов ШИМ разрешается в программе только на время отсылки трёх байтов на WS2812.

Разработка программного обеспечения производилась на языке С в системе Silicon Labs Simplicity Studio v5 на демо-плате EFM8BB51 MCU Explorer Kit (BB51-EK2700A). Несмотря на то, что МК может питаться от 5V, на демо-плате он запитан через LDO с выходным напряжением 3.3V. Поэтому для согласования его с WS2812 при тестировании я применил буферный каскад на NC7WZ17P6. Полный файл проекта WS2812_BB51.sls и отдельно main.c находятся в приложении. Для загрузки и отладки кода МК задействован USB Debug Adapter фирмы.

Этот проект послужил основой для замены/дополнения штатной боковой подсветки под объективом оптического микроскопа Leica Zoom 2000 кольцом из 16 светодиодов. На следующих снимках показан проект в завершающей его стадии. Истинные цвета кольца сложно передать на фотографиях из-за засветки камеры. Отмечу лишь, что при установке цвета каждого светодиода 0xFF свет получается очень яркий и белый с незначительным оттенком желтизны. Синий светодиод в этой модели кольца ощутимо менее яркий, чем красный и зелёный, что явно видно на фото выше. Странная конструкция вокруг отверстия в нижней части платы сделана для установки платы на имеющимся выступе корпуса микроскопа вблизи его объектива. Плата крепится к корпусу винтом М2.5.

На плате помимо самого кольца установлен лишь МК в корпусе QFN20 с минимальной обвязкой и разъёмом для программирования, а также танталовый конденсатор ёмкостью 220 мкФ в цепи питания в соответствии с рекомендациями производителя кольца. Питание платы производится от телефонного зарядника на 5V и 1А, потребляемый ей ток при максимальной яркости всех светодиодов кольца около 650 мА. Светодиоды при работе нагреваются по моим оценкам градусов до 40. В качестве развития проекта следует подумать о введении в схему Bluetooth/WiFi модуля для оперативной регулировки яркости и цвета подсветки, или реализации световых эффектов при другом её применении.

 

Литература

1. Гирлянда на светодиодах WS.
2. Плейер световых эффектов.
3. Microchip AN1606.
4. Microchip AN1890.

 

 

 

 

 

 

 


Файлы:
Архив ZIP


Все вопросы в Форум.




Как вам эта статья?

Заработало ли это устройство у вас?

13 3 0