资源简介
基于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
相关资源
- 单片机PID控制(C语言)
- Proteus仿真:PID算法输出.rar
- 一个模糊PID温度控制算法源代码
- pid控制电机
- PID算法.c
- C语言模糊控制程序
- SpiderMonkey1.61.7 编译文件全部libdllh文件
- 两输入单输出模糊控制c语言程序
- 先进PID控制MATLAB仿真
- 模糊PID硕士期刊论文及源码.zip
- 先进pid控制及其matlab仿真64898
- 网络爬虫 C++ Crawler Spider
- 获取U盘VIDPID盘符物理序列号源码可运
- PID调节电机转速 配合MPU6050
- 积分分离型PID控制 匿名四轴波形输出
- PID参数整定一本通
- rapid Scada组态软件
- PID学习资料 各种PID解释和应用
- 自适应PID,C语言源码
- DSP的PID控制程序
- SuperPid修改进程PID工具驱动级.别名.
- C语言实现PID控制直流电机调速含pro
- NCDDE服务连接DDE封装的APIddehelper
- 数字PID控制器 Proteus软件仿真
- 模糊PID控制C语言程序.doc
- Project1.rar
- 模糊PID的C语言程序
- 控制方法的C语言实现
- VS2010版c++PID控制算法详尽注释
- PID算法Matlab仿真程序和C程序
评论
共有 条评论