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 |
|---|---|---|---|
| ESP32 | 8, любой TX или RX | 64 | нет |
| ESP32-S2 | 4, любой TX или RX | 64 | нет |
| ESP32-S3 | 4 / 4 | 48 | да |
| ESP32-C3, C6, H2 | 2 / 2 | 48 | нет |
Данные — по заголовкам 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, делает программа по этим длительностям.
Источники
- Espressif. ESP32 Technical Reference Manual, Version 5.8 — гл. 30 — RMT создан для ИК-пультов с манипуляцией несущей, но годится для разных сигналов; восемь каналов, в каждом передатчик и приёмник, активен один; общая память 512 × 32 бит, по умолчанию 64 слова на канал, можно занять блоки соседних; запись — два 16-битных элемента «уровень + период» в слове, нулевой период — конец; приёмник может фильтровать вход; такт канала — APB 80 МГц или REF_TICK через 8-битный делитель; режим кольцевой передачи для длинных последовательностей
- 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
- Espressif. ESP-IDF Programming Guide v6.1: Remote Control Transceiver (RMT) — драйвер RMT: символы RMT, кодировщики (encoder) для преобразования данных в символы; примеры led_strip (10 МГц, WS2812) и ir_nec (1 МГц, несущая 38 кГц, заполнение 33 %)
Нашли ошибку?
Смотрите также
- RMT ESP32Разрешение канала, символы WS2812 и NEC, несущая, код ESP-IDF
- Лента WS2812BТок и мощность, время кадра, проверка таймингов SPI
- ИК-код NECАдрес и команда ↔ код, тайминги кадра, код для Arduino
- ESP32ESP32, S2, S3, C2, C3, C5, C6, H2, P4: ядра, радио, USB, GPIO — сравнение и выбор
- Матрица GPIOПрограммное соединение сигналов периферии ESP32 с любыми выводами
- PCNT (счётчик импульсов ESP32)Аппаратный счёт фронтов и квадратурного энкодера в ESP32