W2812简介
W2812 内置有控制电路和 RGB LED 灯珠,用户只需通过一条数据线进行控制
每一个LED的R、G、B分别由八位数据控制颜色浓度,(每种颜色浓度有0~255档,理论上RGB就可以组成256的3次方中颜色组合)即每个LED需要24BIT数据,那么需要发送数据的总长度则为(要控制LED数量 n)*(24),每个LED保存24BIT将剩余位传给后面LED。全部数据发送完成后要继续发送大于24us的低电平作为RESET_CODE等才可以点亮。
引用大佬文章WS2812B彩灯 STM32HAL库开发:PWM+DMA(stm32f103c8t6)
了解驱动原理,如何驱动
使用PWM模式+DMA 方式
注意点 配置1.25us周期
(4+1)*(20+1)/84mhz =1.25us
ARR 为20
1码 0.8/1.25 * 20 =12.8 取13【不可以低于12,但13到18都可以】
0码 0.4/1.25 * 20 = 6.4 取6 【不可以高于6,但4到6都可以】
此处的 **0.8 0.4 **都取1码 0码高电平占比
使用 DMA 和直接控制 PWM 的方式在实现上的差异,主要是因为 DMA 可以自动处理数据传输,而直接控制 PWM 需要更细粒度的手动控制。以下是两种方式的关键区别和原因:
1. 使用 DMA 的优势
代码简化:
HAL_TIM_PWM_Start_DMA(&htim2, TIM_CHANNEL_2, (uint32_t *)Pixel_Buf, (Pixel_NUM + 1) * 24);
- 自动化数据传输: 当使用 DMA 时,定时器会自动从
Pixel_Buf
中读取数据并产生 PWM 信号。这意味着你不需要手动控制每个数据位的发送过程。 - 中断处理: DMA 在传输完成后会自动触发中断,可以在中断中处理后续操作,而不需要阻塞主循环。这使得系统的其他任务可以并行执行,提高了整体效率。
- CPU 占用低: CPU 可以在 DMA 传输的同时执行其他任务,减少了 CPU 的负担。
2. 直接 PWM 控制的复杂性
手动控制每个位:
for (int i = 0; i < Pixel_NUM; i++) {uint32_t pixel = Pixel_Buf[i]; for (int j = 23; j >= 0; j--) {if (pixel & (1 << j)) {// 发送 1 的 PWM 信号} else {// 发送 0 的 PWM 信号}}
}
- 时间控制: 直接控制 PWM 信号时,你需要精确计算每个数据位的高低电平持续时间。这需要通过循环和延迟函数手动控制,增加了代码的复杂性。
- 同步问题: 你需要确保在适当的时间发送每个信号,这可能导致 CPU 被阻塞,从而影响其他任务的执行。
- 更高的开发和调试成本: 由于需要处理信号的时序和高低电平,调试时可能需要更多的测试和验证,增加了开发复杂性。
总结
使用 DMA 能够大幅简化代码,因为它将复杂的信号生成过程自动化,开发者只需调用一条函数即可完成。而手动控制 PWM 则需要编写详细的代码来管理每个数据位的发送时序,这对于需要实时性和准确性的场合来说,编写和维护的成本更高。
如果你的应用场景允许使用 DMA,推荐优先考虑使用 DMA 来简化开发和提高系统性能。如果出于特定需求必须使用直接控制的方式,尽量优化代码结构,确保系统的效率和响应性。