Comments 14
Интересный способ, но вот если использовать порядка 500 светодиодов, получается что нам требуется 24 килобайта ОЗУ. Но способ конечно интересный. Однозначно плюс.
Для STM32 такой объем памяти — нормальный. Например, в семействе STM32F4 самый мелкий размер RAM — 96KB, а самый большой — 384. И это еще без внешней памяти…
Жалко, конечно, выкидывать столько памяти на хранение цвета, но иначе получится только еще более громоздко и не факт, что будет выигрыш в чем-либо.
Жалко, конечно, выкидывать столько памяти на хранение цвета, но иначе получится только еще более громоздко и не факт, что будет выигрыш в чем-либо.
1) Ниже пишут про двукратную экономию памяти с SPI.
2) Использовать два банка DMA небольшого размера, пока один выходит наружу — второй заполняем.
2) Использовать два банка DMA небольшого размера, пока один выходит наружу — второй заполняем.
C случае:
получаем 16к на буфер.
На деле, WS2812B имеет такой порядок бит: GGGGGGGG RRRRRRRR BBBBBBBB,
где будет занято 12к на буфер.
Другое дело — совсем не вижу смысла использовать буфер для таких примитивных целей, даже для СМУ, здесь можно реализовать любые последовательности используя 30-60 байт.
Вот если буфер заполнять с компьютера (от простейшего управления последовательностью, до полноценного потока), тогда в нем действительно есть необходимость.
Впрочем, идея хороша уже тем что это STM32, а по поводу временных задержек в реализациях которые уже были — все проще: у Attiny нет DMA.
(битовое представление — 00000000 RRRRRRRR GGGGGGGG BBBBBBBB)...
получаем 16к на буфер.
На деле, WS2812B имеет такой порядок бит: GGGGGGGG RRRRRRRR BBBBBBBB,
где будет занято 12к на буфер.
Другое дело — совсем не вижу смысла использовать буфер для таких примитивных целей, даже для СМУ, здесь можно реализовать любые последовательности используя 30-60 байт.
Вот если буфер заполнять с компьютера (от простейшего управления последовательностью, до полноценного потока), тогда в нем действительно есть необходимость.
Впрочем, идея хороша уже тем что это STM32, а по поводу временных задержек в реализациях которые уже были — все проще: у Attiny нет DMA.
С этими двойными буферами есть тонкий момент. При передаче данных на WS2812B нельзя делать вообще никаких пауз. Если для решаемой задачи памяти в МК дофига и на фреймбуфер хватает, то почему бы не сделать железобетонный вариант с целиковым буфером и не забивать голову синхронизацией? Это экономит время разработчика.
А если делать через двойной буфер, то надо DMA настраивать на циклический режим и задействовать half transfer interrupt.
А если делать через двойной буфер, то надо DMA настраивать на циклический режим и задействовать half transfer interrupt.
А я на SPI делал. Чтобы светодиод прочитал ноль передаем биты 1000, чтобы единицу 1110. Итого по два бита WS2812B на один байт SPI. Но есть ряд нюансов:
1) Данные в SPI надо обязательно засылать с помощью DMA. Иначе между байтами буду достаточно длинные перерывы, чтобы светодиод прочитал reset.
2) Конечно надо выставить правильную частоту у SPI.
3) Провод до первого диода должен быть коротким. У меня начиная с 15-20 сантиметров в линии возникали слишком большие помехи и связь нарушалась.
4) Поговаривают, что попадаются WS2812B которым надо именно 5ти вольтовый сигнал и 3.3 вольта от stm32 они могут не воспринимать. Но те две ленты, что у меня есть работают.
1) Данные в SPI надо обязательно засылать с помощью DMA. Иначе между байтами буду достаточно длинные перерывы, чтобы светодиод прочитал reset.
2) Конечно надо выставить правильную частоту у SPI.
3) Провод до первого диода должен быть коротким. У меня начиная с 15-20 сантиметров в линии возникали слишком большие помехи и связь нарушалась.
4) Поговаривают, что попадаются WS2812B которым надо именно 5ти вольтовый сигнал и 3.3 вольта от stm32 они могут не воспринимать. Но те две ленты, что у меня есть работают.
Присоединяюсь…
На STM32F103C8T6 как раз столкнулся с проблемой несовпадения частот. Обошел небольшой подстройкой частоты МК с помощью STM32CubeMX и увеличением количества бит SPI на один бит протокола WS2811 (да, я кодировал для другого контроллера RGB LED). При этом я устанавливал в МК FreeRTOS, и все работает без особых проблем.
Слышатся предложения использовать интерфейс SPI для передачи битового потока на WS2112B. Но здесь препятствием может стать недостаточное соответствие тактовой частоты системной шины и сильные погрешности длительностей импульсов.
На STM32F103C8T6 как раз столкнулся с проблемой несовпадения частот. Обошел небольшой подстройкой частоты МК с помощью STM32CubeMX и увеличением количества бит SPI на один бит протокола WS2811 (да, я кодировал для другого контроллера RGB LED). При этом я устанавливал в МК FreeRTOS, и все работает без особых проблем.
Применял конвертер уровня. Достаточно примитивный чип типа компаратора. Из 3.3 в 5 переводит на ура.
Собираюсь скоро одну штуку на этих диодах сделать и возник такой вопрос — насколько сильно они греются? Насколько плотно их можно расположить, сколько нужно меди каждому для охлаждения?
Спасибо за интересную статью!
Действительно, содержать аппаратно-выгребаемый framebuffer — это правильный и во многих случаях удобный способ.
Было бы замечательно увидеть в статье видео с демонстрацией плавных цветовых переходов!
Действительно, содержать аппаратно-выгребаемый framebuffer — это правильный и во многих случаях удобный способ.
Было бы замечательно увидеть в статье видео с демонстрацией плавных цветовых переходов!
Может кому будет интересно: stm32f10x-ws2812b-lib — готовая библиотека для STM32F10x, работает на том же принципе, но только с использованием half-transfer interrupt.
В статье в теге кругом WS2112B, а в заголовке WS2812B. Похоже на тотальную очепятку.
Sign up to leave a comment.
Протокол WS2812B на STM32 без пустых циклов и прерываний. И как сделать правильную радугу