4142|0

32

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

MXCHIP使用心得+(2)Using Timer+PWM to drive WS2811 LED-Strip [复制链接]




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



查看本帖全部内容,请登录或者注册
此帖出自无线连接论坛
点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
快速回复 返回顶部 返回列表