C-StyleでPID制御

(参考:WikipediaPID制御」)

先日のPI制御のプログラムを手直ししてPID制御に変更する。

  • D制御要素の追加
    • 前回ループ時と今回ループ時の差分を変数「C」に代入(27行目)
    • 今回ループ時の偏差を次回ループ時に利用するため変数「V」に代入(28行目)
    • 操作量に微分動作分を加算(31,33行目)
  • 偏差の積分をリセットする際に、今回ループ時の偏差を無視していた点を修正(22〜25行目)。
  • 各ゲインに小数点以下も設定できるよう、操作量を共通の分母(変数「O」)で割るよう変更(34行目)。



▼PID制御 比例ゲイン=-1.0 積分ゲイン=-0.5 微分ゲイン=-0.5

比例・積分微分のP・I・Dの3要素が揃った制御は力強い。
パラメータを調整すればもっと良くなるかも。


▼PID制御 比例ゲイン=0 積分ゲイン=0 微分ゲイン=-1.0

微分要素だけのD制御でもそれなりに動く。


▼PID制御 比例ゲイン=-2.0 積分ゲイン=0 微分ゲイン=-1.0

比例要素と微分要素だけならPD制御となる。
他要素に比べて積分要素の計算は多いので、PD制御にすればプログラムをシンプルにできる。


比例制御(P)だけの場合、偏差が小さくなると操作量も小さくなるため、目標値に近い場合に、モーターを動かすだけの操作量を得られず、向きが少しだけズレた状態になる(オフセットが発生する)。

積分制御(I)が加わると、ズレた状態の偏差の積分値を元に制御するため、オフセットを小さくできる。ただし、積分値の計算には時間がかるため、急激な変化には対応しづらい。

微分制御(D)は、偏差の変化量に応じて制御するため、急激な変化への対応に向く。


PID制御を行う場合は、動作環境に応じて比例・積分微分の各ゲインと積分の間隔を調整する必要がある。
WikipediaPID制御」の「パラメータ調整」に、幾つかの調整方法があるが、書かれている通り最終的には試行錯誤して調整するしかないと思う。

調整の手間や、計算量を少なくするために、比例制御にしたり、PD制御にするなどの対応もありだと思う。

(完)