理系的な戯れ

理工学系とくにロボットやドローンに関する計算・プログラミング等の話題を扱って、そのようなことに興味がある人たちのお役に立てればと思っております。

Pythonで考えるDCモータの制御(9)電流フィードバックと根軌跡

はじめに

こんにちは、こうへいです。

今日はDCモータの電流フィードバックについて考えてみます。

電流をフィードバックをして電流値にゲインをかけると、 PI制御の速度制御系にD項を加えるのと同じ効果がでるはずです。 これは、速度の微分の加速度が電流に比例するからです。

速度制御についてはD項の必要性があまり無いように考えられるので、 これまでの検討でもD制御を入れていません。

しかし、応答が振動的になる際に、D項は役に立ちます。しかも単純に制御器に 微分を入れ込むよりは、電流をフィードバックした方がノイズに強い システムになる可能性があります。

もう一つの電流フィードバックの目的として、 電流にもPI制御などのサーボをかけると、 望ましい電流値にする事ができ、 トルクやロボットの加速度を制御する事ができるようになると思います。

今回は、未来の加速度制御のための、最初期の考察をしていきたいと思います。

DCモータの微分方程式

毎度、おなじみですが、全てはここからです

回路の方程式

{\displaystyle
L \frac{d i}{d t} + R i +K \omega = e
}

 

回転に関する運動方程式

{\displaystyle
J \frac{d \omega}{d t} + D \omega +T_L = K i
}

 

各変数は以下の通りです

  • {i} : 電流(A)
  • {e} : 入力電圧 (V)
  • {\omega} : 軸の角速度(rad/s)
  • {T_L} : 負荷トルク(Nm)

