LEDドライバMAX6964のPWM輝度制御
要約
以下のアプリケーションノートでは、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の間だけオンになっています。
フェーズ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が必要です。
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期間よりも大幅に長い時間継続させます。
以下に示すのは、特定のPWM輝度レベルでLEDを点灯させるためにMAX6964に送信するI2Cのコマンドシーケンスの例です。
次の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
最後の2つのコマンドでは、単一の書込みコマンドを使用して複数のレジスタへの書込みを行うことができる、レジスタアドレスの自動インクリメント機能を利用しています。
場合によっては、通電時にLEDを徐々に点灯させることが必要になります。マスタ制御をローからハイに向けて設定していき、それぞれのマスタ設定において、個別ポート制御をローからハイに向けて設定することによって、LEDの輝度をローからハイへと調整することが可能です。マスタと個別ポートの組合せの中には、同一または近似した輝度レベルになるものが含まれているため、輝度を増大させる場合にすべての設定が必要になるわけではありません。高い輝度レベルにおいて、低い個別ポート設定の一部をスキップする必要があります(表1)。重複または近似する輝度レベルの一部がスキップされることから、輝度レベルの増大は二重ループに基づいて行います(第1のループでマスタの輝度を変化させ、第2のループで個別ポートを変化させます)。表1では、合計で240通りの利用可能な組合せの内、59ステップだけを使用しています。
個別 | マスタ | 輝度 | 個別 | マスタ | 輝度 |
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を徐々に点灯させる疑似プログラムコードです。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組のマスタと個別ポートの組合せの間で重複する場合があります。その一方で、どの組合せによっても生成が不可能な輝度レベルも存在します。表2に、マスタおよび個別ポートのPWM輝度制御ビットの値に沿って、利用可能な輝度レベルを示します。極性ビットが0の場合、輝度レベルは表の数値を240で除算したものになります。この表は、最上列の左から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から最も近い組合せを選択することによって、希望する増光動作に近似させることも可能です。
選択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種類の識別可能な輝度レベルが存在することを示しています。この増光動作に従ってすべての輝度レベルを使用するためには、途中で何度かマスタの輝度レベルを逆戻りさせて設定する必要が生じます。これは、先ほどの疑似プログラムコードで示したような、設定用の配列を使用することによって実現可能です。
次の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が駆動されることになります。
まとめると、LEDドライバMAX6964は相補的な波形で定義される1組の異なる輝度レベル間で点滅するようにプログラムすることができます。適切なプログラムを行うことで、フェードとも呼ばれる漸進的な輝度レベルの変化を実現することも可能です。
MAX7313/MAX7314は、MAX6964と類似のLED駆動能力を備えており、加えて全ポートを遷移検出付きのロジック入力として使用可能です。MAX6965、MAX7315、およびMAX7316もこれらと類似の製品ですが、ポート数が半分になります。このアプリケーションノートで示したMAX6964の全般的なプログラミング技法は、これら類似製品でPWM輝度の制御を行う場合にも利用することができます。