恩智浦基于I2C接口的LED驱动器设计与实现
2011-01-26
LED无疑是当前最热的一个应用,无论是手持设备、游戏机、霓虹灯、广告牌等等,眩目的色彩及高质的光亮,总能第一时间吸引人的眼球。在当前众多的LED控制器面前,如何选择一款功能丰富且性价比又高的产品来迎合自己的设计,无疑是摆在每个设计师面前的问题。
最简单的LED驱动,我们可以用普通的I/O来实现。但I/O控制只能实现LED的ON与OFF,无法用来进行混光、闪烁等功能,而且每个LED都需要占用一个单独的I/O资源,无疑性价比很低。我们也可以用专用的大电流LED控制器来设计,但昂贵的成本首先会成为问题,而且设计复杂,程度也会跟着各种干扰的出现相应地提高。基于这些,恩智浦(NXP)推出一系列使用I2C接口的LED驱动器,它可以通过I2C接口的两根线,去同时控制从4个到24个不等LED的ON/OFF、闪烁及RGB混光。在混光方案里,每个LED都是由一个独立的8bit/256阶PWM来驱动。目前,通过芯片本身能驱动的每个LED电流范围为25mA到100mA之间。当然,对于一些大电流的应用场合,我们只需用外加场效应管的方式来实现。
这种基于I2C的LED控制方式,增加了设计的方便性与灵活性,而且也会减少在软硬件方面的投入,使披着神秘面纱的LED对我们来讲顿时显得简单和精彩。下面,我们将会以恩智浦LED驱动器PCA9633为例,通过几个简单的应用来全面阐述这种LED驱动器的优势所在。
PCA9633是四路LED驱动器,且每路可驱动最大25mA电流,并根据封装的不同提供了可选的固定I2C地址和带4位或7位硬件可编硬件地址(图1)。
从图1我们可以看到,每一路LED都是由一个单独的8bit/256阶的PWM来控制,且由于PWM足够快,使其理论上可以通过它所驱动的四个LED混出任意颜色的光。除了每一路单独的PWM,PCA9633还提供了一个Group PWM,通过它我们可以用来控制所调混色光的亮度及频率,弥补了只调单个PWM不能实现的一些功能。那么PCA9633究竟如何来实现调光呢?秘密还是在PWM上面。如果不使用PWM,那么它只能完成开和关的动作;低速的PWM只能实现LED闪烁,并不足以达到混色的目的;高速的PWM就可以实现RGB混色;如果PWM速度可控,那么就可以实现闪烁和混色的双重功能。而且通过可控的8bit/256阶PWM,加大了色阶提升了色彩的层次感(见图2)。
知道了混色的原理,那么一个具体的色彩又是如何产生的呢?我们知道人眼对色彩的感知是各种色彩亮度均值的叠加,我们可以通过控制PCA9633每个PWM的占空比,去控制所驱动LED的亮度。根据三基色原理,如果我们驱动的是RGB(或者RGBA)LED,那么通过调节这三个LED的不同光亮,就可以得到所要的色彩。图3是PCA9633控制RGB 三个LED来调粉色光的例子。
通过以上的描述,我们基本知道了PCA9633的内部结构和驱动原理。下面我们将会以PCA9633固定I2C地址的几个应用,来进一步理解这种LED控制器的优势所在。
第一个应用,我们将用PCA9633来控制亮度条。我们知道一般像亮度条这样的应用,往往需要用到大量LED串联来进行。如果用单个接口去控制每个LED,会使成本和软件复杂度大大增加。而通过I2C,在硬件上只需要两条控制线,在软件上只需发一条字节命令,就可以轻松进行操控。除此之外,由于I2C器件地址的唯一性,可以按所驱动LED的数量使用几个PCA9633来进行控制。如果实际应用中PCA9633本身的驱动电流不够,只需在外围加一个FET就可以轻松解决。另外,PCA9633独有的Group PWM使得控制整个亮度条的光强和闪烁变的得心应手。下面是其原理图(见图4),其中I2C master由系统提供,可以是MCU,也可以是逻辑电路。
图4中左半部为I2C的master,不作细述。右边最上为LED限流电阻,通常LED的前向电压为3V左右,根据不同的颜色和制造工艺会有一些差别。我们可以通过所需LED电流去计算这个限流电阻的值: R=(Vsupply-Vfsum)/If。如果所需的LED电流大于25mA,那么图中所加的FET可以轻松解决这一问题。当我们外加了FET以后,只需把PCA9633的相应寄存器的OUTDRV设为高就可以了,以区别于它的默认值。现在我们可以看到用PCA9633去控制如此多的LED,原理图相当简洁,同样在软件设置寄存器上也同样方便。PCA9633提供了简易且完整的内部寄存器,例如LED输出结构设置、节电模式设置、芯片使能模式设置、LED的输出状态设置,以及每个PWM和Group PWM的控制寄存器设置等。除此之外,PCA9633还提供了一个寄存器设置递增位,也就是说如果我们设置了这一位,那么我们可以通过一个指令序列来完成内部所有寄存器的顺序配置,这在一些特定的应用中是非常有用的,能最大程度节省软件和系统资源。下面,我们将通过另外一个例子来说明内部寄存器的设置。
第二个例子是我们用PCA9633来完成呼吸灯的功能。虽然PCA9633内部不带呼吸灯模块,但我们可以通过一些简单的寄存器设置来实现这个功能,这样相比于专用的呼吸灯芯片在成本上无疑有很大的优势。为了便于说明,我们只用PCA9633来控制一个LED的呼吸动作,原理图很简单,在此略去,通过控制这一个LED的渐亮与渐暗过程以达到呼吸的目的。要实现这个功能,PCA9633的独立PWM将是最主要的因素。如前我们已经提到每个LED都是由一个8bit/256阶PWM来控制,那么也就是说,每个灯有256段亮暗色阶可调,可以完美实现呼吸功能。具体,我们通过控制PWM的占空比来完成。如果我们的LED是由PCA9633的PWM0来控制,那么PWM0的占空比将决定这个LED的亮度:Bright(duty cycle)=PWM0[7:0]/256。撑握了这一原则,我们就可以通过I2C往PCA9633的寄存器上写点什么了:
START
0xC4 (往PCA9633 I2C设备地址C4写操作)
00h=0x00; 01h=0x00 (设置LED的输出结构为开漏)
08h=0x02 (设置LED由PWM0来控制)
Delay 1 second (延时1秒进行呼吸)
02h=bright; For bright=0; bright<255;bright++ (LED从0到255渐亮)
Delay 10 ms (完成渐亮延时10毫秒继续)
02h=bright; For bright=255; bright>0;bright- - (LED从255到0渐暗)
STOP
到此,一个完整的呼吸过程就完成了,用几个简单的寄存器设置,就完成了看起来似乎只有用复杂系统或专用芯片才能做的事情。从以上两个例子,我们可以看到用恩智浦的I2C LED驱动器,不论是硬件上还是软件上都是非常简单和易操作的,而且用此类器件所能实现的功能,丝毫不比一些系统和专有芯片逊色。
综上所述,恩智浦I2C LED驱动器提供了高性价比的LED设计方案,相比于用GPIO或专用LED驱动器,不仅节省了系统资源,也使设计的成本和复杂度大大减少,并可以有效提高设计的可靠性和驱动光的均匀性。此外,采用此类LED驱动器,可以很有效地帮助我们减少设计周期并提升设计灵活性。恩智浦目前可以向客户提供从4路到24路不等的I2C LED驱动器,并已应用于汽车、家电、通信等各大领域。