Skip to content

第 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 灯带。


Built for OSRCORE robot development board.