DCマウス研修(移行中)

マイクロマウス研修[4]モータを動かす

こんにちは。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設定

次回

サンプルプログラムにならってモータを設定し、動かすことができました。次回は、割り込み機能を使ってモータを自由に制御できるようにしたいと思います。

タイトルとURLをコピーしました