Меджикивис |
Дата: Вс, 30.09.2018, 11:11 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Начал соображать
Сообщений:
25
Замечания:
±
На сайте с 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
|
|
|
|
Anatoliy1000 |
Дата: Чт, 22.11.2018, 13:21 | Сообщение # 2 |
Группа:
Проверенные
Ранг:
Начал соображать
Сообщений:
31
Замечания:
±
На сайте с 02.03.2016
Статус:
Offline
|
Извините. Можете объяснить на каком-нибудь простом или вашем примере зачем вообще нужен ШИМ? Бухгалтеру по образованию тяжело понять. Статьи про ШИМ читал, но такое впечатление, что их пишут для тех, кто и так знает что такое ШИМ.
Я новичок. За помощь стараюсь плюсовать репутацию (пока других способов сказать спасибо не знаю).
|
|
|
|
xvovanx |
Дата: Чт, 22.11.2018, 22:59 | Сообщение # 3 |
Группа:
Модераторы
Ранг:
Помогаю всем
Сообщений:
332
Замечания:
±
На сайте с 02.05.2013
Статус:
Offline
|
ШИМ сигнал - если просто на пальцах - меандр. Если правильный меандр (пауза и длительность одинаковы), то величина ШИМ сигнала 50% (127). Изменяя ШИМ от 0-100% (0-255), изменяется скважность, тем самым меняется действующие (усредненное) напряжение. Ну допустим ШИМ=1, импульс будет 1 единицу, а пауза 254 единицы времени. Если ШИМ=254, то единица на выходе будет 254 временных такта, а пауза только 1 единицы времени. ШИМ используют для плавного запуска и регулировки оборотов кулеров, двигателей, можно менять яркость дисплеев (переход в ночной режим), плавное мигание светодиодом и т.д. При 50% ШИМе вентилятор будет включаться\выключаться и усредненное напряжение на нем будет в пол питания, соответственно и половинная скорость вращения. Сделав цикл ШИМа от 1 до 254 и на выход повесив светодиод, получим плавное зажигание. Вот кусочки моих кодов перевода яркости дисплея в ночной режим и плавный пуск моторов открывания ворот (для ворот частоту ШИМа использовал 25кГц, чтоб моторы не жужжали. Для дисплея и 1кГц хватает -все равно миганий не видим). Куллеры охлаждения включаю тоже через ШИМ, не жужжит сразу на всю мощь, а плавненько доходит скажем до 25%, если все равно горячий радиатор еще плавненько увеличиваем.
П.С.коды в Protone
Сообщение отредактировал
xvovanx - Пт, 23.11.2018, 10:28
|
|
|
|
anatol |
Дата: Вс, 25.11.2018, 17:43 | Сообщение # 4 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
471
Замечания:
±
На сайте с 10.02.2010
Статус:
Offline
|
ШИМ сигнал - это ШиротноИмпульснаяМодуляция сигнала (постоянной частоты) в виде меандра. Если период этого сигнала разделить на N отрезков равной длительности, где N=2^a (2 в степени a), где a = разрядность, то можно численно определить время действия сигнала по отношению к периоду. Кстати регулирование может быть не ступенчатым, а плавным, т.е. аналоговым. Но это не наш случай. Таким образом (в процентах) ШИМ=0 - тока нет, ШИМ=50 - чистый меандр с соотношением длительность-пауза равным 1, ШИМ=100 - это постоянный ток. Применяется для регулирования силы тока(напряжения) путем применения фильтров с 10 и более постоянной времени фильтра ( 10 периодов сигнала и более). Выходной уровень будет равен отношению длительность импульса к периоду помноженному на амплитуду импульса. Это после фильтрации.
|
|
|
|