連載
» 2015年05月19日 07時00分 UPDATE

「mbed」で始めるARMマイコン開発入門(8):ARMマイコンからのPWM出力でLEDを“ボヤっと”光らせる (1/3)

デジタルの出力は本来「0」か「1」ですが、PWM出力を用いれば疑似的なアナログ出力を得ることができます。ARMマイコン「LPC1114」を使って、LEDを“ボヤっと”光らせてみたり、サーボモータの制御に挑戦してみましょう。

[今岡通博,MONOist]

 組み込みの世界では最も成功したプロセッサの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”って何?」もあわせてご覧ください)。

photo (図1)

 では実際の変化した電圧をパルス幅に変え、ある実質電圧へ変換するにはどうすればよいのでしょうか。そのためにRC(抵抗とコンデンサ)で構成するローパスフィルター(図2)を通します。

photo (図2)RCローパスフィルター

 図3はPWMとRCローパスフィルターでサイン波を生成した図です。上がPWMの生の波形です。下の波形はRCローパスフィルターを通した後の波形です。PWMの1の値が長く続くところがサイン波の山の部分、逆に1となっている時間が短いところは谷になっているのが分かります。

photo (図3)PWMとRCローパスフィルターでサイン波を生成

PWMでLEDをぼやっと点滅

それではPWMを実感して頂くためにひとつプログラムを作ってみましょう。LEDをぼやっと光らせたり消したりするプログラムです。

 クラウド開発環境のmbed.orgにアクセスし、いつものようにプログラムを新規に作成します。筆者はpwmとしました。するとpwmというディレクトリが生成され、そこにmbedライブラリのディレクトリができるので、その中のClassesのからPwmOutを選択します。するとPwmOut Class Referenceを参照できます(図4)

photo (図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」に変更してください。

photo (図5)LPC1114FN28のピン配列図

 main関数に突入後は、5行目から11行目の間で無限ループを構成しています。“led”の値を0から1までの間、0.01づつ増加させながら0.2秒ごとに代入しています。このledに代入する値をデューティ比といいます。デューティ比をD、周期をT、パルス幅をtとすると デューティ比DD=t/Tとなります。

 Tは特にプログラムの中で設定していませんので、デフォルト値が採用されているものとします。例えばledに0.5を代入するとPWMの出力は山の部分と谷の部分が1対1となりますので、実行出力はちょうど半分となります。このピンに発光ダイオードが接続されているとするとGPIOに1を出力したときの明るさに対して半分の明るさに見えるわけです。

 このように、デューティ比を0から1の間で変えてやることにより、発光ダイオードの明るさを制御することが可能となります。下記プログラムは徐々に明るくなり、最大の明るさになると、一度消灯し、また徐々に明るくなるという動作を繰り返します。

       1|2|3 次のページへ

Copyright© 2017 ITmedia, Inc. All Rights Reserved.