微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > 射频无线通信设计 > MXCHIP使用心得+(2)Using Timer+PWM to drive WS2811 LED-Strip

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


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top