99久久全国免费观看_国产一区二区三区四区五区VM_久久www人成免费看片中文_国产高清在线a视频大全_深夜福利www_日韩一级成人av

  • 回復
  • 收藏
  • 點贊
  • 分享
  • 發新帖

(PSIM仿真)教你C-Block模塊巧用結構體變量

我們在用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算法函數,這樣就可以避免同樣結構的代碼結構重復性編寫;

//------------------->PID.H<---------------------//
typedef struct       //定義PI變量結構體
{
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;
}

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

比如我們要用到電壓外環,電流內環控制架構的時候;我們只需要定義下面結構體變量:

/---------------------------------結構體變量定義--------------------------------------------/

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);

總結:在編程中學會一些小技巧,我們的代碼編程就更加簡潔,增強軟件可移植性和可讀性;

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

很不錯的PI控制算法資料,收藏學習了!

0
回復
iszjt
LV.5
3
2021-09-27 11:08

C block編程就是通過ACR的輸出信號來控制四個開關管導通關斷。 要實現四象限運行.

0
回復
ruohan
LV.9
4
2021-11-08 11:16
@iszjt
Cblock編程就是通過ACR的輸出信號來控制四個開關管導通關斷。要實現四象限運行.

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

這個PI調節是(Kp+Ki)*Error0  -  Kp*Error1嗎

0
回復
ruohan
LV.9
5
2021-11-08 11:40

電流環里面Inv_I_ref=VpidCalTemp ;     ,怎么把PID的量付給電流設定值啊,

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

這樣可以嗎,

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

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

0
回復
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;這個PI調節是(Kp+Ki)*Error0 - Kp*Error1嗎

正確來說是這樣的:

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

0
回復
主站蜘蛛池模板: 99免费在线视频观看 | 亚洲色图综合区 | 国产人妻人伦精品1国产盗摄 | 91.xxx.高清在线 | 日本视频免费 | 亚洲天堂中文 | 痉挛高潮喷水av无码免费 | 国产麻豆一区二区三区在线观看 | 国产免费一区二区在线a片视频 | www.天天射.com | 久久国产精品成人免费网站 | 97色在线视频 | 国产精品免费网站 | 久久久久亚洲AV成人片无码 | 男男av纯肉无码免费播放无码 | 我是刑警34集全免费 | 911久久香蕉国产线看观看 | 日日嗨av一区二区三区四区 | 青青草华人在线 | av网页观看 | 97九色 | 插插插干干干 | 亚洲精品xx| 日本一二区在线观看 | 真实人与人性恔配视频 | 狠狠躁天天躁夜夜躁婷婷 | 国产成人一区二区在线观看 | 蜜臀亚洲AV无码精品国产午夜. | 亚洲一区二区在线视频观看 | 久久国产中文字幕 | 久久精品h | 蜜桃免费在线视频 | 国产熟睡乱子伦视频在线播放 | 亚洲综合图| 亚洲第一成网 | 91porny九色在线 | 密桃av| 黄视频福利 | 久国久产久精永久网页 | 久久8888 | 宅男66LU国产在线观看 |