模糊PID的c语言算法.docx
- 文档编号:23319598
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:19
- 大小:19.65KB
模糊PID的c语言算法.docx
《模糊PID的c语言算法.docx》由会员分享,可在线阅读,更多相关《模糊PID的c语言算法.docx(19页珍藏版)》请在冰豆网上搜索。
模糊PID的c语言算法
#include
#include
#include"succus.h"
#include
#include
#include
#include
#include
#defineparameterPID0.1//PID常数
#definemaxcontroldata10//最大控制量
#defineparameterfuzzy12//模糊控制常数
#definePe14//隶属度范围
#definePe28
#definePsess12
#definePsess24
#defineparainput100//输入常数
staticintpanelHandle;
staticintL_PIDstart;//运行标签
staticintL_fuzzystart;
staticfloatP_control;//获得参数
staticfloatI_control;
staticfloatD_control;
staticintwhatmode;
staticfloatmodel_K;//模型参数
staticfloatmodel_T;
staticfloatmodel_t;
staticfloatcycle;//设定周期
staticfloatsavedata[3];//储存偏差量
staticfloatsavecontrol[20];//存储控制量
staticfloatresult[2];//存储仿真结果
staticfloatgetsum;
staticcharsenddata[22];//通信协议
staticcharrecievedata[18];
staticcharnak[6];
staticcharack[6];
intmain(intargc,char*argv[])
{
if(InitCVIRTE(0,argv,0)==0)
return-1;/*outofmemory*/
if((panelHandle=LoadPanel(0,"succus.uir",PANEL))<0)
return-1;
OpenComConfig(2,"",9600,0,8,1,512,512);//打开串口
senddata[0]=5;//构造协议
senddata[1]='0';
senddata[2]='A';
senddata[3]='F';
senddata[4]='F';
senddata[5]='W';
senddata[6]='W';
senddata[7]='0';
senddata[8]='D';
senddata[9]='5';
senddata[10]='0';
senddata[11]='6';
senddata[12]='4';
senddata[13]='0';
senddata[14]='1';
senddata[21]=0;
recievedata[0]=5;
recievedata[1]='0';
recievedata[2]='A';
recievedata[3]='F';
recievedata[4]='F';
recievedata[5]='W';
recievedata[6]='R';
recievedata[7]='0';
recievedata[8]='D';
recievedata[9]='5';
recievedata[10]='0';
recievedata[11]='0';
recievedata[12]='0';
recievedata[13]='0';
recievedata[14]='1';
recievedata[15]='4';
recievedata[16]='0';
recievedata[17]=0;
nak[0]=21;
nak[1]='0';
nak[2]='A';
nak[3]='F';
nak[4]='F';
nak[5]=0;
ack[0]=6;
ack[1]='0';
ack[2]='A';
ack[3]='F';
ack[4]='F';
ack[5]=0;
FlushInQ
(2);
FlushOutQ
(2);
DisplayPanel(panelHandle);
RunUserInterface();
CloseCom
(2);
DiscardPanel(panelHandle);
return0;
}
intCVICALLBACKautosetPIDCallback(intpanel,intcontrol,intevent,
void*callbackData,inteventData1,inteventData2)
{
switch(event)
{
caseEVENT_COMMIT:
SetCtrlVal(panelHandle,PANEL_PARAMETER_P,20.0);
SetCtrlVal(panelHandle,PANEL_PARAMETER_I,0.0);
SetCtrlVal(panelHandle,PANEL_PARAMETER_D,0.0);
break;
}
return0;
}
intCVICALLBACKfuzzycontrolCallback(intpanel,intcontrol,intevent,
void*callbackData,inteventData1,inteventData2)
{
switch(event)
{
caseEVENT_COMMIT:
L_fuzzystart=1;
GetCtrlVal(panelHandle,PANEL_WORKMODE,&whatmode);//获得工作状态
if(whatmode==0)
{
GetCtrlVal(panelHandle,PANEL_EMLUATOR_K,&model_K);//模型
GetCtrlVal(panelHandle,PANEL_EMLUATOR_T,&model_T);
GetCtrlVal(panelHandle,PANEL_EMLUATOR_t,&model_t);
}
GetCtrlVal(panelHandle,PANEL_SAMPLINGTIME,&cycle);
SetCtrlAttribute(panelHandle,PANEL_TIMER,ATTR_INTERVAL,cycle);
SetCtrlAttribute(panelHandle,PANEL_TIMER,ATTR_ENABLED,1);//获得抽样时间。
并开始运行
ClearStripChart(panelHandle,PANEL_STRIPCHART);//版面清空
SetCtrlAttribute(panelHandle,PANEL_FUZZYCONTROL,ATTR_DIMMED,1);//按键关闭
SetCtrlAttribute(panelHandle,PANEL_STARTPID,ATTR_DIMMED,1);
SetCtrlAttribute(panelHandle,PANEL_AUTOSETPID,ATTR_DIMMED,1);
break;
}
return0;
}
intCVICALLBACKendopjCallback(intpanel,intcontrol,intevent,
void*callbackData,inteventData1,inteventData2)
{
switch(event)
{
caseEVENT_COMMIT:
QuitUserInterface(0);
break;
}
return0;
}
intCVICALLBACKstopCallback(intpanel,intcontrol,intevent,
void*callbackData,inteventData1,inteventData2)
{
inti;
switch(event)
{
caseEVENT_COMMIT:
SetCtrlAttribute(panelHandle,PANEL_TIMER,ATTR_ENABLED,0);//关闭Timer
L_PIDstart=0;//清标签
L_fuzzystart=0;
SetCtrlAttribute(panelHandle,PANEL_FUZZYCONTROL,ATTR_DIMMED,0);//按键开启
SetCtrlAttribute(panelHandle,PANEL_STARTPID,ATTR_DIMMED,0);
SetCtrlAttribute(panelHandle,PANEL_AUTOSETPID,ATTR_DIMMED,0);
//数据清空
for(i=0;i<3;i++)
savedata[i]=0;
for(i=0;i<20;i++)
savecontrol[i]=0;
for(i=0;i<2;i++)
result[i]=0;
getsum=0;
break;
}
return0;
}
intCVICALLBACKTimerCallback(intpanel,intcontrol,intevent,
void*callbackData,inteventData1,inteventData2)
{
floatgivedata;//目标量
inti,j;//循环量
intnum;//滞后数
floatdraw[3];//画点
floatgetoutput;//输出量
floatADdata;
intsetsenddata;//输出控制量
intefficacy;//和效验
intstrLen;//发送数据长度
charresponsion[5];
chargetADdata[10];
floatess[5];//记录隶属度
floatdess[5];
floatoutcontrol[4];
floatmakematrix[5][5];
switch(event)
{
caseEVENT_TIMER_TICK:
GetCtrlVal(panelHandle,PANEL_SETGIVE,&givedata);
if(whatmode==0)
getoutput=result[1];
else
{
FlushInQ
(2);
ComWrt(2,recievedata,strlen(recievedata));
strLen=10;
ComRd(2,getADdata,strLen);
for(i=5;i<9;i++)
if(getADdata[i]>='0'&&getADdata[i]<='9')
getADdata[i]=getADdata[i]-'0';
else
getADdata[i]=getADdata[i]-'A'+10;
ADdata=(float)(getADdata[5]*4096+getADdata[6]*256+getADdata[7]*16+getADdata[8]);
getoutput=((ADdata-678)/2722.0)*parainput;
if(getoutput<0)//6783400
getoutput=0;
FlushInQ
(2);
ComWrt(2,ack,strlen(ack));
}
if(L_PIDstart==1)
{
savedata[0]=savedata[1];//控制算法实现
savedata[1]=savedata[2];
savedata[2]=givedata-getoutput;
if(savedata[2]<10&&savedata[2]>-10)
getsum=getsum+savedata[2];
for(i=0;i<19;i++)
savecontrol[i]=savecontrol[i+1];
savecontrol[19]=P_control*savedata[2]+D_control*(savedata[2]-savedata[1])+I_control*getsum;
savecontrol[19]=savecontrol[19]*parameterPID;//使用位置试PID
//savecontrol[19]=savecontrol[19]+savecontrol[18];
if(savecontrol[19]<0)
savecontrol[19]=0;//控制信号最少为零
if(savecontrol[19]>maxcontroldata)
savecontrol[19]=maxcontroldata;//控制信号饱和
SetCtrlVal(panelHandle,PANEL_DISPLAY_CONTROL,(savecontrol[19]*10));
}
elseif(L_fuzzystart==1)
{
for(i=0;i<5;i++)
ess[i]=0;
for(i=0;i<5;i++)
dess[i]=0;
for(i=0;i<4;i++)
outcontrol[i]=0;
savedata[1]=savedata[2];//记录偏差;savedata[0]为偏差变化
savedata[2]=givedata-getoutput;
savedata[0]=savedata[2]-savedata[1];
if(savedata[2]<-Pe2)//开始计算隶属度
ess[0]=1;
elseif(savedata[2]>=-Pe2&&savedata[2]<-Pe1)
{
ess[0]=(savedata[2]+Pe2)/(Pe2-Pe1);
ess[1]=(Pe1-savedata[2])/(Pe2-Pe1);
}
elseif(savedata[2]>=-Pe1&&savedata[2]<0)
{
ess[1]=(savedata[2]+Pe1)/(Pe2-Pe1);
ess[2]=(-savedata[2])/(Pe2-Pe1);
}
elseif(savedata[2]>=0&&savedata[2] { ess[2]=savedata[2]/(Pe2-Pe1); ess[3]=(Pe1-savedata[2])/(Pe2-Pe1); } elseif(savedata[2]>=Pe1&&savedata[2] { ess[3]=(savedata[2]-Pe1)/(Pe2-Pe1); ess[4]=(Pe2-savedata[2])/(Pe2-Pe1); } elseif(savedata[2]>=Pe2) { ess[4]=1; } else; if(savedata[0]<-Psess2)//开始计算偏差变化的隶属度 dess[0]=1; elseif(savedata[0]>=-Psess2&&savedata[0]<-Psess1) { dess[0]=(savedata[0]+Psess2)/(Psess2-Psess1); dess[1]=(Psess1-savedata[0])/(Psess2-Psess1); } elseif(savedata[0]>=-Psess1&&savedata[0]<0) { dess[1]=(savedata[0]+Psess1)/(Psess2-Psess1); dess[2]=(-savedata[0])/(Psess2-Psess1); } elseif(savedata[0]>=0&&savedata[0] { dess[2]=savedata[0]/(Psess2-Psess1); dess[3]=(Psess1-savedata[0])/(Psess2-Psess1); } elseif(savedata[0]>=Psess1&&savedata[0] { dess[3]=(savedata[0]-Psess1)/(Psess2-Psess1); dess[4]=(Psess2-savedata[0])/(Psess2-Psess1); } elseif(savedata[0]>=Psess2) { dess[4]=1; } else; for(i=0;i<5;i++) for(j=0;j<5;j++) makematrix[i][j]=ess[i]>dess[j]? dess[j]: ess[i]; if(makematrix[4][4]>0) { outcontrol[3]=makematrix[4][4]; } if(makematrix[4][2]>0||makematrix[4][3]>0) { outcontrol[2]=makematrix[4][2]>makematrix[4][3]? makematrix[4][2]: makematrix[4][3]; } if(makematrix[2][4]>0||makematrix[4][1]>0||makematrix[3][2]>0||makematrix[3][3]>0|| makematrix[3][4]) { outcontrol[1]=makematrix[2][4]>makematrix[4][1]? makematrix[2][4]: makematrix[4][1]; outcontrol[1]=makematrix[3][2]>outcontrol[1]? makematrix[3][2]: outcontrol[1]; outcontrol[1]=makematrix[3][3]>outcontrol[1]? makematrix[3][3]: outcontrol[1]; outcontrol[1]=makematrix[3][4]>outcontrol[1]? makematrix[3][4]: outcontrol[1]; } if(makematrix[1][4]>0||makematrix[1][3]>0||makematrix[2][3]>0||makematrix[2][2]>0|| makematrix[2][1]>0||makematrix[3][1]>0||makematrix[3][0]>0||makematrix[4][0]>0) { outcontrol[0]=makematrix[1][4]>makematrix[1][3]? makematrix[1][4]: makematrix[1][3]; outcontrol[0]=makematrix[2][3]>outcontrol[0]? makematrix[2][3]: outcontrol[0]; outcontrol[0]=makematrix[2
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 模糊 PID 语言 算法