アプリケーションノート 4253

LEDドライバMAX6964のPWM輝度制御

筆者: Walter Chen

要約: 以下のアプリケーションノートでは、LEDドライバMAX6964が備える独自の機能、および輝度制御を必要とするアプリケーションでそれらの機能の適切な利用方法について解説します。また、このアプリケーションノートではMAX6964のマスタおよび個別ポートの選択の両方について、輝度制御の選択を示すプログラムルーチンの例も提示します。LED輝度制御の機能は、日中と夜間の条件下でLED輝度の調整が必要になる自動車アプリケーションにおいて特に有効です。

MAX6964は、8ビット、パルス幅変調(PWM)輝度制御を備えた、大出力電流、17ポートLEDドライバです。各個別ポートは、最大50mAのシンク電流に対応します。グランド端子を流れる総シンク電流は、全ポートの組合せで最大350mAに制限されます。8ビットのPWM輝度制御は、全ポートに適用されるマスタ制御の4ビットと、個別ポート制御の4ビットに分離されます。マスタ輝度制御を使用することによって、周囲の照明環境の変化(たとえば自動車の場合、日中と夜間の条件など)に応じて機器全般のLED輝度を調整することが可能です。その上で、個別ポート制御を使用してアプリケーションの必要に応じた希望の輝度を生成することができます。別の方法として、4ビットのグローバル制御ビットを代わりに使用して、すべての個別ポートの輝度を同時に制御することも可能です。レジスタ0x0EのビットD0~D3を、グローバルまたはポートO16の輝度制御に使用することができます。また、マスタと個別の輝度制御を組み合わせて、全ポートのフェード効果を作り出すことも可能です。

光源を十分な速度でオン/オフさせた場合、人間の目は対象物が連続的に照らされていると認識することが広く知られています。PWM輝度制御は、オン/オフの周波数を一定の速度に維持したままオンの時間を変化させることによって、認識される輝度を変化させます。ちらつき作用を防ぐために、通常はPWMのオン/オフ周波数を100Hzより高くする必要があります。MAX6964のPWM輝度制御は、公称周波数32kHzの内蔵発振器によって駆動されます。MAX6964のPWM周期は240クロックサイクルであるため、結果としてPWMオン/オフ周波数は32000/240 = 133.33Hzになります。

MAX6964の出力に接続されたLEDの輝度は、該当する極性ビットが0のとき、マスタおよび個別ポート両方の制御のオン時間(ロジックロー)を重ね合わせたもので決まります。

MAX6964のマスタ輝度制御は、レジスタ0x0FのビットD7~D4によって決定されます。これら4ビットのマスタ制御ビットでは、PWM周期を15個のタイムスロットに分割しています。マスタのオン時間スロットには1/15、2/15、...、13/15、および14/15があり、それぞれビットパターン0001、0010、...、1101、および1110によって選択されます。

各ポートにつき4ビットで1組になっている個別ポート制御ビットは、レジスタ0x10~0x17に配置されています。ポート16の制御ビットは、レジスタ0x0FのD3~D0に位置しています。レジスタ0x0Fのこれらのビット(D3~D0)は、そのオプションがイネーブルされている場合、グローバル制御にも使用されます。各マスタタイムスロットは、16の内部発振器クロックサイクルで構成されます。これらのクロックサイクルを、それぞれ0000、0001、...、1110、および1111というビットパターンによって、1/16、2/16、...、15/16、および16/16の間アクティベートすることができます。

図1は、マスタのオン時間がビットパターン0010に相当する2/15、個別ポートのオン時間がビットパターン0001に相当する2/16の場合について、極性ビットが0のときのポートの出力波形を示しています。利用可能なマスタのオン時間スロットが2個存在して、その両方が個別ポートのオン時間で決められている2/16の間だけオンになっています。

Figure 1. A port's output waveform.
図1. ポートの出力波形

フェーズ0のポート7~0とポート15~8の極性ビットは、それぞれレジスタ0x02と0x03に配置されています。同様に、フェーズ1のポート7~0とポート15~8の極性ビットは、レジスタ0x0Aと0x0Bに位置しています。ポート16の極性ビットは、レジスタ0x0Fのフェーズ1 (D5)およびフェーズ0 (D4)ビットで示されます。点滅機能がイネーブルされていない場合は、フェーズ0の極性ビットだけが関係します。

