Pull to refresh

Comments 23

Идея с UART хорошая, SPI конкретно на STM32 работает хуже. DMA не обязателен, достаточно включения буферизации у UART. Скорость должна быть 3.75 Мбод, 8-N-1, отправляются два бита в одном байте. Формат байта: 0xx100yy, где xx - первый бит, yy - второй бит (каждый бит повторяется дважды). Алгоритм проверен на WS2812 и SK6812. Моя реализация.

По-колхозному можно подавать на WS2812 и 3-вольтовую логику, в большинстве случаев они ее воспринимают, хотя это не гарантируется. Преобразовывать уровень в случае, если между диодами и схемой есть провод, надежнее не подтяжкой, а любым 74LVT. Если диодов очень много, то в качестве этого 74-го можно использовать демультиплексор, чтобы разбить светодиоды на несколько независимых групп, а не ставить все одной цепью.

Собрал как раз на SPI. Частота ядра - 20МГц, предделитель SPI - /4 (5МГц). 8 бит-слотов занимают 12.8мкс, 1 бит-слот - 1.6мкс (по какой-то причине светодиоды лучше всего заработали именно с этой скоростью). Данные отправляются по DMA. Используется 48 байт. 0x70 = '1', 0x40 = 0. Буфер кольцевой, 2*24 байта (бита). По прерыванию DMA уже отправленная половина буфера заполняется новыми значениями для передачи. 20 светодиодов вообще без сбоев приёма обновляются.

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

На SPI пакость в том, что SPI довольно значительно различается между разными STM32 и местами даже между ревизиями одного и того же чипа, про него много Errata. Поэтому код получается плохо переносим. Это не значит, что он не будет работать, но с UART просто проще и переносимее. Код для UART вообще можно написать полностью переносимым и не зависящим от архитектуры контроллера, если его параметризовать функцией "послать байт".

повторители ставят обычно что бы защитить нежные порты от агрессивного внешнего мира, а схема с OD внутри корпуса вполне нормальная, все I2C шины так и цепляются, и никто им логику дополнительно не ставит. В демультиплексорах смысл отпал, портов у современных контроллеров как котов у поехавшей старушки.

I2C работает на очень небольших дистанциях и чувствительна к помехам из-за большого сопротивления подтяжки и отсутствия согласования линии как класса. Повторитель с push-pull выходом имеет меньшее выходное сопротивление и допускает более длинные кабели, что как раз для светодиодов актуально.

Простое решение для длинного кабеля без отдельного повторителя - поставить первый светодиод на саму плату с контроллером, а кабель уже после него.

Демультиплексоры актуальны, если процессор рулит не только светодиодами. Израсходовать 100+ пинов гораздо проще, чем кажется, особенно если нужно вешать внешнюю память и/или дисплей. Если не уложиться в 176 пинов, придется паять BGA.

Сперва покажи мне проект со 100+ матрицами на 1024 светодиода на длинных проводах подключенных к обычному контроллеру, потом уже говори что так нельзя. Пока что ваше решение разве что дороже, но не лучше.

Приезжай в Ольденбург, покажу. У нас хакспейс на полторы тысячи квадратных метров, все этими светодиодами увешано.

Жирный минус этих светиков - слишком яркие на минимальной яркости и эффектов не получишь кроме вкл/выкл, т.к. яркость "регулируется цветом". Потому, для ламп-ночников не годятся.

Можно прикрыть их чем-нить полупрозрачным - покрасить, наклеить тонировочную плёнку ( для авто продаётся разной плотности)

Это да, но есть аналоги с отдельным байтом под яркость.

Правильно. Лучше мерзотный ШИМ вкорячить на частоте поменьше.

Всё там нормально управляется. Сделал драйвер без проблем, куча эффектов на фастлед, IR, датчик света, микрофон+FHT и PIR. Работает как надо.

в те же 80е все газоразрядники прикрывались тонированным прозрачным пластиком, что бы яркие цвета стали загадочными полутонами. Кстати светодиодные индикаторы в китайских дивидишниках и тв dvbt приставках до сих пор тонированные, норм решение.

Тонированный пластик нужен, чтобы при внешней засветке люминофор или рассеиватель выключенных сегментов не светился отраженным светом — это увеличивает уровень внешней засветки, при котором индикатор хорошо читается.

слишком яркие на минимальной яркости и эффектов не получишь кроме вкл/выкл, т.к. яркость "регулируется цветом". Потому, для ламп-ночников не годятся.

какая-то ересь. нет такого.

закажи сразу круг, и будет тебе развлечение

в планах матрица 8x8 или сколько там на сколько с одного пакета 100шт получится, я их дома травлю/паяю.

А зачем вам копировать рандом из AVR-libc? У gcc-arm свой должен быть (скорее всего примерно такой же). Точнее у newlib-nano или что там

Я В своё время пытался сделать HAL для светодиодов. В качестве исходных кодов для переписывания нашел работу через DMA и bit-banding и библиотеку для Ардуино от Алекса Гивера.

https://www.martinhubacek.cz/blog/stm32-ws2812b-dma-library/

https://github.com/comargo/stm32_hal_ws281x

https://github.com/comargo/christmas_lights

На rp2040 с их PIO совершенно замечательно пилить мозги для таких светодиодов

еще один cortex m на алике за сотку, дайте два, хотя stmки по 50 покупал.

Sign up to leave a comment.

Articles