在STM32上实现FuzzyPID(代码详解与实现)–以温控为例
资源下载:https://download.csdn.net/download/weixin_39092315/19524894(已更新带.h)
1.前言
模糊PID已经在实际生活当中有应用了,至于它是否真的比传统PID要好,各位就自行判断。本文基于博主做的项目中的经验总结而成,借助代码一步步推理至实现。有不错的控温效果,精度很高,但耗时挺长。
2.实现步骤
2.1输入量的量化与模糊化
在温度控制中,能够得到的数据就是温差(Error)和温差变化率(iError),所以首先确定我们的输入有两个:Error、iError。模糊PID的特点就是模糊,我们将确切的输入进行量化,就是模糊的第一步。量化就是通过量化函数将输入映射到几个数字级别,一般都是相对于0对称的数字区间。具体投射到怎样的区间根据实际情况而定。
举个例子:温控器件工作温度是25c°,目标常控温度为20c°,那么输入数据的范围为:±5c°,又由于温控器件温度变化率最大为±0.3(变化率的大小需要实际测定,具体与每周期采样时间有关)。那么,我们需要设置量化函数的两个分母为:5与0.3,因此在温控过程中,温差逐渐减少,所以量化值Error/MaxE的值随着温差减少而减小,能够表征温控当前温度与目标温度的差距(方便减小P控制和增大I控制,细品)。
代码用的是±6.
//输入值的量化论域(-6->6)
static void LinearQuantization(FUZZYPID *vPID,float _Real_Value,float *qValue)
{
float thisError;
float deltaError;
thisError=vPID->setVaule-_Real_Value; //计算当前偏差
deltaError=thisError-vPID->lasterror; //计算偏差增量
//E和EC的量化
qValue[0]=6.0*thisError/(v