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 の微分計算形式: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私は1∫0たe ( 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私は∫0たe ( 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私は=1、K 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 ( n−1 ) ]
しかし、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 ( n−1 ) ]
必須:
-
PID 演算は周期タスク (タイマー割り込みとして理解できます) 内で完了する必要があります。
-
サンプリング周期と制御周期は係数に影響します。
一般的に、制御周期とサンプリング周期を長くすると、制御がスムーズになります 制御周期とは、制御コードを実行する周期のことで、一般的には動作用の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 制御の本質を理解します。