図2は、マスタと個別ポートのビットパターンが先ほどと同じ0010と0001で、極性ビットが1のときのポートの出力波形を示しています。図1と図2を比較すると、オン時間とオフ時間が逆転しており、両者が相補的な波形になっていることが分かります。輝度レベルのプログラムは極性0で行うのが最善ですが、点滅を行うためには極性1が必要です。

Figure 2. A one's complementary waveform.
図2. 1の補数の波形

MAX6964によって駆動されるLEDは、BLINK入力をトグルするか、またはブリンクフリップビット(レジスタ0x0FのD1)を反転することによって、点滅(オン/オフ)させることが可能です。BLINK入力とブリンクフリップビットを作動させるには、ブリンクイネーブルビット(レジスタ0x0FのD0)に1をセットする必要があります。ホストコントローラは点滅イベント1回ごとに、BLINK入力のロジックレベルを変えるか、またはMAX6964への書込みを行う必要があります。点滅がイネーブルされている場合(D0 = 1)、特定のポートのLEDの極性は、BLINK入力とブリンクフリップビットの排他的ORが0であるか1であるかに応じて、フェーズ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期間よりも大幅に長い時間継続させます。

Figure 3. Blinking between phase 0 and phase 1.
図3. フェーズ0とフェーズ1の間の点滅

以下に示すのは、特定のPWM輝度レベルでLEDを点灯させるためにMAX6964に送信するI²Cのコマンドシーケンスの例です。

次の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
最後の2つのコマンドでは、単一の書込みコマンドを使用して複数のレジスタへの書込みを行うことができる、レジスタアドレスの自動インクリメント機能を利用しています。

場合によっては、通電時にLEDを徐々に点灯させることが必要になります。マスタ制御をローからハイに向けて設定していき、それぞれのマスタ設定において、個別ポート制御をローからハイに向けて設定することによって、LEDの輝度をローからハイへと調整することが可能です。マスタと個別ポートの組合せの中には、同一または近似した輝度レベルになるものが含まれているため、輝度を増大させる場合にすべての設定が必要になるわけではありません。高い輝度レベルにおいて、低い個別ポート設定の一部をスキップする必要があります(表1)。重複または近似する輝度レベルの一部がスキップされることから、輝度レベルの増大は二重ループに基づいて行います(第1のループでマスタの輝度を変化させ、第2のループで個別ポートを変化させます)。表1では、合計で240通りの利用可能な組合せの内、59ステップだけを使用しています。

表1. 二重ループによる増光動作
個別 マスタ 輝度 個別 マスタ 輝度
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 × 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組のマスタと個別ポートの組合せの間で重複する場合があります。その一方で、どの組合せによっても生成が不可能な輝度レベルも存在します。表2に、マスタおよび個別ポートのPWM輝度制御ビットの値に沿って、利用可能な輝度レベルを示します。極性ビットが0の場合、輝度レベルは表の数値を240で除算したものになります。この表は、最上列の左から2番目と下から2列目の右端を結ぶ対角線を軸として、対称形になっています。

表2. マスタおよび個別ポートの選択に基づく輝度レベル
  マスタポート輝度
0 1 2 3 4 5 6 7 8 9 A B C D E F
個別
ポート
輝度
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は、直線的に増大する輝度レベルの動作、およびその短縮版を示しています。短縮版1のリストは輝度レベルを2/240の割合でスキップするもの、短縮版2のリストは4/240の割合でスキップするものです。また、表2の対角線上に位置するマスタおよび個別ポートの組合せを使用することによって、2乗で増大する動作を実現することができます。あるいは、表2から最も近い組合せを選択することによって、希望する増光動作に近似させることも可能です。

表3. 最もスムーズな増光動作
選択1 選択2 輝度レベル× 240
個別 マスタ 個別 マスタ 完全版 短縮版1 短縮版2
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が駆動されることになります。

まとめると、LEDドライバMAX6964は相補的な波形で定義される1組の異なる輝度レベル間で点滅するようにプログラムすることができます。適切なプログラムを行うことで、フェードとも呼ばれる漸進的な輝度レベルの変化を実現することも可能です。

MAX7313/MAX7314は、MAX6964と類似のLED駆動能力を備えており、加えて全ポートを遷移検出付きのロジック入力として使用可能です。MAX6965、MAX7315、およびMAX7316もこれらと類似の製品ですが、ポート数が半分になります。このアプリケーションノートで示したMAX6964の全般的なプログラミング技法は、これら類似製品でPWM輝度の制御を行う場合にも利用することができます。