资源简介
一个模糊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;
相关资源
- FPGA实现PID.v
- DV泵加罗茨泵独立控制系统PID.smart
- SVR算法程序可运行
- 计算机图形学 边填充算法实现代码
- 模糊PID控制 c
- 福建师范大学历年算法考卷
- 栈的实现及应用,六种基本算法
- Bresenham算法绘制线段并利用“橡皮筋
- 介绍几种压缩算法及《笨笨数据压缩
- 改进的BP神经网络算法
- A星算法_原理讲解_例子
- 云模型的相关算法cloud
- 旋转矩阵求欧拉角的简单算法
- 栅栏填充算法源码(VC)
- RSA算法源码
- 关联分析Apriori算法实现
- [免费]relax算法成像
- 操作系统 LRU算法 实验报告 及 程序代
- 分治法快速排序算法QuickSort C
- 现代谱估计算法 music ESPRIT 谐波分解
- MUSIC算法c 实现
- 007出纳管理系统 v7[1].5.94 算法注册机
- 克鲁斯卡尔算法C和C 实现代码
- capon波束形成算法-VC实现
- QGA 量子遗传算法
- 利用OpenGL写毛笔字算法
- 带头结点的单链表的c算法实现
- 自适应隐写算法wow
- 单片机 DS18B20 温度控制系统
- 协同过滤算法源码
评论
共有 条评论