第 1 章:WS2812B 彩色 LED(RMT 驱动)
1.1 知识要点
- WS2812B 单线串行协议的时序要求(T0H/T0L/T1H/T1L/Reset)
- ESP-IDF RMT TX 新 API(v5.x)的使用方式
- 自定义 RMT 编码器(
rmt_encoder_t)的实现方法 - GRB 字节序与颜色映射
1.2 课程内容
WS2812B 是一种集成驱动 IC 的 RGB LED,通过单根数据线传输 GRB 颜色数据。ESP32-S3 的 RMT(Remote Control Transceiver)外设能以硬件精度生成符合 WS2812B 时序要求的脉冲序列,无需占用 CPU 资源。
本章实现一个颜色循环程序:红 → 绿 → 蓝 → 熄灭,每 500 ms 切换一次。
1.3 基础学习
WS2812B 时序
WS2812B 使用归零码(NRZ)编码,每个 bit 由高低电平的持续时间决定:
| 符号 | 高电平 | 低电平 | 含义 |
|---|---|---|---|
| 0 码 | 400 ns (T0H) | 850 ns (T0L) | 逻辑 0 |
| 1 码 | 800 ns (T1H) | 450 ns (T1L) | 逻辑 1 |
| Reset | — | ≥ 50 µs | 帧结束 |
每颗 LED 接收 24 bit(GRB 顺序,MSB 先),多颗级联时数据自动透传。
RMT 时钟配置为 80 MHz(12.5 ns/tick),对应 tick 数:
T0H = 32 ticks T0L = 68 ticks
T1H = 64 ticks T1L = 36 ticks
Reset = 4000 ticks (50 µs)RMT 编码器架构
ESP-IDF v5.x RMT 采用编码器链式结构:
rmt_bytes_encoder:将字节流按位展开为 RMT 符号rmt_copy_encoder:直接复制预定义符号(用于 Reset 脉冲)- 自定义编码器组合两者,实现完整的 WS2812B 帧
1.4 程序学习
创建 TX 通道与字节编码器:
c
rmt_tx_channel_config_t ch_cfg = {
.gpio_num = 45, // LED_PIN
.clk_src = RMT_CLK_SRC_DEFAULT,
.resolution_hz = 80000000,
.mem_block_symbols = 64,
.trans_queue_depth = 4,
};
rmt_new_tx_channel(&ch_cfg, &s_channel);
rmt_bytes_encoder_config_t bcfg = {
.bit0 = { .level0=1, .duration0=32, .level1=0, .duration1=68 },
.bit1 = { .level0=1, .duration0=64, .level1=0, .duration1=36 },
.flags.msb_first = 1,
};
rmt_new_bytes_encoder(&bcfg, &ws->bytes_encoder);
rmt_enable(s_channel);发送颜色(GRB 字节序):
c
static void led_set(uint8_t r, uint8_t g, uint8_t b)
{
uint8_t grb[3] = { g, r, b };
rmt_transmit_config_t tx_cfg = { .loop_count = 0 };
rmt_transmit(s_channel, s_encoder, grb, sizeof(grb), &tx_cfg);
rmt_tx_wait_all_done(s_channel, portMAX_DELAY);
}1.5 课程总结
本章掌握了 WS2812B 的单线时序原理,学会了使用 ESP-IDF RMT TX 新 API 和自定义编码器驱动 LED。RMT 外设的硬件精度保证了时序的准确性,这一模式也可扩展到驱动 LED 灯带。