PUPPY付属の車輪駆動用モータ(図1)を制御するプログラムを作成します。
まず開発環境として下のボタンをクリックしPWM_sampleをダウンロードし、解凍して図2の場所にフォルダを移動してください。表1にPWM_sampleフォルダの中にあるファイルの内容を示します。
図2
main.c | PWM出力プログラム |
start.src | マイコンのスタートアップルーチン |
make.bat | ビルド実行ファイル |
led_sample.sub | ビルド用SUBファイル |
3687s.h | H8/3687F用レジスタ定義ファイル |
36057s.h | H8/36057F用レジスタ定義ファイル |
36064s.h | H8/36064F用レジスタ定義ファイル |
36077.h | H8/36077F用レジスタ定義ファイル |
sci.h | シリアル通信用ヘッダ |
sci.c | シリアル通信用プログラム |
portdef.h | レジスタ名を別名定義 |
表1
シリアル通信の演習でダウンロードしたものとは基本的には変わりませんが、portdef.hが追加になりました。(リスト1)
前回までの演習ではLEDを操作、ディップスイッチの値を読む際にそれぞれが接続されているポートのデータレジスタを書いていましたが、あとでプログラムを見たときに解りにくいので、解りやすい名前を定義しておきます。portdef.hの17,18,19行目が今回の演習で主に操作するレジスタです。
モータを動かす回路的なことはハードウェア編のモータドライバに書いたとおりです。モータを動かすには正回転用の信号(FORWARD)、逆回転用の信号をそれぞれ出す出力ポート(BACK)を用意し、モータの回転数を調整するにはPWMを出力するポート(PWM)を接続すればモータを自在にコントロールすることができます。
今回の演習のテーマはPWMの出力方法についてです。PWMは図3に示すような波形です。一周期における5V(HI)の時間の割合をデューティー比といい、デューティー比が高いほどモータは早く回り、低いほどモータは遅く回ります。
図3
ポートからPWMを出力するもっとも単純な方法は、ポートデータレジスタを直接操作することだと思います。端子をHIにしたら決められた時間(ONデューティ時間)だけ待って端子をLOWにする。さらに決められた時間(OFFデューティ時間)だけ待って端子をHIにする。これを繰り返し行うことで簡単にPWMを出力することができます。pwm_sampleのmain.cにそのプログラムがあります(リスト2)
リスト2
6行目: レジスタ別名定義ファイルをインクルードしてLED,SWなどのレジスタ別名を使用できるようにする
12行目: モータドライバに正回転,逆回転用信号を出力するP56,P57を出力設定する
13行目: モータドライバにPWM信号を出力するP63を出力設定する
17,18行目: モータを回転させる方向を設定する。(表2参照)
FORWARD | BACK | |
正回転 | 1 | 0 |
逆回転 | 0 | 1 |
表2
27行目〜: P63からPWMを出力する、出力時間をループカウンタの数値で決める。この場合デューティ比は25%になります。
このプログラムを実行すると車輪が動き出しますので、車輪を浮かせた状態で電源を入れてください。
プログラムを実行すると車輪がゆっくりと動き出します。ディップスイッチ4を変化させると回転方向が変化します。
ディップスイッチでモータの回転方向だけでなくモータの回転速度を変化させるプログラムを作成してみましょう