PID控制器开发笔记之十一:专家PID控制器的实现
前面我们讨论了经典的数字PID控制算法及其常见的改进与补偿算法,基本已经覆盖了无模型和简单模型PID控制经典算法的大部。再接下来的我们将讨论智能PID控制,智能PID控制不同于常规意义下的智能控制,是智能算法与PID控制算法的结合,是基于PID控制器的智能化优化。
在本章我们首先来探讨一下专家PID算法。正如前面所说,专家PID算法是专家系统与PID算法的结合与应用优化,所以我们接下来先简单了解专家控制。
1、专家控制的基本思想
专家控制是智能控制的一个分支,是专家系统的理论和技术同控制理论、方法与技术相结合,在无对象模型的情况下,模仿领域专家的经验来实现对被控对象的控制。
专家控制一般由知识库和推理机构构成主体框架,按照某种策略及时选用恰当的规则进行推理输出,实现控制。其基本结构如下:

有上图我们不难发现影响专家控制器控制精确性的主要是知识库表达的准确性以及推理机的正确性。知识库越完备、越准确那么对你被控对像的状态识别也就越准确。当然,推理机设计的差别也会对控制结果有影响。
专家控制器一般来说分为2中实现形式,被称之为直接型专家控制器和间接型专家控制器。所谓直接型专家控制器就是用专门设计的专家控制器直接对被控对象进行控制的方法。该控制器任务和功能都比较简单,一般都是实时在线运行,直接对被控对象进行控制。其结构图如下:

而所谓间接型专家控制器是指专家控制器作为其他控制器的辅助方式或者相互结合的控制方式来实现的一种控制器。专家系统通过高层决策来影响控制器输出,而这种高层决策可以是在线也可以是离线,器不会直接控制被控对象。其结构图如下:

所以我们所要讨论的专家PID算法应该是一种直接型专家控制器,因为专家系统决策与PID算法是结合在一起的,并没有独于PID算法的专家控制器,而是专家决策直接决定PID算法机器输出,这与直接型专家控制的定义是相符的。
2、专家PID的设计思路
专家PID控制就是基于被控对象和控制规律的各种知识,而不需要知道被控对象的精确模型,利用专家经验来设计PID参数。怎么来实现这一过程呢?我们来分析并推导这一算法。
我们假设当前为第k采样,当前偏差为e(k),同样前一采样时刻的偏差为e(k-1),而前两个采样时刻的偏差为e(k-1),则可以得到两次的偏差增量为:

清楚了以上公式,我们再设定偏差的一个极大值,记为Mmax;设定一个偏差较大的中间值,记为Mmid;设定一个偏差的极小值,记为Mmin。根据以上偏差、偏差增量以及偏差极值的设定,我们分析如下:
(1)如果|e(k)|>Mmax
这种情况说明偏差的绝对值已经很大了,不论偏差变化趋势如何,都应该考虑控制器的输入应按最大(或最小)输出,以达到迅速调整偏差的效果,使偏差绝对值以最大的速度减小。

这种情况下其实相当于实施开环控制,是一种对偏差出现极限情况的快速响应。
(2)如果|e(k)|≤Mmax
这种情况我们需要更具系统的变化趋势来分析,具体的情况实施不同的控制方式,我们引入偏差增量来协助分析。
(2.1)当e(k)*∆e(k)>0或者∆e(k)=0时
这种情况说明偏差在朝向偏差绝对值增大的方向变化,或者偏差为某一固定值,此时我们再判断偏差的绝对值与偏差的中间值Mmid之间的关系。
(2.1.1)此时如果|e(k)|>Mmid,说明偏差也较大,可考虑由控制器实施较强的控制作用,以达到扭转偏差绝对值向减小的方向变化,并迅速减小偏差的绝对值。

(2.1.2)此时如果|e(k)|≤Mmid,说明尽管偏差是向绝对值增大的方向变化,但是偏差绝对值本身并不是很大,可以考虑控制器实施一般的控制作用,只需要扭转偏差的变化趋势,使其向偏差绝对值减小的方向变化即可。

(2.2)当e(k)*∆e(k)<0且∆e(k)*∆e(k-1)>0或者e(k)=0时,说明偏差的绝对值向减小的方向变化,或者已经达到平衡状态,此时保持控制器输出不变即可。即:U(k)=U(k-1)。
(2.3)当e(k)*∆e(k)<0且∆e(k)*∆e(k-1)<0时,说明偏差处于极限状态。如果此时偏差的绝对值较大,|e(k)|>Mmid,可以考虑实施较强控制作用。

如果此时偏差绝对值较小,|e(k)|<Mmid,可以考虑实施较弱控制作用。

