原创 基于RGB彩灯控制器设计

2010-8-4 21:26 3184 7 7 分类: 消费电子

 


简介:


     LPD6803是专为LED灯光系统设计的驱动芯片,它采用先进的高压CMOS工艺,提供三路恒流驱动和灰度调制输出,特别适合离散的多灰度全彩色灯光系统。


    LPD6803芯片包括串行移位寄存器和级联驱动短路,灰度数据在时钟上沿移入串行移位寄存器,转储后经脉宽转为3端口并行输出,串行移位寄存器和灰度计数器可以有不同的时钟信号控制。同时,LPD6803将数据和控制信号经内部驱动后输出给下一级电路。


LPD6803的基本框图和基本时序及案例




A、           先移入32BIT的‘0’作为起始帧,再移入各数据帧,起始帧和数据帧均是高位先移入,每个数据位在DCLK上升沿被打入;


B、            第一个数据帧是对应距移入端最近LED灯,其格式包括1比特起始位 ‘1’ + 三组 5 比特的灰度值;


C、            依次移入各点数据后,加对应点数的附加脉冲,新数据即开始失效。


控制电路与软件设计参考:


通过CMODE管脚的设置,LPD6803的灰度计数器可采用DCLK作为时钟源(CMODE=0),也可以用内置的1.2MHz(误差±15%)震荡器输出作为时钟源(CMODE=1或悬空),前者一般配合基于CPLD/FPGA等成本较高的控制系统,后者则常用于低成本的单片机控制系统。


在CMODE=1模式,MCU通过SPI或二根GPIO口线把显示数据打入芯片,其后各芯片按照打入的灰度值自动产生相应占空比的驱动输出,数据传输完毕后,MCU可以处理其他事务,此期间各LPD6803将继续保持原占空比的驱动输出(FREE_RUN模式),直至MCU发出下一组的更新数据为止。


注意:在DCLK的上升沿把所有数据打入芯片的过程结束后,需要多发送若干个DCLK脉冲(DIN=0),原则上传输链中有多少组点就多发相应数目的脉冲,这是为了让后续芯片内置的锁相再生电路能够正常工作所必须的。


为了使LPD6803仅用较少的数据产生更细腻的灰度层次,当GMODE=0/CMODE=0时,芯片内置的SUPER_PWM机制可以把5比特的数据转换为非线性的256及灰度输出,最小开启宽度为1T,最大开启宽度为256T(T为灰度时钟源周期)。


当GMODE=1或悬空时,输出为线性32级灰度,最小开启宽度为4T,最大开启宽度为128T。


C51例程:


 


//SDO,SCK为数据和移位输出口,位变量,nDots为灯的个数


//本程序仅适用于GMODE=1,CMODE=1的情况


//首先输出32个‘0’的起始帧


SCLK = 0;


SDO = 0;


for(i=0; i < 32; i++)


{SCLK = 1; SCLK = 0;}


     //再输出nDots 点的数据,这里假设个点的颜色都是(dr , dg , db)


     //dr ,dg , db 为红绿兰的灰度值 0---31


         for(i=0 ; i < nDots ; i++)


         {


          SDO = 1 ; SCLK = 1; SCLK = 0;  //首先输出1个‘1’起始帧


 


             // 输出5位红色数据


             mask = 0x10;


             for(j=0; j < 5; j++)


             {


               if(mask & dr)  SDO =1;


                else  SDO = 0;


                SCLK = 1; SCLK = 0;


                mask >>= 1;


}


 


//输出5位绿色数据


mask = 0x10;


             for(j=0; j < 5; j++)


             {


               if(mask & dg)  SDO =1;


                else  SDO = 0;


                SCLK = 1; SCLK = 0;


                mask >>= 1;


}


 


//输出5位兰色数据


mask = 0x10;


             for(j=0; j < 5; j++)


             {


               if(mask & db)  SDO =1;


                else  SDO = 0;


                SCLK = 1; SCLK = 0;


                mask >>= 1;


}


}


  //输出完nDots的数据后,还要补nDots 个脉冲


  SDO = 0;


for(i=0; i < nDots; i++)


{SCLK = 1; SCLK = 0;}


  //传输结束


Delay();  // 这里加延时,或转去做其他处理待到一定时间后(比如1/30秒),再//过来刷新显示

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
7
关闭 站长推荐上一条 /3 下一条