Почему WS2812 мигают на ESP32?
Обновлено Редакция GAW
Лента WS2812 различает 0 и 1 по длительности импульса с точностью до сотен наносекунд, поэтому любой сбой в выдаче битов сразу виден как мигание, «чужие» цвета или сдвиг картинки. У ESP32 сигнал формирует периферия RMT, и сбоев бывает три вида.
1. RMT не успевает подкачать данные
Канал RMT хранит в своей памяти только часть кадра: у ESP32 блок — 64 символа, по символу на бит. Остальное драйвер дописывает в прерывании половинами блока. ESP-IDF предупреждает: если кодирование затянулось или прерывание задержано другими прерываниями, передатчик прочитает память раньше, чем туда записаны новые символы, и отправит устаревшие данные.
Наш расчёт. Бит WS2812 в примере ESP-IDF длится 1,2 мкс, половина блока — 32 бита, то есть 38,4 мкс. Столько времени есть у обработчика, чтобы успеть. Лента из 60 светодиодов — это 1440 бит; за вычетом первого блока, заполненного до старта, — около 43 таких подкачек на кадр. Wi-Fi или запись во флеш легко задерживают прерывание дольше.
| Мера по ESP-IDF | Что даёт |
|---|---|
mem_block_symbols больше, шагами по 64 | дольше запас до опоздания |
| кодировщик в IRAM | быстрее обработчик, нет промахов кэша |
with_dma | данные подаёт DMA; из ESP32, S2, S3, C3, C6 и H2 есть только у S3 |
| драйвер на другом ядре | не конкурирует с Wi-Fi и Bluetooth |
CONFIG_RMT_TX_ISR_CACHE_SAFE | прерывание работает и во время записи во флеш |
2. Уровень 3,3 В
У WS2812B-V5/W при питании 5 В единица на входе — от 0,63·VDD, то есть 3,15 В. ESP32 гарантирует единицу на выходе только от 0,8·VDD — 2,64 В. Лента может работать «на грани» и сбоить от наводок. Решение — преобразователь уровня или буфер с питанием 5 В; пороги подробно сравнивает калькулятор WS2812.
3. Тайминги
Пример ESP-IDF задаёт T1L 0,3 мкс и сброс 50 мкс, а даташит WS2812B-V5/W требует 580 нс – 1 мкс и больше 280 мкс. Многие ленты принимают и так, но гарантии нет. Длительности при своём разрешении проверит калькулятор RMT ESP32, кнопка «В допусках даташита» подставит безопасные значения.
Похожие вопросы
Почему мигание появляется только с Wi-Fi?
Стек Wi-Fi часто вызывает прерывания и занимает процессор. Канал RMT хранит в своей памяти лишь часть кадра и подкачивает остальное в прерывании; если оно опоздало, ESP-IDF прямо пишет, что передатчик отправит устаревшие данные. Espressif советует вынести драйвер RMT на другое ядро, чем Wi-Fi и Bluetooth, увеличить блок памяти или включить DMA.
Можно ли подключить ленту к ESP32 без преобразователя уровня?
Иногда работает, но без гарантии. При питании ленты 5 В порог единицы у WS2812B-V5/W — 3,15 В, а ESP32 гарантирует на выходе только 2,64 В при 3,3 В. Надёжно — буфер с порогами для 3,3-вольтовой логики, питаемый от 5 В. Это наш вывод из двух даташитов.
Почему мигает только первый светодиод?
Первый светодиод принимает сигнал прямо от микроконтроллера, а следующие — уже восстановленный предыдущим светодиодом: в WS2812B есть схема формирования сигнала. Поэтому плохой уровень, длинный провод или общий провод без хорошего контакта сильнее всего бьют по первому пикселю (наш вывод).
Источники
- Espressif. ESP-IDF Programming Guide v6.1: Remote Control Transceiver (RMT), ESP32 — кодирование идёт в прерывании по схеме ping-pong; FAQ «Why the RMT transmits more data than expected?» — при задержке прерывания передатчик читает память раньше кодировщика и шлёт устаревшие данные; меры: увеличить mem_block_symbols шагами по 64, кодировщик в IRAM, with_dma, драйвер на другом ядре, чем Wi-Fi и Bluetooth; CONFIG_RMT_TX_ISR_CACHE_SAFE — прерывание при отключённом кэше (запись во флеш); soc_caps.h: SOC_RMT_SUPPORT_DMA только у ESP32-S3
- Worldsemi. WS2812B-V5/W datasheet V6.1 — при VDD = 5 В: VIH не ниже 0,63·VDD; T0H 220–380 нс, T1H, T0L и T1L 580 нс – 1 мкс, сброс дольше 280 мкс
- Espressif. ESP32 Series Datasheet v5.3 — табл. 5-3 — VOH не ниже 0,8 × VDD; при 3,3 В это 2,64 В
Нашли ошибку?
Смотрите также
- RMT ESP32Разрешение канала, символы WS2812 и NEC, несущая, код ESP-IDF
- Лента WS2812BТок и мощность, время кадра, проверка таймингов SPI
- RMT (импульсные последовательности ESP32)Периферия ESP32 для передачи и приёма последовательностей импульсов
- Согласование уровнейПрямое соединение, делитель, диоды, MOSFET-транслятор, I²C на BSS138