MXCHIP使用心得+(2)Using Timer+PWM to drive WS2811 LED-Strip
时间:10-02
整理:3721RD
点击:
Using Timer+PWM to drive WS2811 LED-Strip
WS2811的LED创新性的把5050LED和LED驱动集成在同一个封装中。超级简化了LED灯带的设计。
●输出端口耐压12V.
●芯片内置稳压管,24V以下电源端只需串电阻到ICVDD脚,无需外加稳压管.
●灰度调节电路(256级灰度可调)
.●内置信号整形电路,任何一个IC收到信号后经过.
●其他各种LED灯饰产品.
●波形整形再输出,保证线路波形畸变不会累加
.●内置上电复位和掉电复位电路.
●PWM控制端能够实现256 级调节,扫描频率2.5KHz.
●串行接口级联接口,能通过一根信号线完成数据的接收与解码.
●任意两点传传输距离超过20米而无需增加任何电路.
●数据发送速度可达400Kbps与800Kbps两种模数
其时序如下图:
上述波形中,最短延时为0.25us,及时MCU单周期10MHz运行,也就能执行25条指令。使用Timer定时中断已经无法满足时序要求。而使用汇编指令循环延时,又导致了阻塞运行,无法响应其他工作。
因此采用PWM+DMA来实现时序波形生成。
在STM32Cube中,设置如下:
设置PWM周期为75*1/60MHz =1.25us,同时在代码中设置
uint8_t WS28xx_T0H = 25;
uint8_t WS28xx_T1H = 50;
分别生成0.25us和1.0us的时间。
设置DMA如下:
在代码中,设置PWM的时序功能如下:
void Set_WS28xx_Duty(PColor pColors, uint16_t counts)
{
if(counts > LED_COUNTS) return ;
uint8_t mask = 0x01 << 7;
uint8_t tmp;
for(int i = 0; i < counts; i++) {
mask = 0x01 << 7;
tmp = pColors.g& LAST_BIT_MASK;
for(int j = 0; j < 8; j++) {
if (mask & tmp)
duty[i*24+j] = WS28xx_T1H;
else
duty[i*24+j] = WS28xx_T0H;
mask >>= 1;
}
mask = 0x01 << 7;
tmp = pColors.r & LAST_BIT_MASK;
for(int j = 0; j < 8; j++) {
if (mask & tmp)
duty[i*24 +8 + j] = WS28xx_T1H;
else
duty[i*24 +8 + j] = WS28xx_T0H;
mask >>= 1;
}
mask = 0x01 << 7;
tmp = pColors.b & LAST_BIT_MASK;
for(int j = 0; j < 8; j++) {
if (mask & tmp)
duty[i*24 + 16 + j] = WS28xx_T1H;
else
duty[i*24 + 16 + j] = WS28xx_T0H;
mask >>= 1;
}
}
for(int i = LED_COUNTS*24; i < (DUTY_COUNTS-24*LED_COUNTS); i++) {
duty = 0;
}
}
最终生成的时序波形如下图:
运行实物效果图:
http://v.youku.com/v_show/id_XODU5MjgxMzY4.html
http://v.youku.com/v_show/id_XODU5MjgwNjEy.html