こんにちは。koraです。
前回の更新からだいぶ時間がたってしまいましたが、今回はモータを動かせるようにしたいと思います。
モータドライバについて
まず、マイクロマウス本体を見てみましょう。HM-StarterKitにはDRV8838というモータドライバが2つ搭載されていて、2つのモータの回転方向、回転速度をそれぞれコントロールすることができます。
それぞれのモータドライバは次の3つのピンから制御できます。
- nSLEEPピン:スリープモードを切り替える。
- PHピン:回転方向を制御する。(Lowにすると正転、Highにすると逆転)
- ENピン:回転速度を制御する。(PWM信号を入力する)
回転速度の制御にはPWM(Pulse Width Modulation)を使います。PWMとは、信号線のHIGH/LOWを素早く繰り返すことで、出力される電圧を制御する方法です。繰り返す周期に対するHIGH時間の割合をDuty比といいます。モータドライバから出力される電圧は、バッテリー電圧にDuty比を掛けたものになります。
つまり、このマウスを自由に走らせるには、任意のDuty比のPWM信号を2つ出す必要があります。実際にどうすればいいのか、サンプルプログラム(Step2)を見てみます。
PWM信号の生成には、マイコンのタイマ機能を使います。HM-StarterKit.cの中で、クロックとIOの設定を行っています。この設定では、48MHzで内部のカウンタが動いています。カウンタとPWM信号がどのように連動しているかというと、
- カウンタの値がMTU0.TGRAの値より小さければ、HIGHが出力される
- カウンタの値がMTU0.TGRAの値より大きくなれば、LOWが出力される
- カウンタの値がMTU0.TGRDの値になれば、カウンタがリセットされ0に戻る
“MTU0.TGRD = 240-1″と設定しているので、カウンタは0~239でループします。したがってDuty比は240段階で調整することができます。ちなみに、TGRAが左側、TGRCが右側のモータドライバを制御します。
ファイルの分割
マウスの最終目標は迷路を走ることです。モータを動かすだけでなく、直進、方向転換、センサの読み込み、迷路探索など、多様な機能を盛り込む必要があります。それぞれの機能、処理を分かりやすいように関数化しましょう。というわけで、サンプルプログラム(Step7)を参考に、ファイルを作成していきます。
今回作るファイルは、こちらの4つです。
- init.c
- init.h
- static_parameters.h
- portdef.h
新しいファイルを作るには、「プロジェクト・ツリー」の「ファイル」を右クリックして「追加」を選択し、「新しいファイルを追加」をクリックします。ソースファイルを作る場合は、表示された「ファイル追加」ウィンドウで「Cソース・ファイル(*.c)」を選択し、ファイル名を入力します。ヘッダファイルを作る場合は、「ヘッダ・ファイル(*.h; *hpp; *.inc)」を選択し、ファイル名を入力です。
init.c
init.cファイルには、クロックの初期化関数(clock_init)、モータの初期化関数(motor_init)、そしてこの2つの関数をまとめて呼び出す関数(init_all)を作ります。
init.h
init.hファイルには、init_allのプロトタイプ宣言を追加します。そうすることで、init.hをインクルードしたファイルから初期化関数を呼べるようになります。
static_parameters.h
static_parameters.hファイルでは、プログラム内で使用する定数を定義します。
- IO_OUT … IO端子を出力に設定する値
- IO_IN … IO端子を入力に設定する値
- MOT_R_FORWARD … 右のモータドライバのPH端子に出力すると前進する値
- MOT_R_BACK … 右のモータドライバのPH端子に出力すると後進する値
- MOT_L_FORWARD … 左のモータドライバのPH端子に出力すると前進する値
- MOT_L_BACK … 左のモータドライバのPH端子に出力すると後進する値
portdef.h
portdef.hファイルでは、モータやセンサの制御に使用するレジスタを、わかりやすい名前に定義しています。
- MOT_OUT_R … 右側のモータ用のPWM制御用のレジスタ
- MOT_OUT_L … 左側のモータ用のPWM制御用のレジスタ
- MOT_POWER … モータドライバ電源用の端子のレジスタ
- MOT_POWER_ON … モータドライバ電源ON
- MOT_POWER_OFF … モータドライバ電源OFF
- MOT_CWCCWR … 右側のモータドライバ正転逆転制御用の端子のレジスタ
- MOT_CWCCWL … 左側のモータドライバ正転逆転制御用の端子のレジスタ
my_hm_starterkit.c
今回作ったファイルをインクルードするため、my_hm_starterkit.cファイルに次の行を追加します。
- #include “init.h”
- #include “static_parameters.h”
- #include “portdef.h”
あとは、次の3行をmy_hm_starterkit.cのmain関数に追加すればOKです。
- init_all(); … 初期化
- MOT_POWER_ON; … モータドライバの電源ON
- MOT_CWCCW_R = MOT_R_FORWARD; … モータの回転方向を指定
- MOT_OUT_R = 120; … PWMのDuty設定
次回
サンプルプログラムにならってモータを設定し、動かすことができました。次回は、割り込み機能を使ってモータを自由に制御できるようにしたいと思います。