Регистрация | Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: ivan_fd  
Форум Picbasic.ru » Программирование МК » PicBasicPro » Программирование WS2811 в PicBasic PRO
Программирование WS2811 в PicBasic PRO
Меджикивис Дата: Вс, 30.09.2018, 11:11  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Новенький
Сообщений: 14
Репутация: 0   ±
Замечания:   ±
На сайте с 11.04.2016

Статус: Offline

WS2811 - это 8-битный ШИМ, предназначенный для управления светодиодами. Выходы этой микросхемы "открытый коллектор", выдерживают до +12V, хотя сама микросхема 5-вольтовая. Ток выхода в импульсе стабилизирован на отметке 18мА, так что можно непосредственно подключать светодиод между плюсом и выходом.
Таким образом, когда выход открывается к нулю, светодиод зажигается. Частота ШИМ - 2 кГц.
Микросхема имеет три канала: для красного, зеленого и синего светодиодов.
По цене одна из самых дешевых (если не самая абсолютно). И всё бы хорошо, но вход у нее довольно странноватый: принимает она данные по одному проводу в коде NRZ. Меня это несколько напрягало, я предпочел бы нормальный SPI, но всё оказалось довольно нетрудно.
Если кратко, то биты передаются последовательно, начиная со старшего. Нулевой бит передается положительным импульсом, длительностью 250 нС, а единичный - длительностью 600 нС. Пауза между ними должна быть не меньше 1 мкС и не больше 50 мкС.
Подпрограмма управления на PBP получилась прям до неприличия простой. Она даже много короче, чем стандартная команда работы с SPI. Условие только одно: МК должен работать на скорости 16 МГц, - тогда все нужные времена сходятся.

Ниже привожу код программы-примера на PBP для PIC16F84A.

Код
DEFINE OSC 16 'частота 16МГц

'объявление переменных

  WS2811  VAR    PORTB.7    'линия, на которой WS2811
  i       VAR    byte
  tmp1    VAR    byte
  tmp2    VAR    byte

' инициализация порта
TRISB = 0 'PORTB - выходы 

'       однократная запись в канал B:
GOSUB WRITE2811 '0 в канал R
GOSUB WRITE2811 '0 в канал G
tmp2 = 128
GOSUB WRITE2811 '128 в канал B

maincycle:

FOR i=0 TO 255

'управление каналами R и G:

  'канал R
  tmp2 = SIN(i) + 128
  GOSUB WRITE2811
  'канал G
  tmp2 = i
  GOSUB WRITE2811

  PAUSE 3

NEXT i

GOTO maincycle

'===================================
'      ***  ПОДПРОГРАММА  ***
'===================================
'
WRITE2811:
'Запись в WS2811, ­  16МГц
'tmp2 - входной байт.
'Длительность выполнения постоянна.
  FOR tmp1=0 TO 7
    WS2811 = tmp2.7
    WS2811 = 1
    WS2811 = 0
    tmp2 = tmp2 << 1
  NEXT tmp1
Return

End


Вход WS2811 подключен к ножке PB7. (Почему именно к ней? - да так разводка получилась на макетке. Вы можете подключить к любой другой ноге и переправить в программе.
Кварца на 16МГц в моих загашниках почему-то не нашлось. Поэтому я использовал режим RC. Достаточно подключить резистор 3.6 кОм между питанием МК (+5V) и входом OSC1 и всё, конденсатор сюда не нужен: МК запускается на емкости собственного входа с частотой как раз 16 МГц.
Не забудьте при прошитии указать в конфигурации режим RC.

WS2811 управляется так.
Запись начинается с "красного" канала. Когда все 8 бит приняты, следующие записываются в "зеленый", по его заполнении - далее, в "синий".
Если после 24 бит передача продолжается, микросхема отправляет импульсы на дополнительный выход, к которому можно подключить следующую такую же микросхему (и так далее цугом неограниченно).
После паузы в передаче 50 мкС счетчик каналов сбрасывается, и следующие биты будут записываться снова, начиная с первого канала первой микросхемы.
Каналы, до которых не дошла очередь, остаются в том состоянии, как были.

Один байт в микросхему записывает подпрограмма "WRITE2811". Для записи в следующий канал, загружаем новое значение в tmp2 и вызываем подпрограмму снова.
Как правило, допустимого времени между вызовами 50мкС хватает только для записи значения в переменную и некоторых простейших действий. Длительные вычисления надо произвести заранее.

Выше приведенная программа работает так.
При включении "красный" канал плавно разгорается и затухает, а "зеленый" моргает линейно. "Синий" устанавливается один раз вначале программы и дальше продолжает работать в 50% ШИМ, не изменяясь.

Особенности микросхемы.
Как я выяснил, при величине 255 ШИМ не пропадает, между циклами остаются промежутки длительностью 25 мкС.
При нуле ШИМ отключается совсем. Даже несколько раньше: при коде 001 импульсов уже нет, начинаются они только с двойки.
Отрабатывается код не очень точно.
От двух до восьми приращение импульса шагами по 0.5 мкС, а с 9 до 20 - по 1 мкС.
С 23 и дальше до конца - приблизительно по 2 мкС.
Начало каждого импульса ШИМ во всех трех каналах синхронно. (Но не между разными микросхемами!)
Впечатление, что ШИМ формируется внутри аналоговым способом: из "пилы" как обычно, и эта пила чуток нелинейна.
Странно, почему было не сделать ШИМ чисто цифровым способом. 8-битный счетчик на пол-мегагерца скорости - разве это вопрос для современных технологий? - это уже лет 30 назад никакой проблемою не было.

Примечание:
Ножку 7 микросхемы никуда не подключать. Она управляет скоростью. Если ее соединить с ножкой 8 (питание +), то работа микросхемы замедлится вдвое и программу надо будет запускать на скорости 8МГц.
Однако период сброса все равно остается тем же самым: 50мкС, так что это невыгодный режим.

Сообщение отредактировал Меджикивис - Вс, 30.09.2018, 11:21
ЯНДЕКС Дата: 30.09.2018
Форум Picbasic.ru » Программирование МК » PicBasicPro » Программирование WS2811 в PicBasic PRO
  • Страница 1 из 1
  • 1
Поиск: