PID コントローラー アルゴリズム - Simulink シミュレーション

PID制御アルゴリズム

概要

閉ループ制御システムのブロック図
上の図は、閉ループ制御システムのブロック図です。

モーターの速度をデバッグするとします。上図の r(t) は目標速度、y(t) は速度出力、e(t) は速度誤差、u(t) は出力値です。 PID 計算後にモータに送信される場合、制御対象はモータです。PID コントローラがC ( s ) = U ( s ) E ( s ) C(s)=\frac{U(s)}{E( s)}C ()=E ()U ( s )、伝達関数はG ( s ) = Y ( s ) U ( s ) G(s)=\frac{Y(s)}{U(s)} です。G ()=U ()そして( s )の場合、検出デバイスは H(s) であり、フィードバック関数です。

この場合、システムの閉ループ伝達関数は次のようになります。ϕ ( s ) = Y ( s ) R ( s ) = C ( s ) G ( s ) 1 + C ( s ) G ( s ) H ( s ) \phi( s)= \frac{Y(s)}{R(s)}=\frac{C(s)G(s)}{1+C(s)G(s)H(s)}ϕ ( s )=R ( s )そして( s )=1 + C ( s ) G ( s ) H ( s )C ( s ) G ( s )

PID 伝達関数の形式: G ( s ) = U ( s ) E ( s ) = K s [ 1 + 1 T is + T ds ] G(s)=\frac{U(s)}{E(s)} =K_s[1+\frac{1}{T_is}+T_ds]G ()=E ()U ( s )=Ks[ 1+T私はs1+Tds ]
PID制御例
PID の微分計算形式:u ( t ) = K c [ e ( t ) + 1 Ti ∫ 0 te ( t ) dt + T dde ​​( t ) dt ] + u 0 u(t)=K_c[e (t)+\frac{1}{T_i}\int_0^te(t)dt+T_d\frac{de(t)}{dt}]+u_0u ( t )=Kc[ e ( t )+T私は10e ( t ) d t+Tddt _( t ) _]+あなた0

式中:K c 、 T i 、 T d K_c、T_i、T_dKc私はdこれらはそれぞれアナログ レギュレータの比例ゲイン、積分時間、微分時間であり、u0 は偏差 e=0 のときのレギュレータ出力であり、定常状態の動作点としても知られています。

u ( t ) = [ K pe ( t ) + K i ∫ 0 te ( t ) dt + K dde ​​( t ) dt ] + u 0 u(t)=[K_pe(t)+K_i\int_0^ と書くこともできますte(t)dt+K_d\frac{de(t)}{dt}]+u_0u ( t )=[ Kpe ( t )+K私は0e ( t ) d t+Kddt _( t ) _]+あなた0

そのうち、
比例係数K p = K c K_p=K_cKp=Kc

積分係数Ki = K c Ti K_i=\frac{K_c}{T_i}K私は=T私はKc

微分係数K d = K c T d K_d=\frac{K_c}{T_d}Kd=TdKc

エラー e(t)

PID が必要な理由

なぜ閉ループ制御が必要かというと、実際のアプリケーションでは、一定期間内で寸法を一定に保つ必要があるため、システムは入力のサイズを制御するために出力からのフィードバックを継続的に受信する必要があります。温度制御を例にとると、加熱ロッドは摂氏 30 度に保つ必要がありますが、天候によっては自然に摂氏 30 度に加熱することができない場合があるため、温度制御システムが温度を受け取ると、目標温度に達しない場合は加熱され、加熱ロッドが目標温度に達するように、自身の加熱力を増加させます。逆に、加熱が高すぎる場合、システムはフィードバックを受信した後、温度を一定に保つために自動的に入力を減らします。
クローズドループシステムの例
したがって、
一般に、
制御対象のフィードバック (測定された出力) を期待される基準入力から減算すると、エラー エラー値 を取得できます。このエラー値を取得した後、そのエラーを PID 制御コントローラーへの入力として使用できます。コントローラ制御入力の最終出力結果は制御対象プラントに直接渡されます。

K p K_pの分析Kpの役割(差動規制あり)

比例項:K p × err ( t ) K_p×err(t)Kp×えっr ( t )

  • 現在の偏差にのみ関連する偏差 e(t) に瞬時に応答し、対応する制御値 u(t) を生成します。

  • 制御動作の強さは比例係数K p K_pに依存します。Kp

    つまりK p K_pKp値が大きいほど効果が強くなり処理が速くなり静的偏差が小さくなります

  • でもK p K_pKp値が大きいほど発振しやすくなり、システムのオーバーシュートが大きくなり、システムの安定性が低下します。

要約: 比例項目をやみくもに増やすと、静的誤差は減少しますが、オーバーシュートも大幅に増加します。したがって、純粋な比例制御では、係数が小さすぎると静的誤差が発生し、係数が大きすぎるとオーバーシュートが発生するという矛盾した問題が発生することがわかります。システムの次数を増やし積分項を導入します。

シミュレータシミュレーション図

K i 、 K d K_i、K_dK私はKd両方が0の場合、K p K_pKpの大きさは、出力曲線の形状に影響します。

浅析 K i K_i K私はの役割

其实K i = K c T i K_i=\frac{K_c}{T_i}K私は=T私はKc、積分項: K i × ∫ err ( t ) dt K_i×\int err(t)dtK私は×えーr ( t ) d t

  • 偏差 e(t) が存在する限り、積分動作は増加し続け(コントローラーが飽和していないことが前提)、偏差 e(t) は減少し続けます。 0の場合、積分制御動作は停止します。
  • 統合制御を行うとシステムの応答速度が低下します
  • 積分作用が強すぎると系のオーバーシュートが大きくなり、系の安定性が低下します。