其中,k1为增益放大系数,k1取大于1的值;k2为增益抑制系数,取大于0而小于1的值。
(3)如果|e(k)|<Mmin
这种情况实际上说明偏差绝对值很小,这种偏差有可能是系统静差引起的,此时必须要引入积分作用,实施PID控制或者PI控制。

Kp和Ki可以适当减小,以减小控制作用。当偏差小到一定程度后,甚至可以引入死区的概念,是系统稳定下来而不需要去进行调节。
3、专家PID算法实现
前面我们了解了专家PID控制器的基本原理,并分析了一个较为常见的专家PID的控制规则。分析规则的过程其实也是一个推理的基本过程,所以我们得到了基本的规则库同时也有相应的推理机,接下来我们就来实现这一算法。
首先定义一个专家PID的结构体对象:
/*定义结构体和公用体*/
typedef struct
{
float setpoint; /*设定值*/
float kp; /*比例系数*/
float ki; /*积分系数*/
float kd; /*微分系数*/
float lasterror; /*前一拍偏差*/
float preerror; /*前两拍偏差*/
float result; /*PID控制器结果*/
float output; /*输出值,0-100,为百分比值*/
float maximum; /*输出值上限*/
float minimum; /*输出值下限*/
float errorabsmax; /*偏差绝对值最大值*/
float errorabsmid; /*偏差绝对值中位值*/
float errorabsmin; /*偏差绝对值最小值*/
}EXPERTPID;
在上面分析的基础上我们很容易写出来一个专家PID的控制器如下:
void ExpertPID(EXPERTPID vPID,float pv)
{
float thiserror;
float deltaerror;
float lastdeltaerror;
float result;//本次调节输出值 thiserror=vPID->setpoint-pv;
deltaerror=thiserror-vPID->lasterror;
lastdeltaerror=vPID->lasterror-vPID->preerror; if(abs(thiserror)>=vPID->errorabsmax)
{/*执行规则1*/
if(thiserror>)
{
result=vPID->maximum;
} if(thiserror<)
{
result=vPID->minimum;
}
} if((thiserror*deltaerror>)||(deltaerror==))
{/*执行规则2*/ if(abs(thiserror)>=vPID->errorabsmid)
{
result=vPID->result+2.0*(vPID->kp*deltaerror+vPID->ki*thisError+vPID->kd*(deltaerror-lastdeltaerror);
}
else
{
result=vPID->result+0.4*(vPID->kp*deltaerror+vPID->ki*thisError+vPID->kd*(deltaerror-lastdeltaerror);
}
} if(((thiserror*deltaerror<)&&(deltaerror*lastdeltaerror>))||(thiserror==))
{/*执行规则3*/
result=vPID->result;
} if((thiserror*deltaerror<)&&(deltaerror*lastdeltaerror<))
{/*执行规则4*/
if(abs(thiserror)>=vPID->errorabsmid)
{
result=vPID->result+2.0*output+vPID->kp*thiserror;
}
else
{
result=vPID->result+0.6*output+vPID->kp*thiserror;
}
} if((abs(thiserror)<=vPID->errorabsmin)&&(abs(thiserror)>))
{/*执行规则5*/
result=vPID->result+0.5*vPID->kp*deltaerror+0.3*vPID->ki*thiserror;
} /*对输出限值,避免超调*/
if(result>=vPID->maximum)
{
result=vPID->maximum;
} if(result<=vPID->minimum)
{
result=vPID->minimum;
} vPID->result=result;
vPID->preerror=vPID->lasterror;
vPID->lasterror=thiserror;
vPID->output=(result/(vPID->maximum-vPID->minimum))*;
}
4、专家PID总结
本节我们实现了一个专家PID控制器,这是一种专家规则直接与PID算法相结合的直接型专家控制器。通过分析PID的调节过程总结了5条规则,以这5条规则为基础实现了上述的算法。当然这只是一个普遍型的规则库,对于不同的被控对象和控制要求,我们可以采用不同的判断规则,而且各参数的选取需依赖于专家经验,所以规则的获取和使用也会有不同方式。
欢迎关注:

PID控制器开发笔记之十一:专家PID控制器的实现的更多相关文章
- PID控制器开发笔记(转)
源: PID控制器开发笔记
- Modbus库开发笔记之十一:关于Modbus协议栈开发的说明(转)
源: Modbus库开发笔记之十一:关于Modbus协议栈开发的说明
- PID控制器开发笔记之十三:单神经元PID控制器的实现
神经网络是模拟人脑思维方式的数学模型.神经网络是智能控制的一个重要分支,人们针对控制过程提供了各种实现方式,在本节我们主要讨论一下采用单神经元实现PID控制器的方式. 1.单神经元的基本原理 单神经元 ...
- PID控制器开发笔记之十二:模糊PID控制器的实现
在现实控制中,被控系统并非是线性时不变的,往往需要动态调整PID的参数,而模糊控制正好能够满足这一需求,所以在接下来的这一节我们将讨论模糊PID控制器的相关问题.模糊PID控制器是将模糊算法与PID控 ...
- PID控制器开发笔记之十:步进式PID控制器的实现
对于一般的PID控制系统来说,当设定值发生较大的突变时,很容易产生超调而使系统不稳定.为了解决这种阶跃变化造成的不利影响,人们发明了步进式PID控制算法. 1.步进式PID的基本思想 所谓步进式PID ...
- PID控制器开发笔记之九:基于前馈补偿的PID控制器的实现
对于一般的时滞系统来说,设定值的变动会产生较大的滞后才能反映在被控变量上,从而产生合理的调节.而前馈控制系统是根据扰动或给定值的变化按补偿原理来工作的控制系统,其特点是当扰动产生后,被控变量还未变化以 ...
- PID控制器开发笔记之八:带死区的PID控制器的实现
在计算机控制系统中,由于系统特性和计算精度等问题,致使系统偏差总是存在,系统总是频繁动作不能稳定.为了解决这种情况,我们可以引入带死区的PID算法. 1.带死区PID的基本思想 带死区的PID控制算法 ...
- PID控制器开发笔记之四:梯形积分PID控制器的实现
从微积分的基本原理看,积分的实现是在无限细分的情况下进行的矩形加和计算.但是在离散状态下,时间间隔已经足够大,矩形积分在某些时候显得精度要低了一些,于是梯形积分被提出来以提升积分精度. 1.梯形积分基 ...
- Modbus库开发笔记之十一:关于Modbus协议栈开发的说明
对于Modbus协议栈的整个开发内容,前面已经说得很清楚了,接下来我们说明一下与开发没有直接关系的内容. 首先,关于我为什么开发这个协议栈的问题.我们的初衷只是想能够在开发产品时不用每次都重写这一部分 ...
随机推荐
- Docker 添加环境系统文件配置
在 docker 启动文件添加默认环境系统配置 " /etc/default/docker ": 添加 Environment File 配置: # vi /usr/lib/sy ...
- CMD之入门篇
本博文最早是记录在本地电脑的,由于清理电脑的缘故,顺便将这篇笔记转移到公共博客,以便日后查阅和快速上手使用. 开门见山,步入正题,以下是Windows系统的常用CMD命令. 一 文件系统操作 0.[脚 ...
- ue4动画蓝图
动画资源 animation sequence 序列动画 :一帧一骨骼 montage 片断动画 : 动画蒙太奇 将不同的片断组成一个动画 blend space 混合动画 : 将2 ...
- Java中常见的锁分类以及对应特点
对于 Java 锁的分类没有严格意义的规则,我们常说的分类一般都是依据锁的特性.锁的设计.锁的状态等进行归纳整理的,所以常见的分类如下: 公平锁和非公平锁:公平锁是多线程按照锁申请的顺序获取锁,非公平 ...
- python概念(一)python基本数据类型
http://www.cnblogs.com/nulige/p/6115765.html
- PTA 逆散列问题 (30 分)(贪心)
题目链接:https://pintia.cn/problem-sets/1107178288721649664/problems/1107178432099737614 题目大意: 给定长度为 N 的 ...
- CentOS7下安装JDK详细过程
Linux上一般会安装Open JDK,关于OpenJDK和JDK的区别:http://www.cnblogs.com/sxdcgaq8080/p/7487369.html 下面开始安装步骤: --- ...
- Navicat for Mysql连接mysql数据库时出现 2003-Can't connect to MySql server on 'localhost'(10061)
一.环境:linux服务器下 二.问题:在windows7下使用Navicat for Mysql连接mysql数据库时出现 2003-Can't connect to MySql server on ...
- 刷题之路第三题--Longest Substring Without Repeating Characters
问题简介:求给定字符串中最长的字符不重复的字符串的长度 问题详解: 给定一个字符串,寻找给定字符串中包含的最长的字符不重复的字符串的长度 注:答案必须是子字符串,不是子序列 是连续的字符不重复的字符串 ...
- 使用WireMock快速伪造RESTful服务
⒈下载WireMock独立运行程序 http://wiremock.org/docs/running-standalone/ ⒉运行 java -jar wiremock-standalone-2.2 ...