【入門】状態空間モデルをPID制御【数値計算】

【入門】状態空間モデルをPID制御【数値計算】 数値計算
【入門】状態空間モデルをPID制御【数値計算】

PID制御の離散化

微分解法はオイラー法。
注意点は[Nsec]という単位時間を最終的にはT1に置き換えて単位時間も調整可能にしている点

u(t)={Kpe˙(t)+Kie(t)dt+Kde¨(t)}()
e˙(t)e¨(t)をオイラー法で解決する。

e˙(t)=e(t)e(tΔT)ΔT[Nsec]=e(t)e(tΔT)ΔT/T1={e(t)e(tΔT)}T1ΔT

上記のe(t)e˙(t)を代入することで2階微分となるため、
e¨(t)={e˙(t)e˙(tΔT)}T1ΔT={e(t)e(tΔT)}T1ΔT{e(tΔT)e(tΔTΔT)}T1ΔTΔT=T1ΔT{T1ΔT{e(t)e(tΔT)}T1ΔT{e(tΔT)e(t2ΔT)}}

積分に関しては以下で近似

x(t)dt=x(tΔT)+x(t)ΔTT1

それぞれをPID制御の変形式に代入する

u(t)={Kpe˙(t)+Kie(t)dt+Kde¨(t)}dt={{KpT1ΔT{e(t)e(tΔT)}+Kie(t)+KdT1ΔT{{T1ΔT{e(t)e(tΔT)}T1ΔT{e(tΔT)e(t2ΔT)}}}dt

最後の式の色分けしたところは同一(実際には1周期過去)と見なせる。
これによりブロック線図にした際はそれほど複雑にはならない。

ブロック線図

上記数式に合わせて起こしたブロック線図が以下となる。

PID制御器(変形式)ブロック線図、目標値、実値、1/zは前回値保持の意、Ki、Kp、Kd、T1、ΔT、e(t)、u(t)

同じ数式のところはブロック線図としては同一の信号線を参照すれば良いからいい感じに最適化される。

PID制御器を加味した構成図

PID制御器を加味した構成図が以下となる。
ちなみに、PID制御器内部はおおよそ-1~1の範囲で値が動くよう
フィードバック側は1/60にしている。

PID制御器を加味した構成図、指令器0~1の範囲で出力、指令器、制御器、PID制御器、DCモータ、状態空間モデル、target(t)、actual(t)、E(t)、u(t)、ω(t)

1/60の根拠

E(t)=1とした際に、角速度ω(t)はおおよそ60[rad/sec]に収束していた。
PID制御器の内部信号の動作範囲を-1~1としたい場合は1/60するとちょうど良い感じになる。
いわゆる正規化で、こうすることでPID制御器は割と純粋な数学の世界で動作し、
挙動が読みやすくなる。

各種コードへ

ここまでやると各ツール、各言語によるコード化が可能となる。
恐らく本記事の後にMATLAB,Python,Scilab,JuliaによるPID制御のコードを作成していると思う。

まとめ

  • DCモータの状態空間モデルを制御するためPID制御器を追加する。
  • 上記を実現するためPID制御器の離散化を行う必要がある。
  • PID制御器は速度型PIDとする。
    • ワインドアップ対策の都合、速度型PIDを使うことが多い。
  • 数式は複雑っぽく見えるがブロック線図としてはシンプル。

MATLAB、Python、Scilab、Julia比較ページはこちら

コメント

タイトルとURLをコピーしました