モータ編


PWMによるモータ制御が勝利の鍵と聞いたので実験してみた。

実験なんで、ありきたりの簡単な回路。

PA-4とPA-6のどちらかをHにすればモータが回る。PA-4とPA-6とではモータの回転方向が逆になるので、車輪の駆動に使えば前進・後退が可能になる。

出力は停止・正転・逆転の3段階なのだが、ON・OFFを素早く切り替え続けることによって中間の速度で回転させることができる。このときのONとOFFの比率(デューティー比)を変えることによって回転数を制御することができる。これをPWM制御という。

PA-4とPA-6を選んだのは、H8に内蔵されたPWM機能を使うため。PA-4はタイマ1で、PA-6はタイマ2で制御できる。PWM出力を2つ使うため、タイマも2つ使ってしまう。2つの車輪の制御をすれば、それだけでタイマを4つ使ってしまう。片方のタイマを使っている間は、もう一方は出力しないので、一つの出力をマイコン外部で切り替えるようにすればタイマを1つしか使用しなくて済む。今回は実験なので、ケチらずに2つ使う。


まずは全タイマ共通のレジスタの設定。
  mov.b   #H'00,R0L
  mov.b   R0L,@TSTR
これで、全タイマをいったん止める。

  mov.b   #H'00,R0L
  mov.b   R0L,@TSNC
独立に動くので、こんな感じ。

  mov.b   #H'06,R0L
  mov.b   R0L,@TMDR
ポート1とポート2をPWMモードにするので、ビット1とビット2をHにする。

  mov.b   #B'11000000,R0L
  mov.b   R0L,@TFCR
  mov.b   R0L,@TOER
  mov.b   #B'11111111,R0L
  mov.b   R0L,@TOCR
ここら辺は関係ないので適当に。


タイマごとの設定。プログラマー図マニュアルのP。386に書いてある通りに設定する。

  mov.b   #B'10100000,R0L
  mov.b   R0L,@TCR1
内部クロックφでカウントし、GRAでクリアするようにする。別に割り込みをかけるわけではないので、カウントは速ければ速い程良い。

  mov.w   #32767,R0
  mov.w   R0,@GRA1
GRAでクリアされるので、ここではカウンタの最高値を設定する。今回は32767にした。

  mov.w   #H'0,R0
  mov.w   R0,@GRB1
GRBを設定する。この設定がデューティー比に関係してくる。初めは停止状態なので0を設定する。

  mov.b   #B'00000000,R0L
  mov.b   R0L,@TIOR1
TIOCBは今回使用しないので、こんな感じ。

  bset.b   #1,@TSTR
これでタイマが動き出す。

今まではタイマ1の設定だったが、タイマ2も全く同じ設定でよい。

  mov.b   #B'10100000,R0L
  mov.b   R0L,@TCR2
  mov.w   #H'32767,R0
  mov.w   R0,@GRA2
  mov.w   #H'0,R0
  mov.w   R0,@GRB2
  mov.b   #B'00000000,R0L
  mov.b   R0L,@TIOR2
  bset.b   #2,@TSTR

PWMモードの動作は下の図のようになっている。

16ビットのカウンタがカウントされ、GRBの値と同じになるとTIOCAの出力はLになる。GRAの値と同じになったら、TIOCAの出力がHになり、カウンタの値は0になる。これが延々と繰り返される。図を見てわかるとおり、TIOCAがHの期間の比率(デューティ比)は、GRB÷GRAで求まる。GRBが0ならほとんどL。GRA=GRBならばHがずっと出力される。

この制御をタイマ1とタイマ2の両方に対して行う。ただし、同時に出力しても意味がないので、タイマ1の方が動いている間は、タイマ2のGRBを0にして出力をLに固定する。逆も同じで、タイマ2が動いている間はタイマ1は止めておく。同時に両方のタイマが動くことはないので、信号を外部で切り替えるように設計すればタイマは一つで済む。


このPWM制御の難点。実はデューティー比を0%にする事ができない。GRBを0にしても、タイマがGRAと一致したときにHが出力される。これを解決するにはGRAの値とGRBの値をひっくり返す必要がある。それほど面倒な処理ではない。まぁ、さっき書いた正転・逆転の外部制御回路でOFFにできるようにしてもよい。そのままでも回ることはないと思うけど。

もう一つ。変な音がする。16MHzのクロックで32768カウントしているので、出力される波形は488Hzで見事に可聴領域。気持ち悪いけど、それほど気にしなくてもいいでしょう。

モーター一つでは、車は前後にしか進まない。左右別々のモーターを載せれば曲がることができる。

しかし、真っ直ぐ進むのが大変になる。モーターの個体差・トランジスタの個体差で、同じデューティー比にしても同じ回転数が得られるとは限らない。そこで、あらかじめデューティー比と回転数の特性を計測しておいて補正する。32768段階の制御が可能だから真っ直ぐ進むのは可能だろう。

それでも、負荷の変動や特性の変化で真っ直ぐに進まない場合は、現在の回転数を計測できるようにする。ロータリーエンコーダを積むわけやね。


今回のプログラム

MOTOR.LZH 7,934 bytes

実験で作ったプログラム。


更新する暇が無いっす。へろ〜。

続くか?


ご意見・ご感想は kumon@sam.hi-ho.ne.jp までどうぞ。

戻る