摘 要:PCA9633是一款通过I2C总线控制的4路LED控制芯片,每一路LED输出的状态可以设置为没有PWM(Pulse Width Modulation)控制的关或开,或者由其独立的PWM控制器的值和组PWM控制器的值确定。LED驱动输出的信号频率为97 kHz,占空比在0%~99.6%可调。本文介绍PCA9633的I2C协议,重点介绍它与CPU的硬件电路图以及通过C语言编程实现I2C时序,驱动LED灯发光,最后给出应用实例。
关键词: PCA9633;RGB LED;I2C时序
0 引言
在酒店、舞台、娱乐场、咖啡厅、商场、生日宴会、家庭影院、节庆日等室内外场所,为了展示情调装饰,烘托气氛,经常看到RGB LED灯的大量使用。LED是一种性能优良的显示器件,具有寿命长、节电、高亮度、多种发光颜色、响应速度快和驱动电压低等优点,在节省能源的同时还可以通过PWM器件调节LED发光强度,依据RGB三原色混光原理调出多种颜色,再通过MCU智能控制实现多种显示效果。本文主要是介绍飞利浦公司生产的一款RGB LED控制器PCA9633的应用。
1 PCA9633芯片的原理及特点
1.1 PCA9633的特点[2-3]
PCA9633是I2C总线控制的可编程PWM输出的4位LED驱动器件,主要应用LED RGB红光/蓝光/绿光/琥珀色的混光,性能指标如下:
(1)4路LED驱动,每路驱动可以通过软件编程为四种状态,分别是:开、关、可编程PWM闪烁控制输出、可编程每路灰度级别,同时支持4路整体亮度调节的PWM混光输出。
(2)调光控制,PWM输出频率97 kHz,每路有256个灰度级别。
(3)闪烁控制,PWM可编程频率范围0.093 Hz~24 Hz,占空比可编程范围0%~99.6%。
(4)可通过190 Hz的PWM输出对四路PWM输出整体亮度256级调节。
(5)4位输出可编程设置为推拉输出(在5 V时,灌电流25 mA,拉电流10 mA)。
(6)7个硬件地址设定引脚,同一I2C总线最多可接126片。
(7)每片PCA9633有4个可编程软件地址:一个全部响应地址和三个子地址。
(8)内置25 MHz晶振和上电复位电路,也可通过I2C总线实现软件复位。
(9)SDA/SCL内置噪声滤波器,支持1 MHz的I2C快速模式。
(10)支持热插入,低待机电流,支持电压范围:2.3~5.5 V。
其引脚图如图1所示。
引脚描述:
(1)A6~A0:7个地址输入引脚;
(2)LED3~LED0:4位LED输出驱动引脚;
(3)OE:输出使能引脚,低电平有效;
(4)Vss,VDD:分别是地和电源;
(5)SDA:I2C总线的数据输入/输出引脚;
(6)SCL:I2C总线的时钟输入引脚。
1.2 PCA9633电路连接图[1-3]
单片机与PCA9633芯片的连接采用I2C总线的方式,I2C接口引脚描述:
(1)串行数据输入/输出(SDA):单片机与PCA9633通信的数据输入/输出线。
(2)串行时钟输入(SCL):单片机与PCA9633通信时的同步时钟。
(3)片选输入(OE):输出使能端,当OE有效时,PCA9633的LEDn输出有效。
PCA9633的每一路LED驱动输出电流最大25 mA,当RGB灯的工作电流不大时,可以直接接输出,如果RGB的电流大,可以在PCA9633的LED驱动输出端加场效应管,例如AP2306,可以提高驱动能力,输出的连接电路如图2所示。根据需要,LED可以串接多个,多个LED串接时,要考虑LED的管压降,所以要提高LED的电源电压。为了增加I2C总线的通信距离,增加PCA9600驱动器。硬件电路连接图见图2。
1.3 PCA9633芯片寄存器功能描述[2]
PCA9633对RGB LED灯的控制(亮度,明暗、闪烁,灯的整体控制),是通过设置其相关的寄存器完成的,下面介绍其有关寄存器的功能与设置方法。
1.3.1 器件地址
PCA9633是4位I2C总线的LED驱动器,与主机通信遵循I2C协议的格式,主机先发出启动信号,随后发出从机(PCA9633)的地址,封装为16脚的PCA9633,有7个地址引脚分别为A0~A6,从机地址最多有27,即128个,在这128个地址中,其中软件复位地址(0x06)和LED呼叫地址(0x0C)这两个地址不能作为从机地址。
(1)正常的I2C-BUS地址
封装为16脚的PCA9633从机地址的组成如图3所示,最高7位是地址线,最低位是读写控制位,如果是读操作最低位为“1”,若是写操作最低位为“0”。还有一些地址是保留的,最好不要设置为从机地址,例如:(0000 011,1111 1xx,0000 000,0000 1xx)。
(2)LED ALL Call IIC-bus address全呼叫地址
全呼叫寄存器的地址是0x0C,功能是当PCA9633芯片的控制寄存器中的某个寄存器设置为全呼叫时,那么I2C总线上所有PCA9633器件都可以在同一时刻被寻址。上电时,全呼叫寄存器是使能的,默认值是0xE0h或0xE1h,当主机发送E0h或E1h时,PCA9633会出一个应答信号,所以全呼叫地址的值0xE0h和0xE1h不能作为从机地址。全呼地址的值是可以通过I2C总线编程的。
(3)LED Sub Call IIC-bus address子呼叫地址
PCA9633有3个子呼叫地址寄存器,可以通过I2C总线设置呼叫总线上的任一PCA9633器件,3个子呼叫地址为0x09h,0x0ah,0x0bh。上电时,3个子地址寄存器为默认的值(写操作是0xE2h,读操作是0xE3h)、(写操作是0xE4h,读操作是0xE5h)、(写操作是0xE8h,读操作是0xE9h);初始状态下子呼叫寄存器是禁止使能的,所以这6个值可以作为从机地址。
(4)Software Reset IIC-bus address软件复位地址
当PCA9633需要主机软件编程复位时,可以使用这个地址,它的地址为0x06h。
1.3.2 PCA9633控制寄存器[2]
PCA9633有13个控制寄存器,通过设置这些寄存器来改变4路LED输出的状态,可以实现独立控制或整体控制4路LED亮度和闪烁。每个寄存器的数据位详细说明可以参阅它的数据手册。
(1)MODE1-模式1寄存器(地址0x00h):主要用来设置子呼叫地址或全呼叫地址是否使能。
(2)MODE2-模式2寄存器(地址0x01h):主要功能是设置灯的输出逻辑是否反转、配置4位LED是OD门还是推拉输出结构输出,以及输出禁止时4位LED输出是高电平、低电平还是高阻状态。
(3)PWMx(x可以取值0,1,2,3)-单个LED灯亮度控制寄存器(地址分别是0x02h,0x03h,0x04h,0x05h):4路LED输出控制信号是频率为97 kHz,占空比可调的矩形波,通过设置亮度控制寄存器的值,改变占空比,调节LED灯的亮度,占空比值越大,灯越亮。
(4)组控占空比因数寄存器(Group duty cycle control,GRPPWM,地址0x06h):功能是同时设置4个LED灯亮的时间,通过设置GRPPWM的值来调整占空比从0%~99.6%变化,占空比值越大,灯亮的时间越长。
(5)组频率控制寄存器(Group frequency,GRPFREQ):其功能是同时设置4位LED输出信号的频率,即改变LED闪烁的频率。
(6)灯输出状态寄存器(LED driver outputstate,LEDOUT,地址为0x08h):其功能是设置LED驱动输出的状态,通过编程可以设置4位LED灯灭、亮、单个灯亮、4个LED灯闪烁。
2 C语言编程软件设计[2、4、5]
2.1 写PCA9633一个控制寄存器
PCA9633遵循I2C总线协议[3],写一个控制寄存器的时序如图4所示。
主机与从机通信时,开始时主机先发起始信号,这个起始信号要满足I2C协议的起始条件,然后是从机的写地址,由图2知从机的地址为0xa2h(写)、0xa3h(读),随后是从机发送应答信号,从机应答后主机发送某一个控制寄存器的地址,从机再次应答后,主机在发送控制寄存器的数据,从机收到后发送主机应答信号,主机收到应答信号后发送停止条件,这样就结束一个控制寄存器的写操作。
例如:写某个寄存器操作定义函数名定义为write9633(),函数的功能描述如下:
void write9633(unsigned char address1,unsigned char address2,unsigned char info)
{
start();//起始信号writebyte(address1);
//从机地址
clock();//应答信号
writebyte(address2);//写MODE1寄存器地址
clock();
writebyte(info);//写MODE1寄存器数据
clock();
stop();//主机发停止信号
delay1(5000);//延时
}
其中address1为从机地址,address2为控制寄存器地址,info为要写入控制寄存器的数据。有关上述子函数的实现可以参考I2C协议的编程,由于篇幅所限,不再详述。
2.2 组控4位LED灯闪烁的主要程序
PCA9633控制寄存器的宏定义:
#define MODE1 0x00
#define MODE2 0x01
#define PWM0 0x02
#define PWM1 0x03
#define PWM2 0x04
#define PWM3 0x05
#define GRPPWM 0x06
#define GRPPFREQ0x07
#define LEDOUT 0x08
#define SUBADR1 0x09
#define SUBADR2 0x0A
#define SUBADR3 0x0B
#define ALLCALLADR 0x0C
sbit cs=P2^5;
write9633(0xa2,MODE1,0x00);
//写模式寄存器1,0xa2为从机地址
write9633(0xa2,MODE2,0x22);
//写模式寄存器2,cs=1时,LEDn高阻抗,灯不亮
write9633(oxa2,LEDOUT,0xff);
write9633(0xa2,GRPPWM,0xa0);
//改变占空因数,值越小,亮的时间越短
write9633(0xa2,GRPPFREQ,0xa0);
//控制4个灯的闪烁频率,值越小,闪烁越快
cs=0;//输出使能
write9633(0xa2,PWM0,100);
//100数值是灯的亮度,根据要求可以改变
write9633(0xa2,PWM1,100);
write9633(0xa2,PWM2,100);
write9633(0xa2,PWM3,100);
程序里对MODE2寄存器的设置是基于LED输出配置是OD门结构,输出配置如果是推拉输出结构,即输出加FET驱动时,模式2(MODE2)寄存器设置0x26h。
如果I2C总线上连接多个PCA9633,则可以使用LED呼叫地址,即上述程序里地址0xa2改为0xe0就可以了。这样可以节约I2C总线操作指令。0xe0是系统上电默认的值,也可以通过写LED呼叫地址改变,通过写指令write9633(0xa2,0x0c,0xb2)即改为0xb2。
2.3 实现呼吸灯的效果
循环改变亮度控制寄存器的数值,可以实现呼吸灯的效果,以从机地址0xa22为例说明,主要代码如下:
for(i=0;i<255;i++)
{ write9633(0xa2,PWM0,i);
write9633 (0xa2,PWM1,i);
write9633(0xa2,PWM2,i);
write9633(0xa2,PWM3,i);
delay(500);
}
3 结束语
PCA9633在LED控制方面性能显著,操作方便。特别是为红/绿/蓝/琥珀(RGBA)色的混合应用进行了优化。另外,它还有3个子呼地址可以实现特定的组响应I2C总线。例如,可以允许所有的红色LED灯亮或灭或实现跑马灯的效果,从而减少I2C指令。通过改变红、黄、绿LED的输出状态,依据RGB混光原理来实现任意颜色的显示。
参考文献
[1] 倪晓军,章韵.单片机原理与接口技术[M].北京:清华大学出版社,2009.
[2] 恩智浦.PCA9633 data sheet[EB/OL].(2006)[2014-11-14].http://www.cn.nxp.com/documents/data_sheet/PCA9633.pdf.
[3] 何立民.I2C总线应用系统设计[M].北京:北京航空航天大学出版社,1995.
[4] 马忠梅.单片机的C语言应用程序设计[M].北京:北京航空航天大学出版社,2003.
[5] 徐爱钧,彭秀华.单片机高级语言C51应用程序设计[M].北京:电子工业出版社,1998.