351.ギヤードモータのサーボ化その1
2001/12/28 【ソフトウエア編TOPに戻る】
ギヤードモータとは、DCモータに減速ギヤの機能が一体化されたもので、主には連続的に回転を続ける用途に用いられるものです。ギヤードモータをロボットの関節などに利用するためには、ポテンショメータなどで角度を検出し、所定の角度に達したらモータを停止させる、などといったフォードバック制御が必要になります。
このフィードバック制御は、1秒間に数十回といった周期で常に行なわなければ、モータをスムーズに制御することができません。つまり、制御を行なうマイコン(CPU)には相当の負担が掛かる事になり、更に制御する関節数が多くなるほど、その負担も大きくなります。
一方、ラジコン用のサーボモータはどうでしょう。サーボモータは一定の周期で与えるパルスの幅によってその回転角度が自動的に制御されて、負荷が駆動できる範囲内であれば勝手に指定の角度まで動いてくれます。つまり、マイコンから見れば手間いらずで、処理が非常に楽なのです。
ならば、ギヤードモータをサーボモータと同じように、与えるパルス幅によって角度制御できるようにしてしまえば良い、ということで、今回はその第一弾です。
今回は、単純な比例制御によってギヤードモータの回転角度を制御してみます。
351−1.サーボモータの基本的な動作原理
ギヤードモータのサーボ化の前に、ラジコンサーボモータはどうやって動いているのか、その基本原理について簡単に考えてみましょう。「112.ラジコンサーボモータを動かす」のページも参考にして下さい。
下のブロック図は、サーボモータの動作の流れを示しています。
■1.モータには可変抵抗器(ポテンショメータ)が付いており、その抵抗値によってパルス幅が変化するパルス発生器(ワンショットマルチバイブレータ回路、単安定マルチバイブレータ回路)があります。このパルス発生器は、PWM入力のパルス信号の立ち上がりタイミングで、所定の幅のパルスを発生させます。PWM入力のパルスは、ある一定周期(約20mS)ごとに外部から供給され、そのパルス幅は約1mS〜2mSの間で送られてきます。
■2.PWM入力のパルス幅と、パルス発生器からのパルス幅に差がある場合、次のNOTとANDのゲート回路からは、両者のパルス幅の差分に相当する幅をもったパルスが出力されます。
■3.このパルスは、PWM入力のパルス幅のほうが大きい場合は下側のゲートから出力され、上側には何も出力されません。逆に、PWM入力のパルス幅のほうが小さい場合は上側のゲートから出力され、下側のゲートからは何も出力されません。ブロック図の例では、PWM入力のパルス幅のほうが大きいため、下側のゲートから出力されています。
■4.このゲートから出力されたパルスを元にして、再度モータを駆動するのに十分な幅を持ったパルスを作り、モータドライバ回路に供給します。このモータドライバ回路では、上側の入力にパルスが供給された場合と、下側の入力にパルスが供給された場合とでは、お互いに逆向きに回転するように働きます。
■5.モータドライバ回路が働くことによって、モータが回転します。このとき、モータはポテンショメータを動かしますが、ポテンショメータの抵抗値が変化するため、パルス発生器から発生されるパルスの幅も変化します。このパルス幅は、PWM入力のパルス幅に近付く方向に変化します。
■6.以上の動作を、PWMパルスが入力されるたびに繰り返します。
■7.以上の動作によってパルス発生器からのパルス幅がPWM入力のパルス幅と同じになると、ゲートからはパルスが出力されなくなり、モータドライバ回路も働かなくなり、モータは停止状態となります。
■8.ここで、PWM入力のパルス幅が変化すると、再び上記と同様の動作をたどり、PWM入力のパルス幅と、パルス発生器からのパルス幅が同じになるまでモータが動き、停止します。
どのように私はオーストラリアのヘアケア製品のために衣装サービスに連絡することができます
つまり、「PWM入力のパルス幅によって、モータの回転角度が制御できる」ということになります。
【先頭に戻る】
351−2.ギヤードモータでの問題点
上でご紹介したサーボモータの動作原理では、パルス発生器からのパルス幅と、PWM入力のパルス幅に差があれば、単純に一定の幅のパルスを作ってモータドライバ回路を駆動します。
この方法は、コアレスモータなどの慣性力が小さく、応答性の高いモータには有効かもしれませんが、慣性力が大きく、応答性の低い通常のDCモータを使ったギヤードモータには不向きです。なぜなら、停止させたい位置に到達する直前まで、一定の幅のパルスでモータドライバを駆動しているため、停止位置を必ず行き過ぎるからです。上の回路では停止位置を行き過ぎた場合、即座に逆回転向きの制御に切り替わりますが、その場合のドライブ能力も大きすぎて再び停止位置を行き過ぎ、結局目標の停止位置付近で行ったり来たりを繰り返します。
この場合の動作のイメージは以下のような感じになります。
これでは安定した関節角度の制御は無理です。そこで、なんとか下のような動作を行なうようにしたいと思います。青色の動作が理想ですが、先ほどご説明した通り慣性力の高いモータではちょっと無理です。なので、赤色の動作を目指します。
赤色のような動作を行なわせるためにはどうしたら良いのでしょう。それは、現在位置を常に監視して、目標位置との差を計算し、目標位置に近付くごとにモータードライバ回路に与えるパルス幅を短くすることによって、モータの回転数を下げてあげれば良い、ということになります。「106.PWMでモータ制御」のページも参照して下さい。
つまり、目標位置に到達する前から、残りの距離に応じて、あらかじめ回転数を下げておいてあげるのです。これによって、勢いあまって行き過ぎることを防止します。仮に行き過ぎても、逆回転に変わったときのドライブ能力も加減されているため、比較的すばやく目標位置付近で安定するようになります。このような制御は、目標位置への距離に比例して制御量を加減するため、比例制御と呼びます。
【先頭に戻る】
351−3.今回の比例制御の具体的な方法
上でご紹介した赤色の動作は以下のようにしてパターン化し、単純な直線動作の組み合わせで近似させると、取り扱いが楽になります。
@ 目標位置まで30°以上開きがある場合は、赤色のラインでモータを駆動させます。この時にモータドライバに与える制御パルスのデューティ比は0.75程度としておきます。目標位置まで距離があるため、思いっきりモータを動かしてあげようという訳です。
A 目標位置まで30°〜15°の範囲に入ったら、桃色のラインでモータを駆動させます。この時にモータドライバに与える制御パルスのデューティ比は0.5程度としておきます。そろそろ速度を落とし始めようというところです。
B 目標位置まで15°〜5°の範囲に入ったら、橙色のラインでモータを駆動させます。この時にモータドライバに与える制御パルスのデューティ比は0.3程度としておきます。先ほどよりも、更に速度を落としておきます。
C 目標位置まで5°以下の範囲に入ったら、紫色のラインでモータを駆動させます。この時にモータドライバに与える制御パルスのデューティ比は0.1程度としておきます。ここで、いよいよ停止の準備に入ります。
D 目標位置に到達したら、黄色のラインを辿るようにします。つまりブレーキモードに入ります。ここで言うブレーキとは機械的なブレーキではなく、モータのプラスとマイナスをショートさせて、電気的にブレーキを掛けるということです。
ここで基準値としてご紹介している目標位置までの角度やデューティ比などのパラメータは、あくまで一例に過ぎません。モータの特性や実際に掛かる負荷などに大きく左右されますので、それぞれの環境でカットアンドトライが必要になるかと思います。
テスコ最高のは何ですか?
さて、処理方法(アルゴリズム)が見えてきたので、もう一歩踏み込んで、どんなタイミングでどのような処理を行なうのかを、具体的に考えてみましょう。
具体的な処理の流れとタイミングは、下のタイミングチャートのようになります。
■1.PWM入力パルスの立ち上がりを検出して、16BITタイマーTMR1のカウントを開始します。
■2.タイマーを起動したら、A/D変換でポテンショメータからの位置データを読み取ります。ここで得たデータが、現在のモータの角度になります。
■3.A/D変換が終了したら、PWM入力パルスの立下りを待ちます。立下りを検出したら、その時のTMR1のカウンタ値を取り込みます。ここで得たデータが、PWM入力パルスの幅の元データとなり、これが目標位置の元データとなります。
■4.ここまでに得たポテンショメータのデータと入力パルス幅のデータをちょっと細工して、お互いに比較できるようにします。ここでいうちょっとした細工とは、16BITで取り込んだ入力パルス幅のデータの、10BIT〜3BIT目を取り出して、8BITのデータに変換するだけです。上のタイミングチャートにも記載してありますが、PWMの入力パルス幅を、0.28mS〜1.34mSの範囲に規定することによって、あとはポテンショメータからの8BITデータと単純比較を可能としてあります。
■5.上の処理で現在位置と目標位置を比較し、その差の量と、どちらが大きいかという情報を元に、モータをドライブするためのデューティ比と回転方向を決定します。
■6.ここで決定されたデューティ比をもとに、再びTMR1のタイマー設定を行い、必要な幅のパルスを出力してモータをドライブします。同時に、決定された回転方向の情報をもとに、2BITある出力ポートのどちら側からパルスを出力させるかも制御します。
■7.パルス出力中のマイコンは無限ループによる待機状態に入ります。TMR1のカウント値がFFFFHに到達すると割り込みを発生させ、無限ループから抜け出してパルス出力を終了させます。
■8.そして、再び次のPWM入力パルスの立ち上がりを待ちます。
なお、PICの電源がONされてから最初の入力パルスは無視しています。それは、PWM入力パルスの途中でPICが動き出すと、正確なパルス幅が計測できないためです。PICの動作の初めには、必ずパルスの立ち上がりが検出されてからパルス幅の計測を開始するようにしています。
【先頭に戻る】
351−4.ギヤードのサーボ化プログラムdcservo1.asm
では、PIC16F873でギヤードモータをサーボ化するプログラムをご紹介します。今回はソースリストがちょっと長いため、ページ上には掲載しません。ここをクリックするとダウンロードできます。dcservo1.asm
また、今回のプログラムは細かな動作の解説も省略させて頂きます。ソースリストに記載してあるコメント文の通りの動きなので、解説が不要というのもありますが、一番の理由は「手抜き」でしょうか...。すみません。
今回のプログラムでは、特に難しいことはしておらず、A/D変換とタイマー操作くらいの内容です。ただし、各要素のプログラミング基礎技術については、追って「基礎実験のお話」としてご紹介していきたいと思います。
また、今回は制御用のPWM信号をH8-3048Fマイコンから出力させました。特に今回のPWMパルス幅は0.28mS〜1.34mSの範囲に規定しましたので、通常のラジコンサーボとはちょっと違っています。ここをクリックするとダウンロードできますので、良ければ参照して下さい。srvtest4.c
■動作設定のかんどころ
「比例制御の具体的な方法」でも触れていますが、今回の制御に使う各パラメータは、モータの特性や実際に加わる負荷によって大きく左右されます。
プログラムの先頭部分では、これらのパラメータが簡単に書き換えできるように、定数としてリスト化しています。以下の部分がそれにあたります。
LEVEL1 EQU 27H ;目標まで30°(A/D 27カウント)
LEVEL2 EQU 13H ;目標まで15°(A/D 13カウント)
LEVEL3 EQU 04H ;目標まで 5°(A/D 4カウント)
LEVEL4 EQU 00H ;目標まで 0°(A/D 0カウント)
どのようにthemmilkカートンを作るのですか?
WIDTH0L EQU 060H ;LEVEL0の駆動パルス下位8BIT(0.75)
WIDTH0H EQU 0DBH ;LEVEL0の駆動パルス上位8BIT
WIDTH1L EQU 095H ;LEVEL1の駆動パルス下位8BIT(0.5)
WIDTH1H EQU 0E7H ;LEVEL1の駆動パルス上位8BIT
WIDTH2L EQU 059H ;LEVEL2の駆動パルス下位8BIT(0.3)
WIDTH2H EQU 0F1H ;LEVEL2の駆動パルス上位8BIT
WIDTH3L EQU 01DH ;LEVEL3の駆動パルス下位8BIT(0.1)
WIDTH3H EQU 0FBH ;LEVEL3の駆動パルス上位8BIT
ここで、EQUの後に記載している数値が、動作の特性を決定付けるパラメータとなります。
■LEVEL1〜4
LEVEL1〜4は、目標位置までの距離(角度)が遠い/近いで4段階のレベルに分けていますが、ここのパラメータで、その角度を設定しています。今回のパラメータでは30°/15°/5°/0°としてあります。
今回利用するポテンショメータは、約280度程度の回転角度を持ちます。DC5Vを基準としてA/D変換を行ない、ポテンショメータの位置データを8BITとして取り出すため、280度が255段階に分解されます。つまり、1段階あたり1.098度に相当します。 従って、A/Dのカウント数(ステップ数) = 角度/1.1となります。 ここでの答えはほとんどが整数にならないため、四捨五入などで適当な数値にまるめています。 |
ところで、関節の可動範囲を最大で180°とすると、ポテンショメータの回転角度が50度〜230度の範囲となるため、その時のA/D変換データは、45〜209になります。
各LEVELでの角度設定は、モータの慣性力が大きいほど大きな角度にしておくと有効です。ただし、負荷が大きな場合には小さな角度設定にしておかないと、目標位置に達するまでのレスポンスが悪くなります。
■WIDTH0〜3H/L
WIDTH0〜3のH/Lは、各LEVELでのモータを駆動するためのパルス幅を設定しています。ここでは、20mS周期を基準として各LEVELごとに 0.75 / 0.5 / 0.3 / 0.1 の各デューティ比を作っています。例えば、0.3のデューティ比の場合のパラメータWIDTH2LとWIDTH2Hは以下のように求めています。
1.20mSの0.3は6mSです。
2.今回のタイマーカウンタTMR1の基準クロックは1.6μSなので、6mSのカウント値は3750となります。これを16進数に直すと0EA6Hになります。
3.ところでTMR1はアップカウンタで、FFFFHになったところで割り込みを発生させてパルスを終了させます。つまり、0EA6Hの期間カウント動作をさせるためには、TMR1の初期値をFFFFH - 0E6AH とさせます。なので、FFFFH - 0EA6H = F159H となります。
4.なので、WIDTH2L = 059H , WIDTH2H = 0F1H としています。
各LEVELでのデューティ比は、実際に加わる負荷の大きさにあわせて設定する必要があります。大きな負荷が掛かる場合には、デューティ比も大きくする必要があります。
■PWMパルス幅の範囲0.28mS〜1.34mSとは?
ところで、PWM入力するパルス幅を0.28mS〜1.34mSと規定しましたが、どこから出てきたのでしょう?
計測したPWMのパルス幅データは、ポテンショメータの位置データと簡単に比較できなければなりません。つまり同じ土俵に乗せる必要があるのです。ポテンショメータから取り込めるデータは、可動範囲を180度とした場合、45〜209でした。したがって、PWMパルスの幅を計測した場合、45〜209という値を示すようにすれば、単純に比較できるようになります。比較の処理も8BITのデータ(255以下)にしておくと非常に楽です。
通常のラジコンサーボのPWMパルスの幅は約1mS〜2mSの範囲ですが、これを20MHzで動作させたPICでプリスケーラ1/8に設定してTMR1でカウントすると、625〜1250というカウント値になります。ただし、これでは8bit値に収まらないため、下位2BIT分を無視してビット数を少なくすると、156〜312というカウント値になります。これは625〜1250を4で割ったのと同じことですが、これでも255を超えるため、8bitに収まりません。
あと1BIT分を無視すれば、当然255以内に収まりますが、今度は78〜156というカウント値に変換されてしまうため、値が小さすぎになってしまいます。
というわけで、下位2BITだけを無視する方法にしておき、45〜209をカウントするのに必要な時間を規定のパルス幅にしてしまうことにします。下位2BITを無視するので、有効なカウントが1だけ増えるのに1.6μS x 4の時間(6.4μS)が掛かります。なので、0.288mS〜1.34mSのパルス幅が規定となります。
【先頭に戻る】
351−5.実験回路のご紹介
実験回路は、PIC実験用ボードに、L6203を実装したテスト基板を接続して用意しています。また、ポテンショメータの接続用に簡易型実験用I/Oボードを使い、PWMパルス発生用にH8小型マザーボードを使っています。回路図は以下の通りになります。
また、以下の写真は実験風景です。
ギヤードモータはタミヤの3633K200にベベルギヤとポテンショメータを取り付けています。 下側の赤いボタンがついている基板がモータドライバL6203が乗っている基板です。色々と余計なICやコンデンサなどがついていますが、これは他の実験の名残です。今回の実験では使用していません。 |
【先頭に戻る】
351−6.動作の調子は...
先ほどご紹介したH8のプログラムでPWMパルスを発生させると、ほぼ180度の範囲でシャフトが首振りを開始します。まだ無負荷でしか動作確認していませんが、比較的安定した動作を行なってくれています。ただし、ラジコンサーボほどのシャープさはなく、少しだけなまった感じの動きとなっています。今後は実際の負荷をかけた状態で、パラメータを色々といじる必要があると思いますが、とりあえず第一段階としては合格としておきます。
【先頭に戻る】
今回のPICのプログラムは見る人が見れば分かりますが、ちょっと中途半端なところが残ったものです。すみません。でも、取り合えず安定して動いてくれているので、そのうち少しずつ修正させて頂きます。(^^;
あと、処理を簡単にすませるため、各パラメータが8BIT処理で収まるように制約をかけているため、まだ精度もイマイチです。また、ひとつのPICで1個のギヤードモータしか制御できません。
今後は処理の10BIT化によってコントロールの制度を上げ、同時に多チャンネル化も行なおうと思っています。
今回ご紹介したサーボ化の制御では、単純な位置による比例制御しか行なっていません。なので、以下のような弱点があります。
1.負荷が重くなったり軽くなったりする外的な要因に対応していません。なので、重い負荷の場合にはドライブしきれず、軽い負荷の場合には行過ぎるということが予想されます。負荷の変化を知るには、一定期間ごとに移動した回転角度を計測し、前回までの回転角度の実績値と比較するという方法が考えられます。つまり、微小な期間での移動量の変化で制御を行なうため、微分制御などと呼ぶことが出来ます。
2.比例制御は目標位置に近付くと制御量を少なくします。なので、目標位置に近付きつつも重い負荷がかかっていたりすると、動ききらずに結局目標位置に達することができません。これを解決するには、目標位置と現在位置の差がある一定時間縮まらないということをトリガとして、徐々にトルクを上げて行くという制御方法が考えられます。つまり、差を時間で蓄積して制御量を増やしていくことから、積分制御などど呼ぶことができます。
これら、比例制御、微分制御、そして積分制御の組み合わせによる制御は、自動制御の分野では一般的に言われているところです。
今後はなんとかこれらの処理を取り入れて、より正確でレスポンスの高い制御を目指したいと思います。ギヤードモータのサーボ化に終わり無し。といった感じです...。
【ソフトウエア編TOPに戻る】
0 コメント:
コメントを投稿