Регистрация | Вход

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: ivan_fd  
Программирование WS2811 в PicBasic PRO
Меджикивис Дата: Вс, 30.09.2018, 11:11  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Начал соображать
Сообщений: 25
Репутация: 6   ±
Замечания:   ±
На сайте с 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
Anatoliy1000 Дата: Чт, 22.11.2018, 13:21  |                                                                                                                Сообщение # 2
Группа: Проверенные
Ранг:  Начал соображать
Сообщений: 31
Репутация: 0   ±
Замечания:   ±
На сайте с 02.03.2016

Статус: Offline

Извините. Можете объяснить на каком-нибудь простом или вашем примере зачем вообще нужен ШИМ?
Бухгалтеру по образованию тяжело понять. Статьи про ШИМ читал, но такое впечатление, что их пишут для тех, кто и так знает что такое ШИМ.


Я новичок. За помощь стараюсь плюсовать репутацию (пока других способов сказать спасибо не знаю).
xvovanx Дата: Чт, 22.11.2018, 22:59  |                                                                                                                Сообщение # 3
Группа: Модераторы
Ранг:  Помогаю всем
Сообщений: 332
Репутация: 59   ±
Замечания:   ±
На сайте с 02.05.2013

Статус: Offline

ШИМ сигнал - если просто на пальцах - меандр. Если правильный меандр (пауза и длительность одинаковы), то величина ШИМ сигнала 50% (127). Изменяя ШИМ от 0-100% (0-255), изменяется скважность, тем самым меняется действующие (усредненное) напряжение. Ну допустим ШИМ=1, импульс будет 1 единицу, а пауза 254 единицы времени. Если ШИМ=254, то единица на выходе будет 254 временных такта, а пауза только 1 единицы времени.
ШИМ используют для плавного запуска и регулировки оборотов кулеров, двигателей, можно менять яркость дисплеев (переход в ночной режим), плавное мигание светодиодом и т.д.
При 50% ШИМе вентилятор будет включаться\выключаться и усредненное напряжение на нем будет в пол питания, соответственно и половинная скорость вращения.
Сделав цикл ШИМа от 1 до 254 и на выход повесив светодиод, получим плавное зажигание.
Вот кусочки моих кодов перевода яркости дисплея в ночной режим и плавный пуск моторов открывания ворот (для ворот частоту ШИМа использовал 25кГц, чтоб моторы не жужжали. Для дисплея и 1кГц хватает -все равно миганий не видим). Куллеры охлаждения включаю тоже через ШИМ, не жужжит сразу на всю мощь, а плавненько доходит скажем до 25%, если все равно горячий радиатор еще плавненько увеличиваем.

П.С.коды в Protone
Прикрепления: 5214059.jpg (26.2 Kb) · 7440552.jpg (36.4 Kb) · 2960048.jpg (84.6 Kb)

Сообщение отредактировал xvovanx - Пт, 23.11.2018, 10:28
anatol Дата: Вс, 25.11.2018, 17:43  |                                                                                                                Сообщение # 4
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 471
Репутация: 32   ±
Замечания:   ±
На сайте с 10.02.2010

Статус: Offline

ШИМ сигнал - это ШиротноИмпульснаяМодуляция сигнала (постоянной частоты) в виде меандра.
Если период этого сигнала разделить на N отрезков равной длительности, где N=2^a (2 в степени
a), где a = разрядность, то можно численно определить время действия сигнала по отношению к периоду.
Кстати регулирование может быть не ступенчатым, а плавным, т.е. аналоговым. Но это не наш случай.
Таким образом (в процентах) ШИМ=0 - тока нет, ШИМ=50 - чистый меандр с соотношением длительность-пауза равным 1, ШИМ=100 - это постоянный ток.
 Применяется для регулирования силы тока(напряжения) путем применения фильтров с 10 и более постоянной времени фильтра ( 10 периодов сигнала и более). Выходной уровень будет равен отношению длительность импульса к периоду помноженному на амплитуду импульса. Это после фильтрации.
  • Страница 1 из 1
  • 1
Поиск: