我們在用C-Block進行數字電源編程的時候,最常用到的是PI控制算法,如下一個常見的電壓外環PI代碼:
/**********************************************************************************/
//INV電壓環參數定義
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電流環參數
Inv_U_Error_1 = Inv_U_Error_0; //偏差計算(比例)
Inv_U_Error_0 =U_bus_avg-U_bus_set; //偏差計算(積分)
Inv_U_PID+= Inv_U_K1 * Inv_U_Error_0 - Inv_U_K2 * Inv_U_Error_1 ;
//PID計算式,更改系數以獲得理想的輸出
if( Inv_U_PID<-40) //限制電壓環輸出
Inv_U_PID=-40;
if( Inv_U_PID>40)
Inv_U_PID=40;
/**********************************************************************************/
PI算法的格式都是一樣的,中間會涉及多個中間變量,如果我們的系統比較復雜,涉及多個PI環路,那這樣我們的變量定義PI算法就會非常冗余,代碼的可移植性就比較差;
比如下面這個三相四橋臂正負序閉環控制系統:
正序QD軸外環電壓內環電流環和負序QD軸外環電壓內環電流環,總共有8個PI控制環路,如果直接定義變量,以及各個環路的PI代碼,這樣代碼量就非常大,而且相當冗余;
怎樣才能將代碼簡潔化,以及可移植性:我們可以用C語言的結構體去定義PI中間參數變量;以及把PI控制算法寫成一個函數,單要調用PI算法時,就通過結構體變量調用PI算法函數,這樣就可以避免同樣結構的代碼結構重復性編寫;
/----------------------------------------------------------------------------------/
比如我們要用到電壓外環,電流內環控制架構的時候;我們只需要定義下面結構體變量:
/---------------------------------結構體變量定義--------------------------------------------/
static stNamePID InvVoltPid={0}; //電壓環PI結構體
double VpidCalTemp=0;
static stNamePID InvCurrPid={0}; //電流環PI結構體
double pidCalTemp=0;
/----------------------------------------------------------------------------------/
//**************電壓外環*************//
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);
//**************電流內環**************//
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);
總結:在編程中學會一些小技巧,我們的代碼編程就更加簡潔,增強軟件可移植性和可讀性;