Skip to content

第 1 章:WS2812B 彩色 LED(RMT 驱动)

📂 示例代码01_blink_led

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 = 400/12  ≈ 33 ticks   T0L = 850/12  ≈ 70 ticks
T1H = 800/12  ≈ 66 ticks   T1L = 450/12  ≈ 37 ticks
Reset = 50000/12 ≈ 4166 ticks (≥ 50 µs)

用整数除法写成宏:#define T0H (400/12),编译器在编译期计算,无运行时开销。

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);

/* WS2812B bit timing: formula-based macros, computed at compile time */
#define T0H  (400  / 12)   // ~33 ticks
#define T0L  (850  / 12)   // ~70 ticks
#define T1H  (800  / 12)   // ~66 ticks
#define T1L  (450  / 12)   // ~37 ticks
#define RESET_TICKS (50000 / 12)  // ~4166 ticks

rmt_bytes_encoder_config_t bcfg = {
    .bit0 = { .level0=1, .duration0=T0H, .level1=0, .duration1=T0L },
    .bit1 = { .level0=1, .duration0=T1H, .level1=0, .duration1=T1L },
    .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.