ARMマイコンからのPWM出力でLEDを“ボヤっと”光らせる:「mbed」で始めるARMマイコン開発入門(8)(1/3 ページ)
デジタルの出力は本来「0」か「1」ですが、PWM出力を用いれば疑似的なアナログ出力を得ることができます。ARMマイコン「LPC1114」を使って、LEDを“ボヤっと”光らせてみたり、サーボモータの制御に挑戦してみましょう。
組み込みの世界では最も成功したプロセッサの1つ「ARM」を用いたマイコン開発にチャレンジするこの連載、今回は「PWM(「Pulse Width Modulation」:パルス幅変調)」出力をする方法について勉強します。
PWM出力を利用することで、本体は0か1かのデジタル出力しかできないGPIOで疑似的なアナログ信号を出力することが可能となり、モーターやアクチュエータ−の制御をはじめ、照明の微妙な調整なども行えるようになります。
PWMの原理
PWMはデジタル出力しかできないピンを使って、疑似的にアナログ信号を生成する手段の1つです。
図1を見てください。デジタル出力では、0か1(0のときは0V、1のときは3.3V)の出力しかできません。その代わり、0になっている時間と1になっている時間を調整して、実質的な電圧(実質電圧)として上下させるのが、PWM出力です(詳しくは「モータ制御に欠かせない技術“PWM”って何?」もあわせてご覧ください)。
では実際の変化した電圧をパルス幅に変え、ある実質電圧へ変換するにはどうすればよいのでしょうか。そのためにRC(抵抗とコンデンサ)で構成するローパスフィルター(図2)を通します。
図3はPWMとRCローパスフィルターでサイン波を生成した図です。上がPWMの生の波形です。下の波形はRCローパスフィルターを通した後の波形です。PWMの1の値が長く続くところがサイン波の山の部分、逆に1となっている時間が短いところは谷になっているのが分かります。
PWMでLEDをぼやっと点滅
それではPWMを実感して頂くためにひとつプログラムを作ってみましょう。LEDをぼやっと光らせたり消したりするプログラムです。
クラウド開発環境のmbed.orgにアクセスし、いつものようにプログラムを新規に作成します。筆者はpwmとしました。するとpwmというディレクトリが生成され、そこにmbedライブラリのディレクトリができるので、その中のClassesのからPwmOutを選択します。するとPwmOut Class Referenceを参照できます(図4)。
このリファレンスを見てみるとさまざまななメンバー関数がありますが、少しスクロールダウンするとサンプルプログラムがありますので、これを使ってPwmOutの動作を確かめてみましょう。
それでは以下のプログラムを見ていきましょう。これはLEDをぼやっと点灯させるプログラムです。筆者は「ぼやっと」といいましたが1行目のコメントにあるように英語では「Fade」というようですね。3行目でledという名前でLED1のピンをPwmOutクラスのインスタンスとして指定しています。サンプルコードではLED1となっていますが、MPUによってPWMとして使えるピンが異なっています。LPC1114NF28のピン配列図を確認してください。
1:// Fade a led on. 2:#include "mbed.h" 3:PwmOut led(dp1); //LED1からdp1に変更 4:int main() { 5: while(1) { 6: led = led + 0.01; 7: wait(0.2); 8: if(led == 1.0) { 9: led = 0; 10: } 11: } 12:}
LPC1114FN28の場合PWMとして使えるピンは、図5のピンクの枠で囲ったPwmOutの4ピンのみです。今回のプログラムではLEDをdp1につなぐことにしましょう。ですからプログラムも「LED1」を「dp1」に変更してください。
main関数に突入後は、5行目から11行目の間で無限ループを構成しています。“led”の値を0から1までの間、0.01づつ増加させながら0.2秒ごとに代入しています。このledに代入する値をデューティ比といいます。デューティ比をD、周期をT、パルス幅をtとすると デューティ比DはD=t/Tとなります。
Tは特にプログラムの中で設定していませんので、デフォルト値が採用されているものとします。例えばledに0.5を代入するとPWMの出力は山の部分と谷の部分が1対1となりますので、実行出力はちょうど半分となります。このピンに発光ダイオードが接続されているとするとGPIOに1を出力したときの明るさに対して半分の明るさに見えるわけです。
このように、デューティ比を0から1の間で変えてやることにより、発光ダイオードの明るさを制御することが可能となります。下記プログラムは徐々に明るくなり、最大の明るさになると、一度消灯し、また徐々に明るくなるという動作を繰り返します。
Copyright © ITmedia, Inc. All Rights Reserved.