MAX6964 LED驱动器的PWM亮度控制
Abstract
本应用笔记介绍MAX6964 LED驱动器的特性以及在需要亮度控制的应用中怎样正确使用这些特性。本应用笔记还提供实例程序,演示主机和MAX6964每个端口的亮度控制选项。LED亮度控制功能非常适合汽车应用,在这种应用中,白天和晚上不同状态下需要对LED进行亮度调整。
MAX6964是大电流输出、17端口LED驱动器,具有8位脉冲宽度调制(PWM)亮度控制功能。每个端口支持最大50mA的吸收电流。流入地引脚的最大总吸收电流被限制为350mA。8位PWM亮度控制被分成应用于所有端口的4位主机控制,以及另外4位独立端口控制。主机亮度控制可以用于调整普通设备LED亮度,以适应环境亮度变化,例如汽车在白天和晚上的情况。独立端口控制可以用于产生符合应用需求的亮度。或者,可以采用4个全局控制位来同时控制所有独立端口的亮度。寄存器0x0E的D0位到D3位可以用于全局或者端口O16亮度控制,而且,可以结合主机和独立亮度控制功能来产生所有端口的渐暗效果。
大家通常都知道,如果光源接通/关断足够快,那么,人眼感觉到物体是一直亮着的。PWM亮度控制功能改变接通时间,同时将接通/关断保持在固定频率上,从而调整感知亮度。为避免闪烁效应,PWM接通/关断频率一般要高于100Hz。MAX6964的PWM亮度控制由内部振荡器进行驱动,额定频率为32kHz。MAX6964的PWM持续240个时钟周期,产生32000/240 = 133.33Hz的PWM接通/关断频率。
当相应的极性位是0时,和MAX6964输出相连接的LED的亮度取决于主机和独立端口控制的重叠接通时间(逻辑低电平)。
MAX6964的主机亮度控制由寄存器0x0F的D7–D4位确定。这4个主机控制位将PWM周期分成15个时间片。主机接通时间片分别是0001、0010、...、1101和1110位模式的1/15、2/15、...、13/15和14/15。
每个端口以4位分组的独立端口控制位位于寄存器0x10至0x17。端口16控制位位于寄存器0x0F的D3至D0。如果使能了该选项,寄存器0x0F的这些位(D3–D0)也被用于全局控制。每个主机时间片含有16个内部振荡器时钟周期。这些时钟周期可以分别工作在具有0000、0001、...、1110和1111位模式的1/16、2/16、...、15/16和16/16。
图1显示了当极性为是0时,相应于0010位模式2/15主机接通时间的端口输出波形,以及相应于0001位模式2/16独立端口接通时间的端口输出波形。有两种主机接通时间片,二者都可以接通2/16,由独立端口的接通时间决定。
端口7到端口0以及端口15到端口8的相位0极性位分别位于寄存器0x02和0x03。同样的,端口7到端口0以及端口15到端口8的相位1极性位位于寄存器0x0A和0x0B。端口16的极性由寄存器0x0F的相位1 (D5)和相位0 (D4)位指示。当没有使能闪烁特性时,只和相位0极性位有关。
图2显示了具有相同主机和独立端口位模式0010和0001的端口输出波形,但是极性位是1。对比图1和图2,可以看出,接通和关断时间相反—它们构成了互补波形。最好采用极性0来设置亮度等级,但是闪烁时需要采用极性1。
MAX6964驱动LED时,触发BLINK输入,或者翻转闪烁翻转位(寄存器0x0F的D1),使其闪烁(接通和关断)。闪烁使能位(寄存器0x0F的D0)必须设置为1,以激活BLINK输入和闪烁翻转位。每次闪烁时,主机控制器需要改变BLINK输入逻辑电平或者写入MAX6964。使能闪烁(D0 = 1)后,某一端口的LED极性与相位0或者相位1相关,具体取决于BLINK输入和闪烁翻转位异或的结果是0还是1。
为激活所需端口的闪烁功能,相应的相位0和1极性位必须不同。当使能了闪烁后,由于PWM亮度控制还在起作用,闪烁LED不但可以接通和关断,而且还可以受控,在正常和互补波形基础上,亮度在较亮和较暗模式之间变化。而且,通过分别选择不同端口相位0和1逻辑电平,它们能够反相闪烁,或者根本就不闪烁。例如,设置端口1相位0位为0,相位1位为1,端口2相位0位为1,相位1位为0,使它们反相闪烁。设置端口的相位0和相位1位同时为0或者1将使端口停留在较亮或者较暗模式中。
图3显示了最初以及互补波形相位0和相位1的闪烁。相位0和相位1的持续时间取决于主机控制器的工作,一般要比明显闪烁的单个PWM周期长得多。
下面的I2C命令序列发送给MAX6964,以接通LED,达到一定的PWM亮度等级。
下面的3条I2C写命令可用于接通O16 LED,达到最小亮度等级。MAX6964的I2C器件地址是0x49。
0x49 0x0F 0x30 // Turn off the global bit 0x49 0x0E 0x10 // Select 1/15th for master and 1/16th // for O16 0x49 0x0F 0x00 // Set phase 0 and 1 polarity bits of // O16 to 00
可以采用下面的I2C写命令来接通所有的LED,达到最小亮度等级。
0x49 0x0F 0x30 // Turn off the global bit 0x49 0x0E 0x10 // Select 1/15th for master and 1/16th for O16 0x49 0x0F 0x00 // Set phase 0 and 1 polarity bits of O16 to 00 0x49 0x10 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 // Set 1/16th for all ports 0x49 0x02 0x00 0x00 // Set phase 0 polarity bits for all ports
最后两条命令利用了寄存器地址自动递增特性,支持使用单条写命令写入多个寄存器。
LED有时需要在上电期间逐渐接通。可以在每个主机设置中,设置主机控制为低到高,改变每个端口控制为从低到高,从而调整LED亮度从低到高。由于某些主机和独立端口组合产生相同或者相似的亮度等级,并不需要进行所有的设置来产生亮度递增。在高亮度等级上,必须跳过某些底层独立端口设置(表1)。由于跳过了某些相同或者相似的亮度等级,亮度等级的增加基于双环(主机亮度变化为一个环,独立端口为第二个环)。表1只显示了240种组合中的59步。
Individual | Master | Intensity | Individual | Master | Intensity |
X | 0 | 0 | C | 4 | 52 |
0 | 1 | 1 | D | 4 | 56 |
1 | 1 | 2 | E | 4 | 60 |
2 | 1 | 3 | F | 4 | 64 |
3 | 1 | 4 | C | 5 | 65 |
4 | 1 | 5 | D | 5 | 70 |
5 | 1 | 6 | E | 5 | 75 |
6 | 1 | 7 | F | 5 | 80 |
7 | 1 | 8 | D | 6 | 84 |
8 | 1 | 9 | E | 6 | 90 |
9 | 1 | 10 | F | 6 | 96 |
A | 1 | 11 | D | 7 | 98 |
B | 1 | 12 | E | 7 | 105 |
C | 1 | 13 | F | 7 | 112 |
D | 1 | 14 | E | 8 | 120 |
E | 1 | 15 | F | 8 | 128 |
F | 1 | 16 | E | 9 | 135 |
8 | 2 | 18 | F | 9 | 144 |
9 | 2 | 20 | E | A | 150 |
A | 2 | 22 | F | A | 160 |
B | 2 | 24 | E | B | 165 |
C | 2 | 26 | F | B | 176 |
D | 2 | 28 | E | D | 195 |
E | 2 | 30 | F | D | 208 |
F | 2 | 32 | E | E | 210 |
A | 3 | 33 | F | E | 224 |
B | 3 | 36 | E | F | 225 |
C | 3 | 39 | F | F | 240 |
D | 3 | 42 | |||
E | 3 | 45 | |||
F | 3 | 48 |
下面的文本是伪编程代码,在LoopLength x WaitTime秒内逐步接通LED。I2C程序向MAX6964寄存器发出一条写命令,提供由阵列定义的亮度。利用寄存器地址自动递增特性,可以完成多次写操作。
LoopLength; // Total number of step in the increase in // intensity MasterPort(2, LoopLength); // Array for master/port setting pairs of every // step StepTime; // Lighting duration at each intensity step For i = 1 to LoopLength // Start intensity increasing loop I2C(Write, 0x0E, MasterPort(1, i)); // Set master intensity level I2C(Write, 0x10, MasterPort(2, i), MasterPort(2, i), ...); // Set port // intensity // levels Wait(StepTime); // Lighting up End // End loop
LED亮度等级取决于主机和独立端口PWM控制位选择。两个不同的主机和独立端口组合可以复现某些亮度等级。另一方面,某些亮度等级则不可能由任何组合实现。表2列出了对应于主机和独立端口PWM亮度控制位的亮度等级。亮度等级是当极性位为0时,表中的数字除以240。该表沿对角线对称,从左上角第二行到右下角倒数第二行。
Master Port Intensity | |||||||||||||||||
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | ||
Individual Port Intensity |
0 | off | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
1 | off | 2 | 4 | 6 | 8 | 10 | 12 | 14 | 16 | 18 | 20 | 22 | 24 | 26 | 28 | 30 | |
2 | off | 3 | 6 | 9 | 12 | 15 | 18 | 21 | 24 | 27 | 30 | 33 | 36 | 39 | 42 | 45 | |
3 | off | 4 | 8 | 12 | 16 | 20 | 24 | 28 | 32 | 36 | 40 | 44 | 48 | 52 | 56 | 60 | |
4 | off | 5 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 | 55 | 60 | 65 | 70 | 75 | |
5 | off | 6 | 12 | 18 | 24 | 30 | 36 | 42 | 48 | 54 | 60 | 66 | 72 | 78 | 84 | 90 | |
6 | off | 7 | 14 | 21 | 28 | 35 | 42 | 49 | 56 | 63 | 70 | 77 | 84 | 91 | 98 | 105 | |
7 | off | 8 | 16 | 24 | 32 | 40 | 48 | 56 | 64 | 72 | 80 | 88 | 96 | 104 | 112 | 120 | |
8 | off | 9 | 18 | 27 | 36 | 45 | 54 | 63 | 72 | 81 | 90 | 99 | 108 | 117 | 126 | 135 | |
9 | off | 10 | 20 | 30 | 40 | 50 | 60 | 70 | 80 | 90 | 100 | 110 | 120 | 130 | 140 | 150 | |
A | off | 11 | 22 | 33 | 44 | 55 | 66 | 77 | 88 | 99 | 110 | 121 | 132 | 143 | 154 | 165 | |
B | off | 12 | 24 | 36 | 48 | 60 | 72 | 84 | 96 | 108 | 120 | 132 | 144 | 156 | 168 | 180 | |
C | off | 13 | 26 | 39 | 52 | 65 | 78 | 91 | 104 | 117 | 130 | 143 | 156 | 169 | 182 | 195 | |
D | off | 14 | 28 | 42 | 56 | 70 | 84 | 98 | 112 | 126 | 140 | 154 | 168 | 182 | 196 | 210 | |
E | off | 15 | 30 | 45 | 60 | 75 | 90 | 105 | 120 | 135 | 150 | 165 | 180 | 195 | 210 | 225 | |
F | off | 16 | 32 | 48 | 64 | 80 | 96 | 112 | 128 | 144 | 160 | 176 | 192 | 208 | 224 | 240 |
表2中,注意,16之前的整数是连续的。16以后,没有了素数(即,不能通过1到16和1到15之间的数相乘得到的数)。此外,可以通过主机和独立端口设置的多种选择来产生较多的数字/事件。表3显示了亮度等级线性递增趋势。Short1列的亮度等级跳过了2/240,Short2列跳过了4/240。您还可以通过使用这些主机和独立端口组合以及表2中的对角线实现平方递增趋势。或者,从表2中选取最近组合得到所需要的递增趋势。
Choice 1 | Choice 2 | Intensity Level x 240 | ||||
Individual | Master | Individual | Master | Full | Short1 | Short2 |
X | 0 | X | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 1 | ||
1 | 1 | 0 | 2 | 2 | 2 | |
2 | 1 | 0 | 3 | 3 | ||
3 | 1 | 0 | 4 | 4 | 4 | 4 |
4 | 1 | 0 | 5 | 5 | ||
5 | 1 | 0 | 6 | 6 | 6 | |
6 | 1 | 0 | 7 | 7 | ||
7 | 1 | 0 | 8 | 8 | 8 | 8 |
8 | 1 | 0 | 9 | 9 | ||
9 | 1 | 0 | A | 10 | 10 | |
A | 1 | 0 | B | 11 | ||
B | 1 | 0 | C | 12 | 12 | 12 |
C | 1 | 0 | D | 13 | ||
D | 1 | 0 | E | 14 | 14 | |
E | 1 | 0 | F | 15 | ||
F | 1 | 1 | 8 | 16 | 16 | 16 |
8 | 2 | 1 | 9 | 18 | 18 | |
9 | 2 | 1 | A | 20 | 20 | 20 |
6 | 3 | 2 | 7 | 21 | ||
A | 2 | 1 | B | 22 | 22 | |
B | 2 | 1 | C | 24 | 24 | 24 |
4 | 5 | 4 | 5 | 25 | ||
C | 2 | 1 | D | 26 | 26 | |
8 | 3 | 2 | 9 | 27 | ||
6 | 4 | 3 | 7 | 28 | 28 | 28 |
9 | 3 | 2 | A | 30 | 30 | |
7 | 4 | 3 | 8 | 32 | 32 | 32 |
A | 3 | 2 | B | 33 | 33 | |
6 | 5 | 4 | 7 | 35 | ||
B | 3 | 2 | C | 36 | 36 | 36 |
C | 3 | 2 | D | 39 | 39 | |
9 | 4 | 3 | A | 40 | 40 | 40 |
6 | 6 | 5 | 7 | 42 | 42 | |
A | 4 | 3 | B | 44 | 44 | 44 |
8 | 5 | 4 | 9 | 45 | 45 | |
B | 4 | 3 | C | 48 | 48 | 48 |
9 | 5 | 4 | A | 50 | 50 | |
C | 4 | 3 | D | 52 | 52 | 52 |
8 | 6 | 5 | 9 | 54 | 54 | |
A | 5 | 4 | B | 55 | ||
7 | 7 | 6 | 8 | 56 | 56 | 56 |
9 | 6 | 5 | A | 60 | 60 | 60 |
8 | 7 | 6 | 9 | 63 | 63 | |
F | 4 | F | 4 | 64 | 64 | 64 |
C | 5 | 4 | D | 65 | ||
A | 6 | 5 | B | 66 | 66 | 66 |
9 | 7 | 6 | A | 70 | 70 | |
B | 6 | 5 | C | 72 | 72 | 72 |
E | 5 | 4 | F | 75 | 75 | |
A | 7 | 6 | B | 77 | 77 | 77 |
C | 6 | 5 | D | 78 | 78 | |
9 | 8 | 7 | A | 80 | 80 | 80 |
8 | 9 | 8 | 9 | 81 | 81 | |
B | 7 | 6 | C | 84 | 84 | 84 |
A | 8 | 7 | B | 88 | 88 | 88 |
E | 6 | 5 | F | 90 | 90 | |
C | 7 | 6 | D | 91 | 91 | 91 |
B | 8 | 7 | C | 96 | 96 | 96 |
D | 7 | 6 | E | 98 | 98 | |
A | 9 | 8 | B | 99 | ||
9 | A | 9 | A | 100 | 100 | 100 |
C | 8 | 7 | D | 104 | 104 | 104 |
E | 7 | 6 | F | 105 | 105 | |
B | 9 | 8 | C | 108 | 108 | 108 |
A | A | 9 | B | 110 | 110 | |
D | 8 | 7 | E | 112 | 112 | 112 |
C | 9 | 8 | D | 117 | 117 | 117 |
E | 8 | 7 | F | 120 | 120 | 120 |
A | B | A | B | 121 | 121 | |
D | 9 | 8 | E | 126 | 126 | 126 |
F | 8 | F | 8 | 128 | 128 | 128 |
C | A | 9 | D | 130 | 130 | |
B | B | A | C | 132 | 132 | 132 |
E | 9 | 8 | F | 135 | 135 | 135 |
D | A | 9 | E | 140 | 140 | 140 |
C | B | A | D | 143 | 143 | |
B | C | B | C | 144 | 144 | 144 |
E | A | 9 | F | 150 | 150 | 150 |
D | B | A | E | 154 | 154 | 154 |
C | C | B | D | 156 | 156 | 156 |
F | A | F | A | 160 | 160 | 160 |
E | B | A | F | 165 | 165 | 165 |
D | C | B | E | 168 | 168 | 168 |
C | D | C | D | 169 | 169 | 169 |
F | B | F | B | 176 | 176 | 176 |
E | C | B | F | 180 | 180 | 180 |
D | D | C | E | 182 | 182 | 182 |
F | C | F | C | 192 | 192 | 192 |
E | D | C | F | 195 | 195 | 195 |
D | E | D | E | 196 | 196 | 196 |
F | D | F | D | 208 | 208 | 208 |
E | E | D | F | 210 | 210 | 210 |
F | E | F | E | 224 | 224 | 224 |
E | F | E | F | 225 | 225 | 225 |
F | F | F | F | 240 | 240 | 240 |
表3显示了在240个主机和独立端口设置组合中有96个不同的亮度等级。按照所有亮度等级的这种递增趋势,需要在某些步骤中后向设置主机亮度等级。可以使用设置阵列来实现这一点,例如伪编程代码中所列出的。
可以采用下面的I2C写命令来闪烁MAX6964驱动的LED。MAX6964的I2C器件地址还是0x49。
0x49 0x02 0x00 0x00 // Set phase 0 polarity to all zeros to // turn LEDs on 0x49 0x0E 0xF0 // Set master intensity to full 0x49 0x0F 0x0D // Set the blinking enable bit to start 0x49 0x0F 0x0F // Switch blinking flip bit to blink 0x49 0x0F 0x0D // Switch back the blinking flip bit to // blink ... 0x49 0x0F 0x0C // Reset the blinking enable bit to stop // blinking 0x49 0x02 0xFF 0xFF // Set phase 0 polarity to all ones to // turn LEDs off
对于上面的命令,假设所有端口的相位1极性位被设置为1 (上电默认)。对于没有被设置为闪烁的端口,相位0和相位1寄存器中的极性位可以设置为相同的值。PWM亮度等级设置在闪烁期间有效。如果相位0或者相位1中的极性位是0,PWM亮度等级置位。否则,“1”互补波形将驱动LED。
总之,可以设置MAX6964 LED驱动器在互补波形定义的一对不同亮度等级之间闪烁。通过正确的设置,还可以实现亮度等级逐渐变化,有时也被称为渐暗。
MAX7313/MAX7314具有和MAX6964相似的LED驱动能力,其所有的端口还可以用作带有转换探测功能的逻辑输入。MAX6965、MAX7315和MAX7316也是相似的型号,只是端口数量减半。本应用笔记介绍的MAX6964常用编程方法还可以用于控制这些相似型号的PWM亮度。