Перейти к содержанию

RMT — периферия импульсных последовательностей ESP32

Сигнал ИК-пульта или адресной ленты WS2812 — это цепочка импульсов с точно заданными длительностями. У ESP32 для таких сигналов есть отдельная периферия RMT: программа кладёт в её память пары «уровень — длительность», а дальше она выдаёт их сама, с точностью до такта.

Обновлено Редакция GAW

RMT (remote control peripheral) — периферия микроконтроллеров ESP32, которая передаёт и принимает последовательности импульсов, заданные как пары «уровень — длительность». Espressif создавала её для сигналов ИК-пультов с несущей частотой, но RMT подходит для любых импульсных протоколов: адресных светодиодов WS2812 и других нестандартных последовательностей (ESP32 TRM, гл. 30). Передатчик читает пары из встроенной памяти и выдаёт их на вывод, приёмник измеряет длительности входного сигнала и записывает их туда же.

Символы и память

Единица данных — 32-битное слово из двух элементов: в каждом 15 бит длительности в тактах канала и 1 бит уровня (rmt_symbol_word_t в ESP-IDF). Элемент с нулевой длительностью означает конец передачи. Каналы делят общую память: у ESP32 она 512 слов, по умолчанию по 64 слова на канал, и канал может занять блоки соседних. Для длинных последовательностей есть кольцевой режим: программа подкладывает новые данные, пока RMT выдаёт старые.

ЧипКаналы TX / RXСлов на каналDMA
ESP328, любой TX или RX64нет
ESP32-S24, любой TX или RX64нет
ESP32-S34 / 448да
ESP32-C3, C6, H22 / 248нет

Данные — по заголовкам ESP-IDF v6.1 (rmt_ll.h, soc_caps.h).

Тактирование и несущая

У ESP32 такт канала получается из APB 80 МГц или REF_TICK делителем до 256 (TRM, разд. 30.2.3). При 10 МГц шаг — 100 нс, а наибольшая длительность одного элемента — 32 767 тактов, то есть 3,2767 мс (наш расчёт). Передатчик может модулировать выход несущей: в примере ESP-IDF для протокола NEC это 38 кГц с заполнением 33 %. Тайминги протокола NEC и длительности импульсов пульта считает калькулятор ИК NEC, биты WS2812 — калькулятор WS2812.

Где ещё

Вывод RMT назначается на любой GPIO через матрицу GPIO. Для простого подсчёта импульсов, без записи длительностей, у ESP32 есть отдельный счётчик импульсов PCNT. Обзор чипов ESP32 — в разделе ESP32.

Частые вопросы

Сколько каналов RMT у разных ESP32?

У ESP32 — восемь каналов, каждый может передавать или принимать; у ESP32-S2 — четыре таких же; у ESP32-S3 — четыре на передачу и четыре на приём; у ESP32-C3, C6 и H2 — по два на передачу и приём (заголовки rmt_ll.h ESP-IDF v6.1). Блок памяти на канал — 64 слова у ESP32 и S2 и 48 у остальных, DMA для RMT есть только у S3 (soc_caps.h).

Почему RMT удобен для WS2812?

WS2812 кодирует биты длительностью высокого и низкого уровня в доли микросекунды, и программная генерация сбивается от любого прерывания. RMT выдаёт такие пары аппаратно из своей памяти: в примере ESP-IDF led_strip канал тактируется 10 МГц, то есть с шагом 100 нс, а кодировщик превращает байты цвета в символы RMT. Тайминги WS2812 разобраны в калькуляторе WS2812.

Можно ли принимать сигнал ИК-пульта через RMT?

Да, приёмник RMT записывает в память длительности высоких и низких уровней входного сигнала и умеет отфильтровывать короткие помехи; конец посылки он отмечает нулевым периодом, когда вход затих (ESP32 TRM, разд. 30.2). Декодирование протокола, например NEC, делает программа по этим длительностям.

Источники

  1. Espressif. ESP32 Technical Reference Manual, Version 5.8 — гл. 30 — RMT создан для ИК-пультов с манипуляцией несущей, но годится для разных сигналов; восемь каналов, в каждом передатчик и приёмник, активен один; общая память 512 × 32 бит, по умолчанию 64 слова на канал, можно занять блоки соседних; запись — два 16-битных элемента «уровень + период» в слове, нулевой период — конец; приёмник может фильтровать вход; такт канала — APB 80 МГц или REF_TICK через 8-битный делитель; режим кольцевой передачи для длинных последовательностей
  2. Espressif. ESP-IDF v6.1: soc_caps.h, hal/rmt_types.h, esp_hal_rmt rmt_ll.h (release/v6.1) — rmt_symbol_word_t: два поля duration 15 бит + level 1 бит; SOC_RMT_MEM_WORDS_PER_CHANNEL: 64 (ESP32, S2), 48 (S3, C3, C6, H2); RMT_LL_TX/RX_CANDIDATES_PER_INST: ESP32 8/8, S2 4/4, S3 4/4, C3/C6/H2 2/2; SOC_RMT_SUPPORT_DMA — только ESP32-S3; делитель канала до 256
  3. Espressif. ESP-IDF Programming Guide v6.1: Remote Control Transceiver (RMT) — драйвер RMT: символы RMT, кодировщики (encoder) для преобразования данных в символы; примеры led_strip (10 МГц, WS2812) и ir_nec (1 МГц, несущая 38 кГц, заполнение 33 %)

Нашли ошибку?