はじめに
ここではDCモータのPWM制御について説明します。これにはdsPIC33Fのアウトプットコンペア(出力比較)機能を使います。
※このページで紹介する内容はあくまでも一例です。個別の作成のご相談ご質問はお答えできませんのでご了承下さい。このページと同じ内容についてのご質問についてはロボット掲示板にてお願いいたします。
※以下の情報は2007年12月現在のものです。ご注意ください。
※このページではC言語の基本的な部分を理解している方向けに書いてあります。また、何回かMPLABの操作を行った方を対象にしています。それ以外の方はまず基本編を読んで下さい。
DCモータ
マブチモーターがよくホビーで使われていると思いますが、コイルと磁石から構成されており直流電流を流すと回転するものにDCモータがあります。模型店などで簡単に入手できるので、使ったことがある方は多いと思います。
DCモータからは線が2本出ていて、電源をつなぐと一方方向へ、電源の+−を逆にすると逆方向へ回転します。DCモータには駆動するのに決められた電圧があり、マブチモータの場合は1.5〜3Vとなっています。
マブチモータの場合は、アルカリ電池などの内部抵抗が高い電池で駆動することを前提としており、コイル抵抗が低くなっています。大きな電流が流れようとすると電池内部の抵抗により電圧が下がるので、アルカリ電池などの乾電池を直接つないでも問題ありません。この時、電流は数百mA〜数A(1、2A)流れます。
DCモータをマイコンで駆動する場合
マイコンの端子は大きな電流を流すことは出来ませんのでマイコンとDCモータを直接つなぐことはできません。
DCモータを制御する場合は一般的には「モータードライバIC」を使います。これは、マイコンにつないだ信号線のHIGH/LOWのパターンにより、大きな電流を流したり逆流させたりすることができます。
A33F-EX1のモータドライバ
A33F-EX1には、RCサーボを駆動するための30個のポート以外に、4つのDCモータの正転/逆転を制御できるポートもあり、これにはモータドライバICが接続されています。
これはEX1の裏面です。2つ付いているICがモータドライバICでフリースケール社製のMPC17531Aを使っています。
MPC17531Aは1個で2つのDCモータ又は1つのステッピングモータをドライブすることができます。小型モータ用で、出力は700mAまでと限られておりますが、ホビー用の小さなモータ、たとえばマブチモータならばRE280クラスまでは問題なく駆動することができます。
MPC17531のデータシート
IC用の電源と、モータ用の電源は別回路になっており、モータにはモータにあった電源を接続することができます。モータの電源は2〜8.6Vを入れることができますので、この範囲の電圧で動くDCモータを駆動することができます。マブチモータは1.5〜3Vなので問題なく動かすことができます。
これはA33F-COREに装着したところです。取り付け方はA33Fのページを参照願います。
DCモータ用ポートを拡大したところが次の写真です。
各端子は、モータドライバを経由してdsPIC33FのOC1〜OC8端子につながっています。
<同時にRCサーボを動かす場合の注意>
RCサーボを動かす場合もオプションボードのA33F-EX又はA33F-EX2を使うことになりますが、A33F-EXの方はいくつかの端子がDCモータ駆動(又はステッピングモータ駆動)端子と共通になっています。以下の端子はDCモータ駆動時にはRCサーボ駆動には使えませんので注意して下さい。
基板上の表示 |
DCモータ端子と共通 |
D4 |
OC5(RD4) |
D5 |
OC6(RD5) |
D6 |
OC7(RD6) |
D7 |
OC8(RD7) |
Hブリッジ回路とDCモータの接続
1つのMPC17531にはFETによるHブリッジ回路が2個入っています。Hブリッジ回路はマイコンからの入力(INPUT)信号で、モータを駆動する電流(OUTPUT)を出力します。下はMPC17531データシートからの抜粋です。
IN1AとIN1Bが1つのセット、IN2AとIN2Bが1つのセットとなり、片方だけがHIGHだと回転し、どちらもHIGHだとSTOPとなります。どちらもLOWだと回転しません(表ではRUNとなっているが回転しません。)。
2つあるモータドライバとdsPIC33Fは次のようにつながっています。
片方のドライバIC
マイコンの端子 |
ドライバのINPUT |
OC1 |
IN1A |
OC2 |
IN1B |
OC3 |
IN2A |
OC4 |
IN2B |
もう片方のドライバIC
マイコンの端子 |
ドライバのINPUT |
OC5 |
IN1A |
OC6 |
IN1B |
OC7 |
IN2A |
OC8 |
IN2B |
ということで、1つのモータは次のような2本セットづつで接続されます。
例えば、OC1とOC2がつながっているDCモータを駆動しようとした場合は、OC1をHIGHにしてOC2をLOWにすると一方方向に回ります。OC1をLOWにしてOC2をHIGHにすると逆方向にまわります。モータの途中に書いてあるのは抵抗です。これは電流を制限するもので、必ず必要です。抵抗を入れないとモータドライバICが壊れますので注意して下さい。ということでまだ接続はしないで下さい。抵抗については後で説明します。
各端子の間にもう1つの端子がありますが、これはGNDで、ステッピングモータを駆動するときに使います。
モータのPWM制御
Hブリッジは単純に片方をHIGHにしつづけると、モータが全開で回転します。モータのパワーを制御する方法にPWM制御というものがあります。PWM(Pulse
Width Modulation)の略で、出力を高速にON/OFFすることでパワーを調整します。
尚、RCサーボもパルス波形の信号で制御しますのでPWMと言いますが、産業界で一般的にPWMと言えばこちらの方になりますのでご注意下さい。RCサーボはパルス”信号”をマイコンが読みとってモータを制御しますが、こちらはモータへ流す電気自体をパルス状にするものです。
下の図がPWMを図説したものです。パルス周期は一定で、その周期の何%の時間にONしていたかで出力が決まります。(AGB65-SACの図を引用していますので最後のところ(100%以上の部分)は無視してください。)
パルス幅の割合を「デューティー」と言います。
DCモータ(マブチモータ)の接続
マブチモータはコイル抵抗が非常に低いので、乾電池を直接つなぐと数百〜1A以上の電流が流れます。モータドライバは700mAまでしか供給できないので、電流を制限する必要があります。
電流を制限するには2〜3オームの、ワット数が大きい酸化皮膜抵抗を使います。電子部品でよくつかわれている1/4Wカーボン抵抗などでは抵抗が非常に熱くなって危険ですので使用しないようにしてください。抵抗は同じ値のものを、モータのプラスとマイナス両方に取り付けます。(電気が逆流もするので)
A33F-EXからは2.54mmピッチのピンヘッダが出ています。そこに抵抗を経由したモータをつなぎます。モータ側にもコネクタをつけた方が取り外しできるので便利でしょう。下はマブチのRE140モータに3オームの酸化皮膜抵抗を付けて、浅草ギ研で販売している2550コネクタ1x1を各端子に取り付けたところです。写真では抵抗を接続した部分がむき出しになっていますが、実際には絶縁テープか熱収縮チューブで必ず覆って下さい。むき出しの部分が接触してショートすると非常に危険です。
モータ用電源には、A33F-EX1に添付されているコネクタを切って、単三乾電池2本直列(3V)につないでいます。
接続はOC1とOC2の部分に取り付けました。
dsPIC33Fの出力比較(アウトプットコンペア)機能
dsPIC33FでPWMを発生させるにはdsPIC33Fデータシートの「14章出力コンペア」の部分を参照します。ドキュメントによって名称が違うのですが、出力(又はアウトプット)・比較(又はコンペア)という名称になっています。出力比較はタイマを1つ使い、あるカウント値になったらOC1〜OC8の出力を変化させるというもので、いろいろなパルスを生成できます。その中で、PWMモードというのがあり、これで簡単にPWM波形が生成できます。
タイマはTIMER2かTIMER3のどちらかを選ぶことになっています。初期状態ではTIMER2が使われます。設定はOCxCONレジスタで行われます。xには各端子に該当する1〜8の数値が入ります。つまり、OC1端子から出るパルスはOC1CONレジスタで設定します。ということでこのレジスタは8個存在します。
PWMモードにするにはOCMビットを 111 か 110 にしますが、フォールトピン(緊急停止させる端子)はつながってませんので、 110 つまり10進数で6を設定することになります。
PWMモードでは、周期を生成するのにTIMERの比較レジスタを使います。初期設定ではTIMER2が出力コンペア用のタイマに設定されているので、PR2レジスタ(TIMER2の比較レジスタ)の値にセットした周期がPWM周期になります。
デューティーは、出力コンペア用のOCxRSレジスタ(カウンタ)で設定します。周期と同じ値が100%になります。
OCxRSも端子の数だけ8個分あります。OC1RS、OC2RS...
RCサーボのパルスを生成する場合にはいくつかのタイマーと割り込みを使って複雑なプログラムを組みましたが、このようにPWMは簡単な設定で作ることができます。
モータのPWM制御のプログラミング
実際に作ったプログラムがこちらになります。(右クリックで対象を保存)
PWM.c
特に別関数をつくることもなく、OCxCONとOCxRSの設定だけで自動的にパルスが生成されます。
今回もFcy(動作クロック)は36.85MHzで実行しています(詳しくは前の方のぺージを参照)。TIMER2はプリスケーラを1/8に設定しており(行74)、PR2を4606にすることで1mS周期としています。
周期がPR2=4606ですのでOCxRSに4606を入れると100%となります。たとえば、50%のデューティーにしたい場合は4606x0.5=2303をOCxRSにセットすれば該当するOC1〜8の端子のPWMが50%に変化します。
このプログラムでは1秒ごとにPWMを約10%づつ変化させています。実行したところ、モータの回転速度が1秒ごとに変化しました。
おわりに
次はADコンバータの使い方について説明します。
2007年12月4日
|