日韩在线不卡免费视频一区,日韩欧美精品一区二区三区经典,日产精品码2码三码四码区,人妻无码一区二区三区免费,日本feerbbwdh少妇丰满

  • 回復(fù)
  • 收藏
  • 點(diǎn)贊
  • 分享
  • 發(fā)新帖

(PSIM仿真)教你C-Block模塊巧用結(jié)構(gòu)體變量

我們在用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ù)性編寫;

//------------------->PID.H<---------------------//
typedef struct       //定義PI變量結(jié)構(gòu)體
{
double   Tag;
double   Current;
double   Error_0;
double   Error_1;
double   Kp;
double   Ki;
double   Output;
double   OutputMaxLimit;
double   OutputMinLimit;
}   stNamePID;
void pid_set_tag(stNamePID* pPid, double Tag)
{
pPid->Tag=Tag;
}
void pid_set_Kp(stNamePID* pPid, double Kp)
{
pPid->Kp=Kp;
}
void pid_set_Ki(stNamePID* pPid, double Ki)
{
pPid->Ki=Ki;
}
void pid_set_OutputLimit(stNamePID* pPid, double   OutputMaxLimit, double   OutputMinLimit)
{
pPid->OutputMaxLimit =OutputMaxLimit;
pPid->OutputMinLimit  =OutputMinLimit;
}
double pi_calc(stNamePID* pPid, double Current)
{
pPid->Current=Current;
pPid->Error_1=pPid->Error_0;
pPid->Error_0=pPid->Tag-pPid->Current;
pPid->Output+=(pPid->Kp+ pPid->Ki)*pPid->Error_0 - pPid->Kp*pPid->Error_1;
if((pPid->Output)>(pPid->OutputMaxLimit))
  pPid->Output = pPid->OutputMaxLimit;
if((pPid->Output)<(pPid->OutputMinLimit))
 pPid->Output = pPid->OutputMinLimit;
return   pPid->Output;
}

/----------------------------------------------------------------------------------/

比如我們要用到電壓外環(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)軟件可移植性和可讀性;

全部回復(fù)(6)
正序查看
倒序查看
yujunice
LV.5
2
2021-09-16 22:49

很不錯(cuò)的PI控制算法資料,收藏學(xué)習(xí)了!

0
回復(fù)
iszjt
LV.5
3
2021-09-27 11:08

C block編程就是通過ACR的輸出信號來控制四個(gè)開關(guān)管導(dǎo)通關(guān)斷。 要實(shí)現(xiàn)四象限運(yùn)行.

0
回復(fù)
ruohan
LV.9
4
2021-11-08 11:16
@iszjt
Cblock編程就是通過ACR的輸出信號來控制四個(gè)開關(guān)管導(dǎo)通關(guān)斷。要實(shí)現(xiàn)四象限運(yùn)行.

pPid->Output+=(pPid->Kp+ pPid->Ki)*pPid->Error_0 - pPid->Kp*pPid->Error_1;

這個(gè)PI調(diào)節(jié)是(Kp+Ki)*Error0  -  Kp*Error1嗎

0
回復(fù)
ruohan
LV.9
5
2021-11-08 11:40

電流環(huán)里面Inv_I_ref=VpidCalTemp ;     ,怎么把PID的量付給電流設(shè)定值啊,

后邊pidCalTemp=pi_calc(&InvCurrPid, I_out_avg);

這樣可以嗎,

0
回復(fù)
Richie_Li
LV.3
6
2021-11-09 08:29
@ruohan
電流環(huán)里面Inv_I_ref=VpidCalTemp;   ,怎么把PID的量付給電流設(shè)定值啊,后邊pidCalTemp=pi_calc(&InvCurrPid,I_out_avg);這樣可以嗎,

里面有個(gè) pid_set_tag()函數(shù),用來給定設(shè)定值的

0
回復(fù)
Richie_Li
LV.3
7
2021-11-09 08:29
@ruohan
pPid->Output+=(pPid->Kp+pPid->Ki)*pPid->Error_0-pPid->Kp*pPid->Error_1;這個(gè)PI調(diào)節(jié)是(Kp+Ki)*Error0 - Kp*Error1嗎

正確來說是這樣的:

pPid->Output=pPid->Output+(pPid->Kp+ pPid->Ki)*pPid->Error_0 - pPid->Kp*pPid->Error_1;

0
回復(fù)
發(fā)