資源簡介
基于C++ 的模糊PID控制代碼,參考許多論文制定的PID參數調整模糊規則,代碼對于想了解這方面的人有一定的借鑒意義。但是不保證什么控制對象都能用,具體對象具體設計。

代碼片段和文件信息
#include“fuzzy_PID.h“
FuzzyPID::FuzzyPID(float?e_maxfloat?de_maxfloat?kp_maxfloat?ki_maxfloat?kd_maxfloat?Kp0float?Ki0float?Kd0):
target(0)actual(0)emax(e_max)demax(de_max)delta_Kp_max(kp_max)delta_Ki_max(ki_max)delta_Kd_max(kd_max)e_mf_paras(NULL)de_mf_paras(NULL)
Kp_mf_paras(NULL)Ki_mf_paras(NULL)Kd_mf_paras(NULL)
{
???e=target-actual;
???e_pre_1=0;
???e_pre_2=0;
???de=e-e_pre_1;
???Ke=(N/2)/emax;
???Kde=(N/2)/demax;
???Ku_p=delta_Kp_max/(N/2);
???Ku_i=delta_Ki_max/(N/2);
???Ku_d=delta_Kd_max/(N/2);
???mf_t_e=“No?type“;
???mf_t_de=“No?type“;
???mf_t_Kp=“No?type“;
???mf_t_Ki=“No?type“;
???mf_t_Kd=“No?type“;
???Kp=Kp0;
???Ki=Ki0;
???Kd=Kd0;
???A=Kp+Ki+Kd;
???B=-2*Kd-Kp;
???C=Kd;
}
FuzzyPID::FuzzyPID(float?*fuzzyLimitfloat?*pidInitVal)
{
target=0;
actual=0;
e=0;
e_pre_1=0;
????e_pre_2=0;
????de=e-e_pre_1;
emax=fuzzyLimit[0];
demax=fuzzyLimit[1];
delta_Kp_max=fuzzyLimit[2];
delta_Ki_max=fuzzyLimit[3];
delta_Kd_max=fuzzyLimit[4];
Ke=(N/2)/emax;
????Kde=(N/2)/demax;
????Ku_p=delta_Kp_max/(N/2);
????Ku_i=delta_Ki_max/(N/2);
????Ku_d=delta_Kd_max/(N/2);
????mf_t_e=“No?type“;
????mf_t_de=“No?type“;
????mf_t_Kp=“No?type“;
????mf_t_Ki=“No?type“;
????mf_t_Kd=“No?type“;
e_mf_paras=NULL;
de_mf_paras=NULL;
Kp_mf_paras=NULL;
Ki_mf_paras=NULL;
Kd_mf_paras=NULL;
????Kp=pidInitVal[0];
????Ki=pidInitVal[1];
????Kd=pidInitVal[2];
????A=Kp+Ki+Kd;
????B=-2*Kd-Kp;
????C=Kd;
}
FuzzyPID::~FuzzyPID()
{
??delete?[]?e_mf_paras;
??delete?[]?de_mf_paras;
??delete?[]?Kp_mf_paras;
??delete?[]?Ki_mf_paras;
??delete?[]?Kd_mf_paras;
}
//三角隸屬度函數
float?FuzzyPID::trimf(float?xfloat?afloat?bfloat?c)
{
???float?u;
???if(x>=a&&x<=b)
???u=(x-a)/(b-a);
???else?if(x>b&&x<=c)
???u=(c-x)/(c-b);
???else
???u=0.0;
???return?u;
}
//正態隸屬度函數
float?FuzzyPID::gaussmf(float?xfloat?avefloat?sigma)?
{
float?u;
if(sigma<0)
{
???cout<<“In?gaussmf?sigma?must?larger?than?0“< }
u=exp(-pow(((x-ave)/sigma)2));
return?u;
}
//梯形隸屬度函數
float?FuzzyPID::trapmf(float?xfloat?afloat?bfloat?cfloat?d)
{
????float?u;
if(x>=a&&x u=(x-a)/(b-a);
else?if(x>=b&&x ????????u=1;
else?if(x>=c&&x<=d)
u=(d-x)/(d-c);
else
u=0;
return?u;
}
//設置模糊規則Matrix
void?FuzzyPID::setRuleMatrix(int?kp_m[N][N]int?ki_m[N][N]int?kd_m[N][N])
{
for(int?i=0;i ???for(int?j=0;j ???{
???Kp_rule_matrix[i][j]=kp_m[i][j];
???Ki_rule_matrix[i][j]=ki_m[i][j];
???Kd_rule_matrix[i][j]=kd_m[i][j];
???}
}
//設置模糊隸屬度函數的子函數
void?FuzzyPID::setMf_sub(const?string?&?typefloat?*parasint?n)
{
int?N_mf_eN_mf_deN_mf_KpN_mf_KiN_mf_Kd;
??switch(n)
??{
??case?0:
??if(type==“trimf“||type==“gaussmf“||type==“trapmf“)
????mf_t_e=type;
??else
cout<<“Type?of?membership?function?must?be?\“trimf\“?or?\“gaussmf\“?or?\“trapmf\““< ??????if(mf_t_e==“trimf“)
????????N_mf_e=3;
??else?if(mf_t_e==“gaussmf“)
N_mf_e=2;
??els
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件??????10863??2017-06-27?21:26??Fuzzy_PID\fuzzy_PID.cpp
?????文件???????2651??2017-06-27?16:29??Fuzzy_PID\fuzzy_PID.h
?????文件???????2120??2017-06-30?10:49??Fuzzy_PID\main.cpp
?????目錄??????????0??2018-05-24?09:22??Fuzzy_PID
-----------?---------??----------?-----??----
????????????????15634????????????????????4
評論
共有 條評論