应用笔记 4253

MAX6964 LED驱动器的PWM亮度控制

By: Walter Chen

摘要 : 本应用笔记介绍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,由独立端口的接通时间决定。

图1. 一个端口的输出波形
图1. 一个端口的输出波形

端口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。

图2. “1”的互补波形
图2. “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周期长得多。

图3. 相位0和相位1之间的闪烁
图3. 相位0和相位1之间的闪烁

下面的I²C命令序列发送给MAX6964,以接通LED,达到一定的PWM亮度等级。

下面的3条I²C写命令可用于接通O16 LED,达到最小亮度等级。MAX6964的I²C器件地址是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
可以采用下面的I²C写命令来接通所有的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步。

表1. 双环递增
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。I²C程序向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
I²C(Write, 0x0E, MasterPort(1, i));        // Set master intensity level
I²C(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。该表沿对角线对称,从左上角第二行到右下角倒数第二行。

表2. 基于主机和独立端口选择的亮度等级
  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中选取最近组合得到所需要的递增趋势。

表3. 主要的平滑递增趋势
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个不同的亮度等级。按照所有亮度等级的这种递增趋势,需要在某些步骤中后向设置主机亮度等级。可以使用设置阵列来实现这一点,例如伪编程代码中所列出的。

可以采用下面的I²C写命令来闪烁MAX6964驱动的LED。MAX6964的I²C器件地址还是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亮度。