« 「誰でもわかるマイコン入門」ヒーターコントローラを作る | トップページ | 「誰でもわかるマイコン入門」電源の話 »

2015年1月23日 (金)

「誰でもわかるマイコン入門」ヒーターコントローラプログラム説明

それでは、プログラムの解説です。

ます、プログラムはここ。

http://developer.mbed.org/users/Honmaka/code/HeaterControler/

内容

PwmOut Heater(p21);
p21をPWM出力として使う。名前をHeaterと名づける。

AnalogIn Level(p15);
p15をアナログ入力として使う。名前をLevelと名づける。Levelは電圧0~3.3Vに対応して0.0~1.0の値をもつ。

int main() {
    while(1) {
       Heater.period_us(10000);
パルス周期を10000μ秒=1/100秒とする
 

        Heater.pulsewidth_us(10000*Level);
パルス幅をアナログ入力に応じて0から10000までの値とする

        wait(0.1);
0.1秒待つ
    }
}

さて、以前パルスモータのプログラムの中で、PWMを初期設定する命令をwhile(1)無限ループの中に入れてはだめと言いました。そのとおりですが、今回は中に入っています。

理由ですが、

1 中に入れないと、ボリュームを回しても出力が変化しない。つまり起動したときのボリュームの値だけではなく、常にボリュームの値を読まないといけません。そのため、ループの中に入れる必要があります。

2 しかし、実際ループの中に入れると、正しく動作しません。なぜか?
Heater.period_us(10000);
Heater.pulsewidth_us(10000*Level);

この2つの命令はパルスを出力する命令ではありません。パルスを出力するための初期設定をする命令です。初期設定している間はパルスを出しません。初期設定すればパルスは勝手に出てきます。

つまり
while (1) {
Heater.period_us(10000);
Heater.pulsewidth_us(10000*Level);
}

と書いてしまうと、パルスを初期設定する命令を永遠に繰り返しているだけで、いつまでたっても、パルスは出ません。そこで登場するのが、

wait(0.1);

です。ここで0.1秒間プログラムを止めます。このとまっている間にパルスを出力させるのです。つまり、余裕を与えてやるのです。これで正常にパルスを出力します。

ただし、このようなことが許されるのは、このプログラムがヒーターコントローラーでパルスの周期が厳密でなくて良い場合だけです。

前回のパルスモーターのように、ぴったし恒星時でなくてはいけない場合などは、絶対ループの中に入れてはいけません。そこだけは注意してください。

プログラムを書き込んだら、ボリュームを回してLEDをの明かりが変化するのを確認してください。なお、LEDには470オーム程度の抵抗を入れておきます。またLEDはピンの長い方がプラス側になります。

LEDの代わりに、ヒーターを入れればヒーターコントローラになります。

次回は電源についてお話します。

|

« 「誰でもわかるマイコン入門」ヒーターコントローラを作る | トップページ | 「誰でもわかるマイコン入門」電源の話 »

コメント

コメントを書く



(ウェブ上には掲載しません)




« 「誰でもわかるマイコン入門」ヒーターコントローラを作る | トップページ | 「誰でもわかるマイコン入門」電源の話 »