今回はDCサーボモータの実験です。実験とは言っても即実用可能なレベルで行ってみましょう。閉ループサーボメカニズムでは、実時間でのフィードバック制御(位置制御、速度制御、トルク制御)が必要ですが、これをワンチップマイコンで制御してみます。
なお、現在のサーボモータは「ACサーボ」と言われるメンテナンスフリーのSM型ブラシレスモータを使ったものが主流になっています。ACといってもトルク発生原理はDCモータと同じで、モータ駆動回路が少し違うだけです。モータ制御の原理はDCサーボモータが基本になっています。
実験するサーボモータコントローラのブロック図を図1に示します。主な構成部品は、たった1個のAVRとパワーアンプだけです。オペアンプ等のアナログ演算器は使用せす、サーボ演算は全てソフトウェアよるデジタル演算で処理します。
図2にサーボコントローラの回路図を示します。AVRは、モータ位置捕捉、サーボ演算、電圧出力などのサーボ制御およびホストコマンドの処理など殆どの機能を受け持ちます。パワーアンプ部は高効率なPWMモードのHブリッジモータドライバで、12V動作では50W程度までのモータを駆動できます。JP1はISPコネクタですが、動作中は使われないので、オプションの位置カウンタ表示器を接続するようにしています。P2はホストインターフェースで、パソコンのシリアルポートなどに直結して制御できます。P4はサーボコントローラで一般的なパルス入力です。
図3に製作したサーボコントローラを示します。44mm×85mmのボードにコンパクトに組み上げました。

図4に位置決めサーボの原理を示します。ポテンショメータやロータリーエンコーダなどで位置をフィードバックして指令位置と比較、エラー情報に応じてモータを回して指令位置に合わせるように制御されます。サーボ演算器はエラーアンプやPIDフィルタで構成されます。昔は、これらの演算機能は、オペアンプやF-Vコンバータ、差動カウンタ、DACなど多くのアナログ・ロジック部品で実現されていました。最近は、デジタル信号処理の発達によりこれらのサーボ演算がデジタル化され、さらには全く新しいサーボアルゴリズムも研究・実用化されています。
図4のようなシングルループのサーボは古典的サーボ(conventional servo mechanism)と言います。産業用の位置決めサーボにおいては古典的サーボはあまり用いられません。

図5に本機でのサーボ演算処理を示します。これは、現在主流になっている多段ループ構成のサーボメカニズムです。このように複数の制御ループを持つものをカスケード制御といい、進歩的サーボ(advanced servo mechanism)の部類に入ります。カスケード制御ではメジャー制御ループより高速応答の制御量を選んでマイナー制御ループ、サブマイナー制御ループを設けています。モーターに加える電圧に対する位置の変化は3次応答(電圧→電流(トルク)→速度→位置)となってそのままでは扱いにくいものですが、これにより各制御ループの制御対象の遅れ次数が減ってトータルの制御成績(指令に対する応答性や、外乱に対する剛性)を簡単に向上させることができるのです。
さて、これらのサーボ演算はソフトウェアによるデジタル演算器で処理しています。サーボ演算を離散近似するための更新レートは、メカの特性に対して十分に速ければよいので、 DSPでなくとも最近のマイコンなら十分に実現できます。更新レートは一般的に数100Hz~数kHzが選ばれます。本機の場合、1kHzとし、1回の更新は最大92μsec以内に処理されるので、AVRでも十二分に余裕があることが分かります。
演算処理の図からも分かるように、データパスを切り替えることにより4つの異なるサーボ動作モード(電圧制御モード、トルク制御モード、速度制御モード、位置制御モード)が選択可能です。それぞれの動作は、そのシリアルインターフェースを経由してパソコンなどのホストコントローラで制御できます。また、ファームウェアのちょっとした変更で完全に独立したモーションコントローラとしての動作も可能です。
電圧制御モード(モード0)は単にモータを定電圧で駆動します。トルク制御モード(モード1)では、速度に関係なく一定のトルクでモータを駆動します。速度制御モード(モード2)では、負荷に関係なく一定の速度でモータを回します。位置制御モード(モード3)はサーボシステムの最も一般的な動作で、指令された位置にモータを動かし、その位置に保持します。別の位置が指令されればすぐにその位置へ移動します。
サーボ動作パラメータ(各ゲインやリミット等)は、動的に変更が可能です。市販のサーボコントローラのような自動チューニング機能はありませんので、動作させながら最適な応答特性になるように調整する必要があります。また、AVRは128バイトのデータEEPROMを持っているので、サーボパラメータをセーブしておくこともできます。

