ESP32 RMT 使用指南 · 红外收发、WS2812 灯带与避坑
RMT 是 ESP32 上最被低估的外设:红外遥控、WS2812 灯带、单总线传感器都靠它。这里讲清通道数、分辨率和 Wi-Fi 干扰问题。
RMT 是干什么的
RMT(Remote Control)原本是为红外遥控设计的,本质是一个可编程的精确波形发生器。它能以 12.5 ns 级的分辨率输出任意高低电平序列,而且不需要 CPU 参与——数据写进内存后硬件自己发,CPU 可以去干别的。
所以除了红外,它还被大量用来驱动:
- WS2812 / SK6812 等单线 RGB 灯带(这是目前最主流的用法)
- DHT11 / DHT22 等单总线传感器(收发都用 RMT)
- 步进电机的精确脉冲序列、自定义单线协议
通道与分辨率
| 项目 | ESP32 经典款 | 说明 |
|---|---|---|
| 通道数 | 8 | TX 与 RX 共用这 8 个通道 |
| 时钟源 | 80 MHz APB | 约 12.5 ns 一个 tick |
| S2 / S3 / C3 / C6 / H2 / P4 | 以官方文档为准(通道数各不相同,C3 明显少于经典款) | |
通道数请查官方文档:各型号的 RMT 通道数与内存块大小差异较大,本站只给出经典款的确信值。
最大的坑:Wi-Fi 会让灯带闪
WS2812 的时序容差很小(0 码高电平约 0.35 µs)。Wi-Fi 工作时,射频会短暂占用总线并延迟 RMT 的内存填充中断,导致某个灯珠的码型被拉长——表现就是随机位置的灯珠颜色错乱或整条闪烁。
常见的缓解办法:
- 把灯带分成小段发送,缩短单次传输时长。
- 用 SPI 模拟WS2812 波形(SPI 有 DMA,抗干扰更好)。
- 降低刷新频率,避开 Wi-Fi 密集收发的时间窗。
- 关掉 Wi-Fi 省电模式(modem sleep)减少突发延迟。
其他注意事项
- 每个通道的符号内存有限,长灯带需要分块发送或用循环模式。
- RMT 不挑脚:走 GPIO 矩阵,几乎所有输出脚都能用;但仅输入的 GPIO 34–39 不行。
- 红外发射需要外部三极管驱动 LED,IO 口直接推不动。
- 红外接收头(如 VS1838B)输出是反相的:有信号时为低电平。
数据核验:2026-10-20 · 以 Espressif 官方文档交叉核对。随型号或 ESP-IDF 版本变化的字段一律标注「以官方文档为准」,不编造具体数值。
官方外设文档 →