要約:積分項により静的誤差は除去できますが、オーバーシュートの影響がある程度大きくなり、システムが安定するまでの時間が長くなります。

シミュレータシミュレーション図

K p = 1、K d = 0の場合K_p=1、K_d=0Kp=1 Kd=0时, K i K_i K私はの大きさは、出力曲線の形状に影響します。

K d K_dの分析Kdの役割

実際には、K d = K c Ti K_d={K_c}{T_i}Kd=KcT私は、微分項: K d × derr ( t ) dt K_d×\frac{derr(t)}{dt}Kd×dt _でーる( t ) _ _ _

微分は微分であり、微分は傾向である変化の傾きと速度を反映します。微分が大きいほど、微分の効果は強くなります。

  • ディファレンシャルリンクは、偏差e(t)の変化傾向(変化速度)に応じて事前に修正動作を与えることができ、偏差が大きくなる前に修正することができる。
  • オーバーシュートを軽減し、衝撃を克服し、システムをより安定させるのに役立ち、システムの追従速度が向上し、調整時間が短縮されます。
  • ただし、差動動作は入力信号のノイズに非常に敏感であり、通常、ノイズが大きいシステムでは微分する必要がありません。そうでない場合、入力信号は差動の前にフィルタリングされます

概要: err(t)_ に急激な変化があるたびに、その急激な変化を打ち消すために大きな導関数項が生成されます。オーバーシュートは単なる急激な上昇とその後の急激な低下であり微分項がそれを相殺するため、これはまさにオーバーシュート現象に対応します。
シミュレータシミュレーション図

K p = 1 、 K i = 1 K_p=1、K_i=1Kp=1 K私は=1K d K_dKdの大きさは、出力曲線の形状に影響します。(Kd=1 が適切に機能します)

連続関数を離散関数に変換する

上で述べたことは実際には時間領域での演算です マイコンの内部はデジタルシステムであり、デジタルシステムは離散的でなければなりません したがって、連続 PID を離散 PID に変換する必要があります離散への変換は単なる差分、つまり、
U ( n ) = K p ∗ err ( n ) + K p TT i ∗ ∑ err ( n ) + K p T d T ∗ [ err ( n ) − err ( n − 1 ) ] U(n)=K_p*err(n)+\frac{K_pT}{T_i}*\sum err(n)+\frac{K_pT_d}{T}*[err(n)-err( n-1 )]U ( n )=Kpえっr ( n )+T私はKpTえっr ( n )+TKpTd[ er r ( n ) _えっr ( n1 ) ]
しかし、T は周期定数であるため、この式は次のように変形することもできます:
U ( n ) = K p ∗ err ( n ) + Ki ∗ ∑ err ( n ) + K d ∗ [ err ( n ) − err ( n − 1 ) ] U(n)=K_p*err(n)+K_i*\sum err(n)+K_d*[err(n)-err(n-1)]U ( n )=Kpえっr ( n )+K私はえっr ( n )+Kd[ er r ( n ) _えっr ( n1 ) ]

必須:

  1. PID 演算は周期タスク (タイマー割り込みとして理解できます) 内で完了する必要があります。

  2. サンプリング周期制御周期は係数に影響します。

一般的に、制御周期とサンプリング周期を長くすると、制御がスムーズになります 制御周期とは、制御コードを実行する周期のことで、一般的には動作用のPIDコードを設定するためのタイマの周期です サンプリング周期とは、制御コードを実行する周期のことです例えば、モーターのサンプリング周期はCAN受信割り込みの周期となります。

公式オープンソースコードと組み合わせる

これはpid.cのpid_calculate関数ですが、数式を組み合わせると意味が分かりやすくなります。Set は期待値、get はフィードバック、誤差 err はその 2 つを引いて得られ、pid→pout は比例項、err は直接線形増幅、pid→iout は積分項、err は累積され、pid→doutは差分項目で、err は差分を作成します。最後に、3 つを重ね合わせて pid コントローラーの出力を取得します。

/**
  * @brief     calculate delta PID and position PID
  * @param[in] pid: control pid struct
  * @param[in] get: measure feedback value
  * @param[in] set: target value
  * @retval    pid calculate output 
  */
float pid_calculate(struct pid *pid, float get, float set)
{
    
    
  pid->get = get;
  pid->set = set;
  pid->err = set - get;
  if ((pid->param.input_max_err != 0) && (fabs(pid->err) > pid->param.input_max_err))
    return 0;

  pid->pout = pid->param.p * pid->err;
  pid->iout += pid->param.i * pid->err;
  pid->dout = pid->param.d * (pid->err - pid->last_err);

  abs_limit(&(pid->iout), pid->param.inte_limit);
  pid->out = pid->pout + pid->iout + pid->dout;
  abs_limit(&(pid->out), pid->param.max_out);

  return pid->out;
}

シミュレータシミュレーション図

シミュレータシミュレーション図

システムの識別と、システム識別の結果に基づくコントローラーの設計については、公式のオープンソース チュートリアルを参照してください。

https://bbs.robomaster.com/thread-4941-1-1.html

https://bbs.robomaster.com/thread-5059-1-1.html

PID 制御の本質を理解します。

PID制御アルゴリズムの原理(公式を捨ててPID制御の本質を真に理解する) - 知る(zhihu.com)

おすすめ

転載: blog.csdn.net/dbqwcl/article/details/125711157