資源簡介
模糊PID調節,自己已測試,調試效果比經典PID要好。

代碼片段和文件信息
#include?“fuzzypid.h“
PID_STRUCT?PID_Data;
static?float?E_TABLE[]={-3-2-10123};
static?float?EC_TABLE[]={-3-2-10123};
static?float?KpTABLE[]={0.00.30.61.2};
static?float?KiTABLE[]={0.20.40.60.9};
static?float?KdTABLE[]={0.000.010.020.03};
static?char?KpRULE[7][7]=
{
3333333
2222122
1111111
1101011
0010010
0101002
3333333
};
static?char?KiRULE[7][7]=
{
0000000
0000000
0000000
0000000
0000000
2000001
3333333
};
static?char?KdRULE[7][7]=
{
3332222
2221111
1121121
1101011
1100011
2210111
3333232
};
static?float?fuzzy_kp(float?efloat?ec)
{
char?numpepec;
float?eFuzzy[2]={00};
float?ecFuzzy[2]={00};
float?KpFuzzy[4]={0};
float?Kp;
//誤差隸屬函數
if(e {
eFuzzy[0]=1.0;
pe=0;
}
else?if(e>=E_TABLE[0]&&e {
eFuzzy[0]=(E_TABLE[1]-e)/(E_TABLE[1]-E_TABLE[0]);
pe=0;
}
else?if(e>=E_TABLE[1]&&e {
eFuzzy[0]=(E_TABLE[2]-e)/(E_TABLE[2]-E_TABLE[1]);
pe=1;
}
else?if(e>=E_TABLE[2]&&e {
eFuzzy[0]=(E_TABLE[3]-e)/(E_TABLE[3]-E_TABLE[2]);
pe=2;
}
else?if(e>=E_TABLE[3]&&e {
eFuzzy[0]=(E_TABLE[4]-e)/(E_TABLE[4]-E_TABLE[3]);
pe=3;
}
else?if(e>=E_TABLE[4]&&e {
eFuzzy[0]=(E_TABLE[5]-e)/(E_TABLE[5]-E_TABLE[4]);
pe=4;
}
else?if(e>=E_TABLE[5]&&e {
eFuzzy[0]=(E_TABLE[6]-e)/(E_TABLE[6]-E_TABLE[5]);
pe=5;
}
else
{
??eFuzzy[0]=0;
pe=6;
}
eFuzzy[1]=1-eFuzzy[0];
//誤差變化率隸屬函數
if(e {
ecFuzzy[0]=1.0;
pec=0;
}
else?if(ec>=EC_TABLE[0]&&ec {
ecFuzzy[0]=(EC_TABLE[1]-ec)/(EC_TABLE[1]-EC_TABLE[0]);
pec=0;
}
else?if(ec>=EC_TABLE[1]&&ec {
ecFuzzy[0]=(EC_TABLE[2]-e)/(EC_TABLE[2]-EC_TABLE[1]);
pec=1;
}
else?if(ec>=EC_TABLE[2]&&ec {
ecFuzzy[0]=(EC_TABLE[3]-e)/(EC_TABLE[3]-EC_TABLE[2]);
pec=2;
}
else?if(ec>=EC_TABLE[3]&&ec {
ecFuzzy[0]=(EC_TABLE[4]-e)/(EC_TABLE[4]-EC_TABLE[3]);
pec=3;
}
else?if(ec>=EC_TABLE[4]&&ec {
ecFuzzy[0]=(EC_TABLE[5]-e)/(EC_TABLE[5]-EC_TABLE[4]);
pec=4;
}
else?if(ec>=EC_TABLE[5]&&ec {
ecFuzzy[0]=(EC_TABLE[6]-e)/(EC_TABLE[6]-EC_TABLE[5]);
pec=5;
}
else
{
??ecFuzzy[0]=0;
pec=6;
}
ecFuzzy[1]=1-ecFuzzy[0];
//查詢模糊表
num=KpRULE[pe][pec];
KpFuzzy[num]+=eFuzzy[0]*ecFuzzy[0];
num=KpRULE[pe][pec+1];
KpFuzzy[num]+=eFuzzy[0]*ecFuzzy[1];
num=KpRULE[pe+1][pec];
KpFuzzy[num]+=eFuzzy[1]*ecFuzzy[0];
num=KpRULE[pe+1][pec+1];
KpFuzzy[num]+=eFuzzy[1]*ecFuzzy[1];
Kp=KpFuzzy[0]*KpTABLE[0]+KpFuzzy[1]*KpTABLE[1]+KpFuzzy[2]*KpTABLE[2]+KpFuzzy[3]*KpTABLE[3];
return?Kp;
}
float?fuzzy_ki(float?efloat?ec)
{
char?numpepec;
float?eFuzzy[2]={0
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????7834??2016-12-27?19:15??FUZZPID\fuzzypid.c
?????文件????????239??2016-12-27?19:15??FUZZPID\fuzzypid.h
?????目錄??????????0??2017-01-03?13:58??FUZZPID
-----------?---------??----------?-----??----
?????????????????8073????????????????????3
- 上一篇:梯形加減速速度規劃
- 下一篇:delphi編寫的數據庫連接測試
評論
共有 條評論