マイコンでのPI制御の実装
PI制御をマイコンで実現するときの演算。
マイコンでPI制御するにはアナログ (連続量)からデジタル (離散量)への変換が必要です。
例えばスイッチング電源では、操作量をスイッチング時比率D、偏差eと置いたときのアナログのPI演算は以下の式で表されます。
上記の演算をマイコンで実行出来る形、つまりデジタル(離散量)に変換します。
まず任意時間tの関数のままではマイコンで扱えません。
とりあえずマイコンの制御周期をαとおいて、
次の制御タイミングt+αでのPI演算を考えます。
そして、今回時間t+αでの演算と前回時間tでのPI演算の差をとります。
ここで差を取るのはプログラムが書きやすいからです。後で分かります。
次に積分項の処理について考えます。
偏差e(τ)ってどんな関数なんでしょうか?
どんなんでもいいです。
偏差e(τ)の変化に対して、マイコンのサンプリング周期が十分短い場合、
時間tと時間t+αの間の偏差e(τ)は直線とみなせます。
つまり積分は
となります。これを上の式に代入すると
整理すると
これで、今回の値と前回の値だけで表されるPI演算式が出来ました。
今回をn回目、前回を(n-1)回目とすると
と書くことも出来ます。
最初に差をとった理由はこれです。
PI演算で積分項があっても、今回と前回の偏差、操作量だけを管理すればPI演算が実現できます。
int c1;//サンプリング周期カウンタ double e_n;//今回偏差 double e_b;//前回偏差 double D_n;//今回操作量 double D_b;//前回操作量 double k_p;//比例ゲイン double T_i;//積分時定数 double a;//サンプリング周期 double V_ref;//目標値 double V_n;//現在値 c1++;//サンプリング周期カウント if(c1>2000)//サンプリング周期になったら(ここでは仮に2000カウント { V_n=V_ad;//AD変換した値を現在値に代入 e_n=V_ref-V_n;//目標値と現在値の差から現在偏差を求める D_n=D_b+k_p*(e_n-e_b)+k_p*(e_n+e_b)*a/2/T_i;//PI演算 D_b=D_n;//今回PI演算値を前回演算値として保存 e_b=e_n;//今回偏差を前回偏差として保存 c1=0; }
上記を毎周期回すだけで、マイコンでのPI演算が実現出来ます。AD変換値の変換とかPWMの更新とかは割愛。
(*)注意
マイコンのサンプリング周期に対して、偏差の変化が早い場合は成立しないので気を付けましょう。偏差が20kHzくらいで動いてるのに、サンプリングが20kHzとか駄目な。