コンテンツにスキップ

PID制御

PID制御とは

PID制御(Proportional Integral Derivative Control)は、目標値に対して現在の値を自動的に調整する制御方式である。

産業機器、ロボット、ドローン、自動車など幅広い分野で利用されている。

例えば、

  • モータの回転速度を一定に保つ
  • 温度を一定に保つ
  • ドローンを水平に保つ

といった用途に使用される。


PID制御が必要な理由

単純にモータへ一定の電圧を与えても、

  • 負荷変動
  • バッテリー電圧変化
  • 摩擦
  • 外乱

によって回転速度は変化してしまう。

例えば、

目標速度:100rpm

現在速度:80rpm

なら速度を上げる必要がある。

逆に

目標速度:100rpm

現在速度:120rpm

なら速度を下げる必要がある。

この調整を自動で行うのがPID制御である。


基本概念

PID制御は

  • P制御
  • I制御
  • D制御

の3つを組み合わせたものである。


誤差(Error)

まず目標値と現在値の差を求める。

誤差 = 目標値 - 現在値

目標値:100

現在値:80

誤差:20

この誤差を基準に制御量を決定する。


P制御

比例制御

P(Proportional)は比例制御を意味する。

誤差が大きいほど強く制御する。

P出力 = Kp × 誤差

Kp = 2

誤差 = 20

なら

出力 = 40

となる。


メリット

  • シンプル
  • 応答が速い

デメリット

目標値に近付くにつれて出力が小さくなるため、

目標値:100

現在値:98

のように少し誤差が残ることがある。

これを定常偏差という。


I制御

積分制御

I(Integral)は積分制御を意味する。

誤差を時間方向に蓄積する。

I出力 = Ki × 誤差の累積値

誤差が5の状態が続く

すると

5
10
15
20
...

のように積算される。


メリット

定常偏差をなくせる。

例えば

目標値:100

現在値:98

が長時間続くと、

I制御が出力を増加させて100へ近付ける。


デメリット

積分しすぎることがある。

これを

積分飽和
(Integral Windup)

という。


D制御

微分制御

D(Derivative)は微分制御を意味する。

変化速度を監視する。

D出力 = Kd × 誤差変化量

誤差

20
15
10
5

と急激に減少している場合、

D制御は

減速しろ

と判断する。


メリット

オーバーシュートを抑制できる。


オーバーシュートとは

例えば

目標値:100

なのに

120

まで行き過ぎる現象である。

100 ───────────────
                 /\
                /  \
               /    \

D制御はこれを抑える役割を持つ。


PID制御

実際には

P + I + D

を合計する。

\[ u(t) = K_p e(t) + K_i \int e(t)dt + K_d \frac{de(t)}{dt} \]

意味

項目 役割
P 今の誤差を見る
I 過去の誤差を見る
D 未来の変化を予測する

イメージ

P
「今ズレてる!」

I
「ずっとズレてる!」

D
「このままだと行き過ぎる!」

を同時に考えている。


グラフイメージ

Pのみ

目標値
────────────

現在値
───────╱─────

少し誤差が残る。


PI

目標値
────────────

現在値
─────╱────────

目標値へ到達する。


PID

目標値
────────────

現在値
─────╱────────

より滑らかに到達する。


ゲイン

PID制御には3つの係数が存在する。

係数 意味
Kp 比例ゲイン
Ki 積分ゲイン
Kd 微分ゲイン

Kpを大きくする

応答速度 ↑
振動 ↑

Kiを大きくする

定常偏差 ↓
振動 ↑

Kdを大きくする

安定性 ↑
応答速度 ↓

モータ制御での利用

例えば

目標回転数

100rpm

現在

80rpm

なら

PID制御がPWM出力を増やす。

目標:100rpm
現在:80rpm

↓
PID計算

↓
PWM増加

↓
速度上昇

温度制御での利用

ヒーター制御などでも利用される。

目標温度
50℃

現在

45℃

なら出力を上げる。

現在
55℃

なら出力を下げる。


STM32での実装例

float error;

error = target - current;

integral += error;

derivative = error - prev_error;

output =
    Kp * error +
    Ki * integral +
    Kd * derivative;

prev_error = error;

これは最も基本的なPID制御の実装例である。


Asterでの利用

差動遊星歯車機構はギア同士の差を使用するものなので制御には正確さが求められる。そのためPID制御は必須の技術であり。優先順位的に(緊急停止などの安全装置を除いた)一番上に位置する。またPID制御には欠点がありそれを補うためにアンチワインドアップを追加している。

以下が実際の流れである

流れ


まとめ

PID制御は目標値へ滑らかに到達させるための制御方式である。

  • P:現在の誤差を見る
  • I:過去の誤差を見る
  • D:未来の変化を予測する

を組み合わせることで、

  • モータ制御
  • 温度制御
  • ロボット制御
  • ドローン制御

など様々な分野で利用されている。

制御工学において最も基本かつ重要な制御方式の一つである。

参考文献

正直私の書いたノートより以下のサイト様の方がわかりやすいのでこのノートでわからなかった場合は以下を見ることをおすすめする。

PID制御とは?仕組みと動作イメージを分かりやすく解説!

なんでアンチワインドアップって必要なの? #MATLAB - Qiita