LEDの明るさはLEDに流す電流の量で決まります。LED(Light Emitting Diode)はその名の通りダイオードなので、一方向にしか電流が流れません。そして電流が流れているときにはダイオードのアノードとカソードの両端はほぼ一定の電圧(順方向電圧Vf)になります。おおよそ赤LEDで2V、青LEDだと3Vくらいです。図のような回路の場合、電流は、 i = (E-Vf)/R になりますので印加電圧Eによってiさらには明るさを変えることができます。
電圧をマイコン等でコントロールするにはD/A変換器が必要になりLEDの数分D/Aが必要になりちょっと面倒です。そこでPWMの登場です。LEDへの印加電圧は一定ですが、OnとOffの比率を変えて平均的な光量を変える作戦です。
Cube-Dを使って確認してみます。Cube-DのマルチブロックにはPWMパルス用の機能がありますが、今回はあえてカウンタと比較器を使って作ります。
8bitカウンタなので256サイクルで元に戻ります。比較器の出力はLEDに接続して、比較器の一方の入力を定数値C3に接続します。カウンタの値がC3よりも小さい場合にHレベルを出力します。従って出力はデューティー比がC3/256で、周期はクロック周波数/256になります。
ベースボードのクロック周波数を100Hz(表示はFr12)、C3を80(16進)にするとLEDは2.5秒間隔でDuty50で点滅することが分かります。この状態でクロック周波数を上げていくと点滅の周期が短くなって、10kHz(表示Fr14)くらいで点滅を認識できなくなります。オシロスコープで測定するとDuty比のまま周期だけが短くなっているのですが、人間の目が点滅を認識できなくなります。次にC3の値を小さくしていきましょう。LEDの明るさが暗くなっていくのが分かります。Duty50(C3=80h)の明るさはDuty100(C3=FFh)の明るさの半分になりそうですが、実際にはもっと明るく見えます。人間の感覚器が対数スケールであることも実感できますね。LEDといえば子供のころの失敗談があります。豆電球を光らせる感覚でLEDに直接電池をつないだことがあり、もちろん定格以上の電流が一瞬流れてLEDが壊れました。この失敗で抵抗の役割を強く認識した記憶があります。
今回はLEDの明るさをPWMによってコントロールできるという内容でした。LEDをマイコンのポートにつなげてプログラムでPWMパルスを生成することは可能ですが、各種割り込み処理などで正確なタイミングが得られない場合もあり、できればタイマーなどの付属のハードでタイミングを生成することをお勧めします。Cube-Dのマルチブロックの中に「LED調光付きレジスタ」というものがあり、入力値に応じたPWMパルスを生成してこれでブロック内部のLEDの明るさを調整するものです。ここでもマイコン内蔵のSCTタイマーというものを使っています。