本機では、52kHzのタイマー割り込みでエンコーダの2相出力(図2)をサンプリングして、回転方向の検出、位置カウンタの更新をしています。エンコーダのインターフェースには専用のバッファカウンタを使用するのが普通ですが、これをソフトウェアで処理することにより、外付け回路を省くことができます。
通常、ソフトウェア式の最大カウントレートはそのサンプリング周波数と同じになり、それ以上の回転速度ではカウントエラー(位置情報喪失)を起こして使えません。その点には少し工夫していて、エラーコードに対して特別な処理をすることによりサンプリング周波数の2倍まで対応できるようにしてあります。したがって、最大カウントレートは 104kcpsとなり、400ppr(1600cpr)のエンコーダを使用した場合、
最大速度 = (2 * 52k[sps]) / 1600[cpr] * 60 = 3900[rpm]
と、3900rpmまで対応可能ということになります。実際は割り込み処理のジッタや、エンコーダ出力の精度のバラツキにより、これより少し低い値までが実用速度になります。


本機は主にフォアグランドプロセスとバックグランドプロセスの2つのプロセスで制御されます。フォアグランドプロセスは、ホストからのコマンドを受信・解釈して実行します。バックグランドプロセスは、位置捕捉とサーボ演算をリアルタイム処理します。
本機は、そのシリアルインターフェースを介して接続されたパソコン等のホストコントローラから制御されます。通信フォーマットは、N81 38.4kHzで、パソコンなら直結可能です。続いてオンラインコマンドについて説明します。
| Mode# | サーボ動作モード |
|---|---|
| 0 | 電圧制御モード (初期値) |
| 1 | トルク制御モード |
| 2 | 速度制御モード |
| 3 | 位置制御モード |
M <Mode#><CR>
サーボ動作モードを切り替えます。これは、サーボ演算(図5)のデータパスを切り替えるものです。同時に位置指令レジスタ、サブ指令レジスタ、位置カウンタをリセットします。モード番号とサーボ動作モードとの対応は右に示すとおり。
L<CR>
位置カウンタの値をリアルタイムで端末に表示します。何らかのキー入力で停止します。
E <Switch><CR>
コマンドエコーバックの切り替え。<Switch>に0を指定すると送信したコマンドのエコーバックをしません。1を指定するとエコーバックをします。初期値は1です。
位置決めモードでの連続追値動作など、Jコマンドで位置指令をノーウェイトで連続して送るときは、エコーバックを止めておかないと送信バッファがオーバーフローする場合があります。
S [<設定値>]<CR>
サブ指令レジスタは、16ビット符号付き整数で、モード0~2の場合のみ有効となります。<設定値>を省略すると、現在値を確認してから設定できます。Mコマンドでサーボ動作モードを変更した場合は、同時にサブ指令レジスタがクリアされます。
モード0でのレンジは、-255~255で-電源電圧~+電源電圧を制御します。モード1では、-255~255で-電源電圧~+電源電圧を制御(停止時)し、これに回転数に応じた逆起電力補正電圧が加算されます。モード2での設定値と回転速度の関係は次のようになります。
回転速度[rpm] = サブ指令レジスタ * 15000 / P1 / エンコーダ分解能[ppr]

J <位置><CR>
位置指令レジスタに値を設定します。位置指令レジスタは、24ビット符号付き整数で、モード3でのみ有効です。設定可能な値は、-8388608~8388607です。また、P4のパルス入力によっても変更されます。Mコマンドでサーボ動作モードを変更した場合は、同時に位置指令レジスタがクリアされます。
位置指令レジスタが書き換えられるとモータは設定された位置へ急激に移動しますので、長距離を一気に移動するとオーバーシュートやリンギング、振動を起こしやすくなります。このコマンドは、指令位置をリアルタイムで設定する追値制御に向いています(図9)。
位置指令レジスタはまた、パルス入力端子(STEP/DIR)からの信号によっても変更することができるので、普通のサーボコントローラとしても使用できます。

