驱动RGB灯带MCU推荐
本文仅分享个人工作中积累的经验,无任何商业行为,若有更好的方案欢迎交流共同进步。
一、RGB灯带驱动IC简介
市面上存在多种RGB驱动IC,比如:WS2812,YX1903B,TC1903, SM16703P等;除此之外还有一种RGBW驱动IC,其相比上述驱动IC多了一个w驱动通道,工作方式大同小异。最近各家MCU急缺的情况下,各位在选型时一定要注意选取IC的归零码脉宽时间(一般是宽脉宽时间为900ns,短脉宽时间为300ns,参数允许波动范围可能会因IC存在一定差异),这样能够保证最快的速度更换IC。
二、MCU推荐
1.模拟时序驱动
本人使用赛元,新塘,沁恒微等国产51已模拟方式实现驱动RGB灯带。需要注意的地方是在发送一帧数据时关闭总中断,避免模拟数据脉宽时间被干扰。一般选择主频可达24M以上,同时需要根据驱动RGB灯带长度选取RAM资源大小。模拟实现核心代码如下所示:
#define cBIT1 {P26=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();P26=0;}
#define cBIT0 {P26=1;_nop_();P26=0;_nop_();_nop_();}
UINT8 bdata LED_DATA;
sbit DAT_bit0 = LED_DATA^7;
sbit DAT_bit1 = LED_DATA^6;
sbit DAT_bit2 = LED_DATA^5;
sbit DAT_bit3 = LED_DATA^4;
sbit DAT_bit4 = LED_DATA^3;
sbit DAT_bit5 = LED_DATA^2;
sbit DAT_bit6 = LED_DATA^1;
sbit DAT_bit7 = LED_DATA^0;
void sRGBSend(unsigned char dat)
{
LED_DATA = dat;
if(DAT_bit0){cBIT1}else{cBIT0}
if(DAT_bit1){cBIT1}else{cBIT0}
if(DAT_bit2){cBIT1}else{cBIT0}
if(DAT_bit3){cBIT1}else{cBIT0}
if(DAT_bit4){cBIT1}else{cBIT0}
if(DAT_bit5){cBIT1}else{cBIT0}
if(DAT_bit6){cBIT1}else{cBIT0}
if(DAT_bit7){cBIT1}else{cBIT0}
}
上述关于BIT0和BIT1使用NOP个数因MCU不同可能会存在差异,需使用示波器自行测试验证。
2.硬件外设实现
对于STM32等32位强大类型的MCU,则可通过SPI,PWM功能实现驱动,但是对于低成本的产品此类MCU成本较高,这里不再赘述。锦锐科技的CA51F5系列MCU,CA51F5系列MCU自带两路级联LED驱动通道(比较可惜是此系列MCU无ADC功能,据说后期开发)。CA51F5系列初始化以及数据发送代码如下:
void sRGBInit(void)
{
//级联驱动RGB初始化
PWM2DIVH = 0; PWM2DIVL = 20; //周期配置寄存器
PWM2DUTH = 0; PWM2DUTL = 5; //设置0码时间
LEDUTH = 0; LEDUTL = 14; //设置1码时间
PWM2CON = 0x3A;
PWM2CKD = 0; //PWM2工作不分频
LEDWTMH = 0;LEDWTML = 5; //设置暂停时间
PWMEN = 4; //PWM2使能
EA = 1;
}
void sRGBSendData(u8 *pRGBDataBuff,u16 wBufferLen)
{
u16 wTemp;
for(wTemp = 0;wTemp <wBufferLen;wTemp++ )
{
while(LEFLG & 0x40);
LEDAT1 = *(pRGBDataBuff+bTemp);
}
}
三、总结
驱动此类IC其实很简单,我们只需要研究透彻其工作原理即可。分享给大家一些驱动思路供大家进行学习,快速找到适合自己产品的开发方案,希望我们可以一起共同学习进步(可私信加V)。