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を変化させると回転方向が変化します。
ディップスイッチでモータの回転方向だけでなくモータの回転速度を変化させるプログラムを作成してみましょう