我們在用C-Block進(jìn)行數(shù)字電源編程的時(shí)候,最常用到的是PI控制算法,如下一個(gè)常見的電壓外環(huán)PI代碼:
/**********************************************************************************/
//INV電壓環(huán)參數(shù)定義
double Inv_U_PID;
const double Inv_U_K1=0.205;
const double Inv_U_K2=0.2;
double Inv_U_Error_0=0;
double Inv_U_Error_1=0;
//INV電流環(huán)參數(shù)
Inv_U_Error_1 = Inv_U_Error_0; //偏差計(jì)算(比例)
Inv_U_Error_0 =U_bus_avg-U_bus_set; //偏差計(jì)算(積分)
Inv_U_PID+= Inv_U_K1 * Inv_U_Error_0 - Inv_U_K2 * Inv_U_Error_1 ;
//PID計(jì)算式,更改系數(shù)以獲得理想的輸出
if( Inv_U_PID<-40) //限制電壓環(huán)輸出
Inv_U_PID=-40;
if( Inv_U_PID>40)
Inv_U_PID=40;
/**********************************************************************************/
PI算法的格式都是一樣的,中間會涉及多個(gè)中間變量,如果我們的系統(tǒng)比較復(fù)雜,涉及多個(gè)PI環(huán)路,那這樣我們的變量定義PI算法就會非常冗余,代碼的可移植性就比較差;
比如下面這個(gè)三相四橋臂正負(fù)序閉環(huán)控制系統(tǒng):
正序QD軸外環(huán)電壓內(nèi)環(huán)電流環(huán)和負(fù)序QD軸外環(huán)電壓內(nèi)環(huán)電流環(huán),總共有8個(gè)PI控制環(huán)路,如果直接定義變量,以及各個(gè)環(huán)路的PI代碼,這樣代碼量就非常大,而且相當(dāng)冗余;
怎樣才能將代碼簡潔化,以及可移植性:我們可以用C語言的結(jié)構(gòu)體去定義PI中間參數(shù)變量;以及把PI控制算法寫成一個(gè)函數(shù),單要調(diào)用PI算法時(shí),就通過結(jié)構(gòu)體變量調(diào)用PI算法函數(shù),這樣就可以避免同樣結(jié)構(gòu)的代碼結(jié)構(gòu)重復(fù)性編寫;
/----------------------------------------------------------------------------------/
比如我們要用到電壓外環(huán),電流內(nèi)環(huán)控制架構(gòu)的時(shí)候;我們只需要定義下面結(jié)構(gòu)體變量:
/---------------------------------結(jié)構(gòu)體變量定義--------------------------------------------/
static stNamePID InvVoltPid={0}; //電壓環(huán)PI結(jié)構(gòu)體
double VpidCalTemp=0;
static stNamePID InvCurrPid={0}; //電流環(huán)PI結(jié)構(gòu)體
double pidCalTemp=0;
/----------------------------------------------------------------------------------/
//**************電壓外環(huán)*************//
Inv_V_ref=U_out_cmd*cos(angle);
pid_set_tag(&InvVoltPid,Inv_V_ref);
pid_set_Kp(&InvVoltPid, 0.02);
pid_set_Ki(&InvVoltPid, 0.01);
pid_set_OutputLimit(&InvVoltPid,Iout_max,-Iout_max);
VpidCalTemp=pi_calc(&InvVoltPid, U_out);
//**************電流內(nèi)環(huán)**************//
Inv_I_ref=VpidCalTemp ;
pid_set_tag(&InvCurrPid, Inv_I_ref);
pid_set_Kp(&InvCurrPid, 0.05);
pid_set_Ki(&InvCurrPid, 0.005);
pid_set_OutputLimit(&InvCurrPid,100,-100);
pidCalTemp=pi_calc(&InvCurrPid, I_out_avg);
總結(jié):在編程中學(xué)會一些小技巧,我們的代碼編程就更加簡潔,增強(qiáng)軟件可移植性和可讀性;