资源简介
一个模糊PID温度控制算法源代码 (亲测可用)
代码片段和文件信息
#include
#include
#include
#include “pid_fuzzy.h“
//注1:自适应模糊pid最重要的就是论域的选择,要和你应该控制的对象相切合
//注2:以下各阀值、限幅值、输出值均需要根据具体的使用情况进行更改
//注3:因为我的控制对象惯性比较大,所以以下各部分取值较小
//论域e:[-55] ec:[-0.50.5]
//误差的阀值,小于这个数值的时候,不做PID调整,避免误差较小时频繁调节引起震荡
#define Emin 0.0
#define Emid 0.08
#define Emax 0.6
//调整值限幅,防止积分饱和
#define Umax 5
#define Umin -5
//输出值限幅
#define Pmax 7200
#define Pmin 0
#define NB 0
#define NM 1
#define NS 2
#define ZO 3
#define PS 4
#define PM 5
#define PB 6
int kp[7][7]= { {PBPBPMPMPSZOZO}
{PBPBPMPSPSZOZO}
{PMPMPMPSZONSNS}
{PMPMPSZONSNMNM}
{PSPSZONSNSNMNM}
{PSZONSNMNMNMNB}
{ZOZONMNMNMNBNB}
};
int kd[7][7]= { {PSNSNBNBNBNMPS}
{PSNSNBNMNMNSZO}
{ZONSNMNMNSNSZO}
{ZONSNSNSNSNSZO}
{ZOZOZOZOZOZOZO}
{PBNSPSPSPSPSPB}
{PBPMPMPMPSPSPB}
};
int ki[7][7]= { {NBNBNMNMNSZOZO}
{NBNBNMNSNSZOZO}
{NBNMNSNSZOPSPS}
{NMNMNSZOPSPMPM}
{NMNSZOPSPSPMPB}
{ZOZOPSPSPMPBPB}
{ZOZOPSPMPMPBPB}
};
/**************求隶属度(三角形)***************/
float FTri(float xfloat afloat bfloat c)//FuzzyTriangle
{
if(x<=a)
return 0;
else if((a return (x-a)/(b-a);
else if((b return (c-x)/(c-b);
else if(x>c)
return 0;
else
return 0;
}
/*****************求隶属度(梯形左)*******************/
float FTraL(float xfloat afloat b)//FuzzyTrapezoidLeft
{
if(x<=a)
return 1;
else if((a return (b-x)/(b-a);
else if(x>b)
return 0;
else
return 0;
}
/*****************求隶属度(梯形右)*******************/
float FTraR(float xfloat afloat b)//FuzzyTrapezoidRight
{
if(x<=a)
return 0;
if((a return (x-a)/(b-a);
if(x>=b)
return 1;
else
return 1;
}
/****************三角形反模糊化处理**********************/
float uFTri(float xfloat afloat bfloat c)
{
float yz;
z=(b-a)*x+a;
y=c-(c-b)*x;
return (y+z)/2;
}
/*******************梯形(左)反模糊化***********************/
float uFTraL(float xfloat afloat b)
{
return b-(b-a)*x;
}
/*******************梯形(右)反模糊化***********************/
float uFTraR(float xfloat afloat b)
{
return (b-a)*x +a;
}
/**************************求交集****************************/
float fand(float afloat b)
{
return (a}
/**************************求并集****************************/
float forr(float afloat b)
{
return (a}
float ec;
/*========== PID计算部分 ======================*/
int PID_realize(PID *structpiduint16_t suint16_t in)
{
float pwm_var;//pwm调整量
float iError;//当前误差
float setinput;
//计算隶属度表
float es[7]ecs[7]e;
float form[7][7];
int i=0j=0;
int MaxX=0MaxY=0;
相关资源
- 基于51单片机的温度控制系统最终版
- 人工智能算法
- 一种基于SVD水印算法
- USACO题集及答案
- 斯坦福大学的raft算法ppt详解
- 2014海康威视视音频算法工程师笔试
- aps计划三步算法详细流程图.
- kmp算法ppt
- 嵌入混沌的蚁群优化算法
- 纯JS象棋 AI算法
- 分治法实现最接近点对问题的三维推
- Dijkstra算法求任意两个城市之间最短路
- ARM基于LPC2124的温度控制系统Proteus仿真
- 实验报告三
- 变分模态分解算法VMD
- s7 200plc程序-pid
- 基于BP神经网络PID整定原理和算法步骤
- LDPC编码译码算法
- 组态王pid.tar
- icm---条件迭代算法
- RS编码和纠错算法 有原理及应用
- DTW算法C源码语音识别算法
- sha256算法实现代码
- GA change PID
- pesq算法源代码c源代码
- 数值计算方法与算法试题及答案
- Usb设备插拔检测 通过检测Usb设备PID和
- 卡尔曼SOC算法源代码
- 图象压缩JPEG编码算法及压缩过程的实
- 蚁狮算法寻优
评论
共有 条评论