驱动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{
}
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)。