Как стать автором
Обновить

Комментарии 14

Интересный способ, но вот если использовать порядка 500 светодиодов, получается что нам требуется 24 килобайта ОЗУ. Но способ конечно интересный. Однозначно плюс.
Для STM32 такой объем памяти — нормальный. Например, в семействе STM32F4 самый мелкий размер RAM — 96KB, а самый большой — 384. И это еще без внешней памяти…
Жалко, конечно, выкидывать столько памяти на хранение цвета, но иначе получится только еще более громоздко и не факт, что будет выигрыш в чем-либо.
я бы сделал через таймер. RAM можно занять и другим.
1) Ниже пишут про двукратную экономию памяти с SPI.
2) Использовать два банка DMA небольшого размера, пока один выходит наружу — второй заполняем.
Вариант 2 по мне предпочтительнее.
C случае:
(битовое представление — 00000000 RRRRRRRR GGGGGGGG BBBBBBBB)...

получаем 16к на буфер.
На деле, WS2812B имеет такой порядок бит: GGGGGGGG RRRRRRRR BBBBBBBB,
где будет занято 12к на буфер.

Другое дело — совсем не вижу смысла использовать буфер для таких примитивных целей, даже для СМУ, здесь можно реализовать любые последовательности используя 30-60 байт.

Вот если буфер заполнять с компьютера (от простейшего управления последовательностью, до полноценного потока), тогда в нем действительно есть необходимость.

Впрочем, идея хороша уже тем что это STM32, а по поводу временных задержек в реализациях которые уже были — все проще: у Attiny нет DMA.
С этими двойными буферами есть тонкий момент. При передаче данных на WS2812B нельзя делать вообще никаких пауз. Если для решаемой задачи памяти в МК дофига и на фреймбуфер хватает, то почему бы не сделать железобетонный вариант с целиковым буфером и не забивать голову синхронизацией? Это экономит время разработчика.

А если делать через двойной буфер, то надо DMA настраивать на циклический режим и задействовать half transfer interrupt.
А я на SPI делал. Чтобы светодиод прочитал ноль передаем биты 1000, чтобы единицу 1110. Итого по два бита WS2812B на один байт SPI. Но есть ряд нюансов:
1) Данные в SPI надо обязательно засылать с помощью DMA. Иначе между байтами буду достаточно длинные перерывы, чтобы светодиод прочитал reset.
2) Конечно надо выставить правильную частоту у SPI.
3) Провод до первого диода должен быть коротким. У меня начиная с 15-20 сантиметров в линии возникали слишком большие помехи и связь нарушалась.
4) Поговаривают, что попадаются WS2812B которым надо именно 5ти вольтовый сигнал и 3.3 вольта от stm32 они могут не воспринимать. Но те две ленты, что у меня есть работают.
Присоединяюсь…

Слышатся предложения использовать интерфейс SPI для передачи битового потока на WS2112B. Но здесь препятствием может стать недостаточное соответствие тактовой частоты системной шины и сильные погрешности длительностей импульсов.


На STM32F103C8T6 как раз столкнулся с проблемой несовпадения частот. Обошел небольшой подстройкой частоты МК с помощью STM32CubeMX и увеличением количества бит SPI на один бит протокола WS2811 (да, я кодировал для другого контроллера RGB LED). При этом я устанавливал в МК FreeRTOS, и все работает без особых проблем.
Применял конвертер уровня. Достаточно примитивный чип типа компаратора. Из 3.3 в 5 переводит на ура.
Собираюсь скоро одну штуку на этих диодах сделать и возник такой вопрос — насколько сильно они греются? Насколько плотно их можно расположить, сколько нужно меди каждому для охлаждения?
Спасибо за интересную статью!
Действительно, содержать аппаратно-выгребаемый framebuffer — это правильный и во многих случаях удобный способ.
Было бы замечательно увидеть в статье видео с демонстрацией плавных цветовых переходов!
Может кому будет интересно: stm32f10x-ws2812b-lib — готовая библиотека для STM32F10x, работает на том же принципе, но только с использованием half-transfer interrupt.
В статье в теге кругом WS2112B, а в заголовке WS2812B. Похоже на тотальную очепятку.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Изменить настройки темы

Истории