【DCモータの角度制御】第3回+α:エンコーダ分解能を考慮した目標指令
はじめに
第3回では「I-PD制御」と「アンチワインドアップ制御」を実際にマイコンに実装して応答を比較しました。
特に触れませんでしたが実はあの制御だけでは図1の赤丸部分に示すように定常状態で細かい振動を起こすという課題が残っています。図1の詳細については第3回の図11付近を参照してください。
今回はこの課題の解決方法について書いていきたいと思います。
振動の原因
振動の原因の前に、出力軸の角度を求める方法について説明します。【DCモータの制御】で使用しているモータとエンコーダは以下の通り。
モータとエンコーダは接続すると図のようになります。
この時、出力軸の角度θ[rad]というのは以下の式で求められます。cは変数、PとGは定数です。
- c:エンコーダのカウント数
- P:1回転した時のエンコーダのパルス数
- G:ギヤ比
今回の部品構成の場合、1回転した時のパルス数Pは12パルスです。ギア比に関しては製造元の販売ページを見ると厳密には50:1ではなく以下の式で計算した値になります。
よって出力軸の角度θ[rad]は以下の式で求められます。
この時、角度分解能θrは以下のようになります。
つまり、どれだけ頑張ったとしても0.5831[°]ずつしか角度を読み取ることができないのです。このエンコーダを使っている時に目標角度を1[°]としてもエンコーダの値としては0.5831[°]と1.1662[°]の間を行ったり来たりするだけで一向に偏差が0にならないということが起こります。目標値付近での細かい振動はこれによって発生しています。
振動の対策
エンコーダの角度分解能以上の精密な制御はできないので目標値を分解能に合わせることを考えます。つまり目標値を入力した場合、エンコーダの角度分解能で表現できる値の中で最も近い値を新たな目標値として制御系に与えます。全体的な流れを図3に示します。
ただ、これだけでは計算誤差の影響で偏差が0にならない可能性があるので分解能以下の偏差(今回の場合は0.5831[°]以下)は0とします。
プログラムへの実装
以上の説明をプログラムへ実装したソースコードを以下に示します。第3回のプログラムに付け加える感じになっています。単位のdegとradが統一されていないので少し見にくいかも...。
エンコーダ分解能を考慮してTeensy LCでIPD制御を行うプログラム
実験結果
このプログラムを使用して角度制御を行った結果を図4、5に示します。定常状態での振動がなくなっていることが分かります。
今回の対策をした場合としてない場合の定常状態における出力波形の拡大図をそれぞれ図6、7に示します。
ただ残念ながら図5を見るとシミュレーションと比較して角度の立ち上がりが一致していません。これは図8のログデータを見ると分かりますが、目標値が変化してから入力が変化するまでにラグが発生しているためです。
おそらくですがTeensy LCでは目標値の計算処理が追い付いていないのかもしれません。もっと動作速度の速いマイコンを使用すれば解消されると思います。
おわりに
定常状態で細かい振動を起こすという課題を一応解決しましたが、新たな課題も発生してしまいました。ラグについてはTeensy3.6で動かした時は発生しなかったのでおそらく動作周波数が関係していると思います。ただ、残念ながら手元にTeensy3.6がないので検証ができないのが現状です...。