マイコンでのPI制御の実装

PI制御をマイコンで実現するときの演算。

マイコンでPI制御するにはアナログ (連続量)からデジタル (離散量)への変換が必要です。

例えばスイッチング電源では、操作量をスイッチング時比率D、偏差eと置いたときのアナログのPI演算は以下の式で表されます。

{ \displaystyle D(t)=k_p\{e(t)+\frac{1}{T_i}\int_0^t e(τ) dτ\}}

{ \displaystyle k_p:比例ゲイン}

{ \displaystyle T_i:積分時定数}

上記の演算をマイコンで実行出来る形、つまりデジタル(離散量)に変換します。
まず任意時間tの関数のままではマイコンで扱えません。

とりあえずマイコンの制御周期をαとおいて、

次の制御タイミングt+αでのPI演算を考えます。

{ \displaystyle D(t+α)=k_p\{e(t+α)+\frac{1}{T_i}\int_0^{t+α} e(τ) dτ\} }

そして、今回時間t+αでの演算と前回時間tでのPI演算の差をとります。
ここで差を取るのはプログラムが書きやすいからです。後で分かります。

{ \displaystyle D(t+α)-D(t)=k_p\{e(t+α)-e(t)+\frac{1}{T_i}(\int_0^{t+α} e(τ) dτ-\int_0^{t} e(τ) dτ)\} }

{ \displaystyle D(t+α)-D(t)=k_p\{e(t+α)-e(t)+\frac{1}{T_i}\int_t^{t+α} e(τ) dτ\} }

次に積分項の処理について考えます。

偏差e(τ)ってどんな関数なんでしょうか?
どんなんでもいいです。
偏差e(τ)の変化に対して、マイコンのサンプリング周期が十分短い場合、
時間tと時間t+αの間の偏差e(τ)は直線とみなせます。

f:id:penguinwalk1986:20150902231528p:plain

つまり積分

{ \displaystyle \int_t^{t+α} e(τ) dτ = \frac{1}{2}αe(t+α)+\frac{1}{2}αe(t) }

となります。これを上の式に代入すると

{ \displaystyle D(t+α)-D(t)=k_p\{e(t+α)-e(t)+\frac{1}{T_i}(\frac{1}{2}αe(t+α)+\frac{1}{2}αe(t))\} }

整理すると

{ \displaystyle D(t+α)=D(t)+k_p\{e(t+α)-e(t)\}+k_p\frac{α}{2T_i}\{e(t+α)+e(t)\} }

これで、今回の値と前回の値だけで表されるPI演算式が出来ました。

今回をn回目、前回を(n-1)回目とすると

{ \displaystyle D(n)=D(n-1)+k_p\{e(n)-e(n-1)\}+k_p\frac{α}{2T_i}\{e(n)+e(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とか駄目な。