G0 <位置><CR> G1 <位置> <速度><CR>
このコマンドは、2つの異なる速度プロファイルでの動作があり、それぞれNC命令のG0とG1に相当します(図9)。G0コマンドは位置決め動作一般に使われ、指定された位置へ加減速を伴って移動します。速度プロファイルが台形になるので、台形制御といいます。最高速度(台形の高さ)と加速度(右辺左辺の傾き)は、別にサーボパラメータ(P6とP7)で指定します。G1コマンドは、切削動作などワークを一定速度で送るときに使われます。このときの送り速度はコマンドラインで直接指定します。
これらの動きは、フォアグランドプロセスにより生成されるため、動作が終了してモータが指定位置に整定するまで次のコマンドを受け付けません。Gコマンドの実行中に何らかのキャラクタを送ると、そこで送り動作を中断して急停止します。
P <パラメータ番号> [<値>]<CR>
<パラメータ番号>で指定されるサーボパラメータに<値>を設定します。<値>を省略すると、設定前に設定されている値を確認しながら設定できます。これらのサーボパラメータは、R/WコマンドでAVR内蔵のEEPROMにセーブ、ロードできます。
符号無し16ビット整数で、位置決めモードでの回転速度を制限します。たとえば、Jコマンドで一気に長距離を移動するような場合は、この制限にかかります。また、SMC3/Aでは無拘束速度より小さい値を設定しないとサーボエラーになる場合があります。
P0 = 制限速度[rpm] * P1 * エンコーダ分解能[ppr] / 15000
符号無し16ビット固定小数点数(小数点はバイト境界)です。例えば1.5を指定したい場合は、1.5*256=384を設定することになります。
出力トルク(電流)を制限します。符号無し16ビット整数です。特に小容量モーターでは焼損や減磁の防止のため適切な設定が必要になってきます。SMC3/Aではトルクリミットが一定時間続くとサーボエラーになります。また、ロボットハンドの握力を制御して対象物の破壊を防ぐなどの応用もあります。
P4 = 制限電流[A] / 電源電圧[V] * 電機子抵抗[Ω]
トルク制御のため、本来なら電流センサで電機子電流をフィードバック制御するのが普通ですが、本機では電流センサを省いています。指令した電流を電機子に流すため、回転速度に比例する逆起電力(EG )を補償した電圧をモータに加えるようにしているのです。あまり精度の良い制御方法ではありませんが、回路簡略化のメリットを取りました。このパラメータも符号無し16ビット固定小数点数(小数点はバイト境界)で、モータの特性から次のように算出して設定します。
P5 = KG [mV/rpm] / エンコーダ分解能[ppr] / 電源電圧[V] * 3840
G0コマンドでの移動速度を指定します。符号無し16ビット固定小数点数(小数点はバイト境界)です。
P6 = 速度[rpm] * エンコーダ分解能[ppr] / 15000
G0コマンドでの加速度を指定します。符号無し16ビット固定小数点数(小数点はバイト境界)です。
P7 = 加速度[rpm/s] * エンコーダ分解能[ppr] * 17
W<バンク番号><CR>
現在のサーボパラメータ(P0~P7)をEEPROMに保存します。EEPROMは8バンクに分かれていてそれぞれのバンクに現在のサーボパラメータを保存できます。
R<バンク番号><CR>
Wコマンドの逆で、任意のバンクのサーボパラメータをロードします。バンク0は電源ON時に初期値として自動ロードされます。


図10aにプロセス別のプロセッサ負荷率(G0動作中)を示します。エンコーダのインターフェースをちょっと無理してソフトウェアで処理しているため、実処理時間の多くをこの処理が占めているのが分かります。ソフトウェアでのエンコーダ取り込みはせいぜい2軸までが実用的なところでしょう。サーボ演算は多くの積和演算をしている割にはそれほど重い処理ではないようです。
このように、6割以上がアイドル状態となっていて、10MHz動作のAVRでも十分に余裕があるといえます。エンコーダのインターフェースに外部バッファカウンタを設ければ、数軸程度までの制御なら楽にこなせそうです。実際、仕事ではAVRとCPLDを使って6軸のサーボコントローラを設計しましたが…。
プログラムメモリは、1024ワードのうち8割以上を使用しています。単体での独立した制御に使うには残りが足りないかも知れません。オンラインコマンドなど必要ない物を削ってスペースを確保するか、またはもっと上位のAVRに置き換えるのがよいでしょう。
実際のロボット製作に応用する場合、SHやMIPSなどの32bitマイコンが主流でしょうから、外部バッファカウンタを設ければ20~30軸くらいは軽く制御できるはずです。

図11に実際のステップ応答の例を示します。Jコマンドでステップ的に指令位置を変化させて、それに対するモータの応答をプロットしたものです。図から1回転の整定時間は 40ms以下で、わずかなオーバーシュートがあることが分かります。
実際の機器に応用する場合は、実際の運転条件で動作させながら最適な特性になるようにサーボパラメータを調整します。このように現物合わせでやるならそれでよいのですが、動作の解析などサーボシステムの挙動を定量的に扱うには、フィルタやPLLの設計と同様に伝達関数を使用するのが普通です。サーボシステムにおける伝達関数の適用のしかたは、別の文献に譲ることにします。「伝達関数」「サーボ」で検索をかければたくさんの解説を見つけられるでしょう(ノイズも多いでしょうけど(^^;)。
サーボシステムについてもっと詳しく知りたい方には、次の文献がオススメです。自動制御の基礎理論からいろいろな発展型、具体的な応用例まで分かりやすく解説されているので、実際のシステムにすぐに応用することができます。
宮崎誠一/宮崎仁, パソコンで学ぶ自動制御の実用学, CQ出版, 1991
宮崎誠一/宮崎仁, パソコンで学ぶ自動制御の応用学, CQ出版, 1992
