Краткие сведения по WS2813
Светодиоды с пиксельной адресацией WS2813 выпускаются в стандартном корпусе 5050 размером 5 × 5 мм для поверхностного монтажа (Рис.1). Под линзой внутри корпуса располагаются зелёный, синий, красный светодиоды и управляющий контроллер. Для защиты от пульсаций напряжения питания в корпус установлен RC-фильтр.
Рис.1 Структура WS2813 под микроскопом
Светодиоды WS2813 могут быть объединены в последовательную цепочку с возможностью управлять каждым светодиодом в цепочке по отдельности. Цвет, который будет отображать WS2813 задаётся цифровым кодом, который передаётся по однопроводной шине данных.
WS2813 функционирует следующим образом (рис. 2): вывод DIN принимает данные от управляющего микроконтроллера, при этом первый чип в последовательной цепи забирает первые 24 бита данных и передаёт их во внутренний регистр — защёлку. Последующие сигналы данных проходят через встроенный узел восстановления и усиления и передаются следующему в цепочке чипу через вывод DO. После прохождения каждого чипа количество бит в общем потоке данных уменьшается каждый раз на 24 бита.
У WS2813 имеется также вывод BIN, который подключается параллельно входу предыдущего светодиода таким образом, что если один WS2813 выходит из строя, то цепочка за ним продолжает работать. Вывод NC не используется.
Рис.2 Схема соединения WS2813 в последовательную цепь
Для передачи данных к контроллерам светодиодов применяется однопроводной интерфейс. Биты кодируются длительностью передаваемого импульса. Передача лог. 0 должна осуществляться импульсом длительностью 375±75 нс, а единицы 875±125 нс.
Сигналом сброса и началом нового цикла обновления данных считается наличие низкого уровня на линии в течение 300 мкс. После прихода этого сигнала, контроллер светодиода WS2813 начинает на частоте 2 кГц ШИМ-управление встроенными светодиодами в соответствии с полученным кодом: Коэффициент заполнения =1, когда код цвета равен 255 и равен нулю при нулевом коде.
Пример кода для микроконтроллера Attiny85
Провод по которому будет осуществляться передача данных подключим к выводу PB1 микроконтроллера, который должен тактироваться от внешнего кварца на 8 МГц. Во фьюз-битах микроконтроллера необходимо отключить деление частоты на «8» (CKDIV8=0) и включить тактирование от внешнего кварца на 8 МГц. Для формирования импульса длительностью 375 нс невозможно использовать таймер счетчик, поэтому была использована ассемблеровская команда asm(«nop») — «холостой ход» процессора:
//Отправка бита ЛОГ.0 контроллеру светодиода
void Send_bit_0(void)
{
PORTB|=(1<<1);
asm(«nop»);
PORTB&=~(1<<1);
asm(«nop»); }
//Отправка бита ЛОГ.1 контроллеру светодиода
void Send_bit_1(void)
{
PORTB|=(1<<1);
for (i=0;i<2;i++)asm(«nop»);
PORTB&=~(1<<1);
asm(«nop»);
}
Результат работы кода можно наблюдать на осциллограмме логического анализатора, приведенной на рис.3
Рис.3 Результат измерения длительности импульсов кодирования ЛОГ.0 и ЛОГ.1 с помощью логического анализатора
Для того, чтобы WS2813 стал отображать заданный оттенок цвета, его контроллеру следует отправить 24 бита данных. Первые 8 бит кодируют оттенок зеленого цвета, вторые -красного, третьи — синего. Для удобства, в функции Send_Byte оттенки для последующей отправки принимаются в последовательности RGB:
//Отправить оттенок цвета
void Send_Byte(unsigned char redshade, unsigned char greenshade, unsigned char blueshade)
{
signed char i;
for(i=7;i>=0;i—)
{
if(greenshade&(1<<i))Send_bit_1();
else Send_bit_0(); }
for(i=7;i>=0;i—)
{
if(redshade&(1<<i))Send_bit_1();
else Send_bit_0();
}
for(i=7;i>=0;i—)
{
if(blueshade&(1<<i))Send_bit_1();
else Send_bit_0();
}
}
Результат работы кода можно наблюдать на осциллограмме логического анализатора, приведенной на рис.4
Рис.4 Осциллограмма 24 бит данных, предназначенных одному контроллеру светодиода WS2813, полученная с помощью логического анализатора.
Семь основных цветов, а также белый цвет определяются в начале программы:
//Определения цветов
#define red 1
#define orange 2
#define yellow 3
#define green 4
#define cyan 5
#define blue 6
#define purple 7
#define white 8
#define none 9
Для отображения цветов используется следующая функция:
//Отправить цвет
void Send_color(unsigned char c)
{
switch(c)
{
case 1: Send_Byte(0x2F,0x00,0x00);break;//Красный
case 2: Send_Byte(0x2F,0x1E,0x00);break;//Оранжевый
case 3: Send_Byte(0x2F,0x2F,0x00);break;//Желтый
case 4: Send_Byte(0x00,0x2F,0x00);break;//Зеленый
case 5: Send_Byte(0x00,0x2F,0x2F);break;//Голубой
case 6: Send_Byte(0x00,0x00,0x0F);break;//Синий
case 7: Send_Byte(0x2F,0x00,0x2F);break;//Фиолетовый
case 8: Send_Byte(0x2F,0x2F,0x2F);break;//Белый
case 9: Send_Byte(0x00,0x00,0x00);break;//Нет цвета (погасить) }
}
Здесь яркость светодиодов выставлена приблизительно на 1/5 от максимальной величины (0x2F/0xFF).
Функция для работы с пятью светодиодами WS2813 будет выглядеть следующим образом:
//Отправить 5 цветов
void Serial_5_colors(char c1, char c2, char c3, char c4, char c5)
{
Send_color(c1);
Send_color(c2);
Send_color(c3);
Send_color(c4);
Send_color(c5);
}
Ниже представлен пример функции, реализующей простую анимацию в цепочке из пяти WS2813:
//Анимация сдвиг
void shift_green(void)
{
Serial_5_colors(white, white, white, white, white);
_delay_ms(100);
Serial_5_colors(green, white, white, white, white);
_delay_ms(100);
Serial_5_colors(white, green, white, white, white);
_delay_ms(100);
Serial_5_colors(white, white, green, white, white);
_delay_ms(100);
Serial_5_colors(white, white, white, green, white);
_delay_ms(100);
Serial_5_colors(white, white, white, white, green);
_delay_ms(100);
Serial_5_colors(white, white, white, white, white);
_delay_ms(100);
}
Рис.5 Пять пакетов данных по 24 бита, предназначенных для пяти WS2813 на логическом анализаторе.
Список радиоэлементовОбозначение
Тип
Номинал
Количество
ПримечаниеМагазинМой блокнот
СветодиодWS281315
МК AVR 8-битATtiny851
Кварцевый резонатор8 МГц1
Конденсатор керамический22 пФ2
Добавить все
Скачать список элементов (PDF)
Прикрепленные файлы:
- WS2813.c (10 Кб)
1 comment on “Управление светодиодами WS2813 с адресацией с помощью ATtiny”
А для Atmega328 этот код подойдет?