各パラメータは以下の通りです 

  • {L} : インダクタンス(H)
  • {R} : 巻線抵抗(Ω)
  • {K} : 逆起電力係数(Vs/rad)、トルク定数(N/A)(同じ値)
  • {D} : 動粘性係数(Nms/rad)
  • {J} : 慣性モーメント(Kg m2

DCモータの伝達関数

こちらも再掲載ですが、DCモータの伝達関数を上記の微分方程式から求めます。(負荷省略)

モータの微分方程式ラプラス変換します。

\displaystyle{
Ls I(s)+ RI(s) + K\Omega(s) = E(s)\\
}
\displaystyle{
Js\Omega(s)+ D \Omega(s)  =  K I(s)\\
}

小文字の関数は大文字へ直せば良いんでした。また、微分微分ラプラス変換の性質を適用しましたが、初期値0 なので、大変簡単です。

さらに、整理を進めましょう

\displaystyle{
(Ls   +R )I(s) = E(s)- K\Omega(s)\\
}
\displaystyle{
(Js+ D) \Omega(s)  =  K I(s)\\
}

電流と角速度について解くと

\displaystyle{
I(s) = \frac{E(s)- K\Omega(s)}{Ls   +R} \\
}
\displaystyle{
 \Omega(s)  =  \frac{K}{Js+ D}  I(s)\\
}

DCモータのブロック線図表現

伝達関数をブロック線図表現にしてみると次のようになるかと思います。

f:id:kouhei_ito:20200216072325p:plain
DCモータのブロック線図表現

電流の伝達関数と角速度の伝達関数の関係が図示されていてDCモータの構成が分かりやすく表示されていると思います。

コイルに電圧が印加されると、1次遅れで電流が立ちあがり、電磁石によりトルクが発生し、機械的回転がトルクの印加に対して一次遅れ的に立ち上がります。

全体的には2次のシステムとなる事がわかります。

数式から電流を消去して一つの伝達関数にしてしまうと、このような関係が分かりにくくなるので、二つの式からブロック線図を書いてみることは大変便利なツールとなっていると思います。

電流フィードバック

f:id:kouhei_ito:20200216103338p:plain
電流制御のブロック線図

図のように電流をフィードバックしてPI制御で制御してみます。実際のモータではシャント抵抗などを使って、電流を検出することになると思います。

電流のPI制御のステップ応答

実際のマイクロマウス を想定して、タイヤ直径24(mm)、ギヤ比4.6、マウスの質量80g、モータは1717T003Rとして計算を行います。

モータのスペック

モータの各種諸元は以下の通りです

  • R=1.07(ohm)
  • K=1.98e-3(Nm/A)
  • L=17e-6(H)
  • D=1.226e-7(Nms/rad)
  • Jm=0.59e-7(kgm2)
マウスの質量の慣性モーメントへの換算

マイクロマウス (Body)の質量をモーター軸の慣性モーメントJ_Bとして換算する必要があります。 ギヤ比をZとするとマウスの質量をMとしたとき慣性モーメントの換算式は以下です。

\displaystyle{
J_B=\left(\frac{M}{Z}\right)^2M\\
}

直線の加減速のみを考慮するとすると、モータ一個の担当する質量は全質量の半分と考えて良いです。まとめると

  • M=0.04(kg)
  • r=0.012(m)(タイヤの半径)
  • Z=4.6
  • J=3.31e-7
目標設定

2019年のクラシックマウス優勝のあささんのマウスの最高設定を参考にさせていただきました。

加速度の設定が速度0〜3.8(m/s)までが28(m/s2)です。

これは吸引をかけて垂直荷重をタイヤにかけないと、必要な推進力にタイヤの摩擦が負けますので、吸引をしてタイヤが滑らないことを前提にします。

しかし、この前提に対して、タイヤの転がり摩擦力を今回は無視します。これは現実的ではありません。これによってモータに流れる電流値が大きくなるはずです。また制御入力も限界を超えるかもしれません。最終的には転がり摩擦のことも考えたいと思っていますが、今回はインチキします。

この加速度a_{REF}を実現する電流値の目標は以下の式で計算できます。

\displaystyle{
i_{REF}=\frac{JZa_{REF}}{Kr}\\
}

計算すると約1.8(A)になりました。

比例ゲイン1、積分ゲイン1の場合

何も考えずにゲインを設定した場合が次の結果です。横軸の最大は1(ms)です。1(ms) の時にマウスの速度が0.028(m/s)程度に 達していれば、加速度28(m/s2)を満たしたことになります。

f:id:kouhei_ito:20200224164038p:plain
電流の過渡応答
f:id:kouhei_ito:20200224164130p:plain
入力電圧(制御入力)の過渡応答
f:id:kouhei_ito:20200224165053p:plain
マイクロマウス の速度の過渡応答

一見、電流値が一定値に収束しているように見えますが、値は0.86(A)程で目標に達していません。これは3つある極のうち収束の早い極が先に収束したためです。次に早い極は100000倍遅いのでこの時間幅では見えませんが、ずっと計算を続けていくと上がっていきます。ちなみに更に遅い極は一番早い極の100000000倍遅いです。

加速度は約13(m/s2)と半分以下です。

根軌跡

トライアンドエラーでゲインを決めても良いし、結局はそうなるのですが、もう少し見通しを得たいと思うものです。 そこで、比例ゲイン、積分ゲインを変化させた時の極がどうなるのかを調べてみたいと思います。

普通、比例ゲインだけある単純フィードバックにおいて比例ゲインを変化させたときの閉ループの極をプロットした図を 根軌跡と言いますが、本記事ではその応用版で、比例ゲインまたは積分ゲインのどちらか一方を固定値として そのときの極の変化をみてみたいと思います。図は複素平面で横軸は極の実部、縦軸が極の虚部です。

f:id:kouhei_ito:20200224171006p:plain
比例ゲインを変化させた場合の根軌跡

積分ゲインを100000に固定し、比例ゲインを0.01から1.8まで変化させました。

比例ゲインは目標値に対して大きすぎると制御入力の制限をすぐに超えるのであまり大きな値にできません。また積分ゲインの固定値については 極の値の変化がわかりやすくみられる値を試行錯誤で選びました。

上の根軌跡で応答が振動的にならない境目が比例ゲイン約1.54だと判ったので、その値に固定して積分ゲインを1000から1000000まで変化させてみました。

f:id:kouhei_ito:20200224172745p:plain
積分ゲインを変化させた根軌跡

比例ゲインを変化させないで積分ゲインを可変させると、大きく変化していく二つの極が振動的な解のうちは、 その実部の値は変化しないことがわかります。

そして、複素平面において二つの軌跡が実軸上の一点に向かって動きます。 実軸で交差するところの実部の値は比例ゲインによって決まり、先ほどの比例ゲインだけ変化させたときの、やはり交差点の実部の 値に一致します。

比例ゲインを大きくすると、実部の値の絶対値が大きくなります。 比例ゲインを大きくすると収束する速さが上がります。 従って、比例ゲインを制御入力が許すところまで大きくして、 根軌跡を書いて、振動解が出ないところを見出すのが良いのではと今のところは考えています。

最終的なステップ応答

比例ゲインを調整して定格の3Vをわずかに超えたところが1.7であったのでその値に固定し、根軌跡を書いて振動解にならない境目の値を積分ゲインとすると112000となりました。これらの値で、再度ステップ応答を求めてみました。

f:id:kouhei_ito:20200224174945p:plain
最終的な電流の過渡応答
f:id:kouhei_ito:20200224175017p:plain
最終的な制御入力の過渡応答
f:id:kouhei_ito:20200224175042p:plain
最終的なマイクロマウス の過渡応答

以上の結果は目標の加速度28(m/s2)をほぼ満たし、電流も目標値の1.8(A)に達しています。

電流フィードバックの伝達関数

以下は、以上の考察に必要だった伝達関数を明らかにしておきます。

説明の都合上、下図のように各伝達要素の一部を置き換えます。

f:id:kouhei_ito:20200216145413p:plain
電流制御簡略化版

これより目標値から、電流までの閉ループ伝達関数を求めますと次のようになります。

電流の伝達関数
\displaystyle{
i(s)=\frac{H(s)C(s)}{1+KH(s)M(s)+H(s)C(s)}R(s)\\
}

展開すると

\displaystyle{
i(s)=\frac{K_p J s^2 + (K_p D +K_i J)s + K_i D}{J L s^3 + (JR+DL+K_p J)s^2 + (DR+K^2+K_pD+K_iJ)s +K_iD}R(s)
}
制御入力の伝達関数
\displaystyle{
e(s)=\frac{H(s)C(s)}{1+KH(s)M(s)+H(s)C(s)}C(s)R(s)\\
}

展開すると

\displaystyle{
e(s)=\frac{K_p J Ls^3 + (K_pJR+K_p DL +K_i JL)s^2 + (K_pDR+K_iJR+K_iDL+K^2K_p)s+K_i DR+K^2K_i}{J L s^3 + (JR+DL+K_p J)s^2 + (DR+K^2+K_pD+K_iJ)s +K_iD}R(s)
}
角速度の伝達関数
\displaystyle{
\omega(s)=\frac{M(s)H(s)C(s)}{1+KH(s)M(s)+H(s)C(s)}R(s)\\
}

展開すると

\displaystyle{
\omega(s)=\frac{K K_p s + KK_i }{J L s^3 + (JR+DL+K_p J)s^2 + (DR+K^2+K_pD+K_iJ)s +K_iD}R(s)
}

おわりに

電流フィードバックをして電流をPI制御してみました。

本日の計算に用いたプログラムについてはgithubにアップしました。

GitHub - kouhei1970/current_control

根軌跡を用いてみましたが、まだまだ読み解けていないような気がしてますのでもう少し勉強したいところです。

電流を決められるので、実際のマイクロマウス を想定して、マウスの加速度を制御するようなことをしてみましたが 実際には更にこれに速度制御ループをつけることになると思います。

速度制御では内側の電流制御と外側の速度制御のゲインを合わせて調整する必要があります。 今回のゲインで良いかどうかも更に検討する必要があるかもしれません。

また、実際に制御を実装するという大きな山が遠くに見えています。

今回の計算例の時間幅が1(ms)であるので、実際のマイコンによるデジタル制御において 仮に電流制御を施すとしたら大変大きな周波数でサンプリングする必要がでてきます。

電流制御はハードで実現するといったことも検討しなければならないのかもしれません。