PID控制器开发笔记之七:微分先行PID控制器的实现
前面已经实现了各种的PID算法,然而在某些给定值频繁且大幅变化的场合,微分项常常会引起系统的振荡。为了适应这种给定值频繁变化的场合,人们设计了微分先行算法。
1、微分先行算法的思想
微分先行PID控制是只对输出量进行微分,而对给定指令不起微分作用,因此它适合于给定指令频繁升降的场合,可以避免指令的改变导致超调过大。微分先行的基本结构图:

根据上面的结构图,我们可以推出PID控制器的输出公式,比例和积分是不变的只是微分部分变为只对对象输出积分,记为y,我们对微分部分引入一阶惯性滤波:
,可记微分部分的传递函数如下:

于是微分部分可以推导出如下的公式:

前面我们在推导PID的公式时曾规定:Kd=Kp*Td/T,于是我们将其带入公式可得:

于是我们就可以得到微分先行的离散化公式:

这即是位置型PID的计算公式了,我们也可以使用前面的方法推导增量型的计算公式如下:


从上面的公式我们发现,微分部分只与测量值有关,而且与连续的几个测量值都有关。而与设定值没有关系,设定值的阶跃变化不会造成高频的干扰。
2、算法实现
前面我们已经简单的介绍了微分现行的基本结构,也推导了位置型以及增量型公式,接下来我们根据前面对其基本思想的描述,来实现基于微分先行的PID算法实现,同样是包括位置型和增量型两种实现方式。
(1)位置型PID算法实现
关于微分先行PID算法的公式我们已经推导出来了,编码实现就是在公式的基础上将其计算机语言化。同样的,首先定义PID对象的结构体:
/*定义结构体和公用体*/
typedef struct
{
float setpoint; //设定值
float proportiongain; //比例系数
float integralgain; //积分系数
float derivativegain; //微分系数
float lasterror; //前一拍偏差
float result; //输出值
float integral; //积分值
float derivative; //微分项
float lastPv; //前一拍的测量值
float gama; //微分先行滤波系数
}PID;
接下来实现PID控制器:
void PIDRegulation(PID *vPID, float processValue)
{
float thisError;
float c1,c2,c3,temp;
thisError=vPID->setpoint-processValue;
vPID->integral+=thisError;
temp= vPID-> gama * vPID-> derivativegain + vPID-> proportiongain;
c3= vPID-> derivativegain/temp;
c2=( vPID-> derivativegain+ vPID-> proportiongain)/temp;
c1= vPID-> gama*c3;
vPID-> derivative=c1* vPID-> derivative+c2* processValue+c3* vPID-> lastPv;
vPID->result=vPID->proportiongain*thisError+vPID->integralgain*vPID->integral+vPID-> derivative;
vPID->lasterror=thisError;
vPID-> lastPv= processValue;
}
对于微分先行的位置型PID控制器来说,本次的微分项不仅与上一拍的微分结果有关,而且与上一拍的测量值有关。
(2)增量型PID算法实现
微分先行增量型PID控制算法的实现就是以前面的增量型公式为基础。微分先行的比例与积分部分并没有什么变化,当然积分部分也可以采用各种优化算法。而微分部分以增量型公式实现即可,首先定义PID对象的结构体:
/*定义结构体和公用体*/
typedef struct
{
float setpoint; //设定值
float proportiongain; //比例系数
float integralgain; //积分系数
float derivativegain; //微分系数
float lasterror; //前一拍偏差
float preerror; //前两拍偏差
float deadband; //死区
float result; //输出值
float deltadiff; /*微分增量*/
float integralValue; /*积分累计量*/
float gama; /*微分先行滤波系数*/
float lastPv; /*上一拍的过程测量值*/
float lastDeltaPv; /*上一拍的过程测量值增量*/
}PID;
接下来实现PID控制器:
void PIDRegulation(PID *vPID, float processValue)
{
float thisError;
float increment;
float pError,iError;
float c1,c2,c3,temp;
float deltaPv;
temp= vPID-> gama * vPID-> derivativegain + vPID-> proportiongain;
c3= vPID-> derivativegain/temp;
c2=( vPID-> derivativegain+ vPID-> proportiongain)/temp;
c1= vPID-> gama*c3;
deltaPv= processValue- vPID-> lastDeltaPv
vPID-> deltadiff =c1* vPID-> deltadiff +c2* deltaPv +c3* vPID-> lastDeltaPv;
thisError=vPID->setpoint-processValue; //得到偏差值
pError=thisError-vPID->lasterror;
iError=thisError;
increment=vPID->proportiongain*pError+vPID->integralgain*iError+ vPID-> deltadiff; //增量计算
vPID->preerror=vPID->lasterror; //存放偏差用于下次运算
vPID->lastDeltaPv=deltaPv;
vPID->lastPv= processValue;
vPID->lasterror=thisError;
vPID->result+=increment;
}
这就实现了一个最简单的微分先行的增量型PID控制器,与一般的PID控制器相比,还需要知道前一拍的测量值、前一拍的测量值增值以及前一拍的微分增量,其余的只需要按公式完成即可。
3、总结
微分先行由于微分部分只对测量值起作用所以可以消除设定值突变的影响,还可以引入低通滤波,甚至在必要时将比例作用也可进行相应的改进。其实用于设定值会频繁改变的过程对象,防止设定值的频繁波动造成系统的不稳定。该控制对于改善系统的动态特性是有好处的,但势必影响响应的速度,需全面考虑。
欢迎关注:

PID控制器开发笔记之七:微分先行PID控制器的实现的更多相关文章
- PID控制器开发笔记(转)
源: PID控制器开发笔记
- PID控制器开发笔记之十三:单神经元PID控制器的实现
神经网络是模拟人脑思维方式的数学模型.神经网络是智能控制的一个重要分支,人们针对控制过程提供了各种实现方式,在本节我们主要讨论一下采用单神经元实现PID控制器的方式. 1.单神经元的基本原理 单神经元 ...
- PID控制器开发笔记之十二:模糊PID控制器的实现
在现实控制中,被控系统并非是线性时不变的,往往需要动态调整PID的参数,而模糊控制正好能够满足这一需求,所以在接下来的这一节我们将讨论模糊PID控制器的相关问题.模糊PID控制器是将模糊算法与PID控 ...
- PID控制器开发笔记之八:带死区的PID控制器的实现
在计算机控制系统中,由于系统特性和计算精度等问题,致使系统偏差总是存在,系统总是频繁动作不能稳定.为了解决这种情况,我们可以引入带死区的PID算法. 1.带死区PID的基本思想 带死区的PID控制算法 ...
- PID控制器开发笔记之四:梯形积分PID控制器的实现
从微积分的基本原理看,积分的实现是在无限细分的情况下进行的矩形加和计算.但是在离散状态下,时间间隔已经足够大,矩形积分在某些时候显得精度要低了一些,于是梯形积分被提出来以提升积分精度. 1.梯形积分基 ...
- PID控制器开发笔记之十一:专家PID控制器的实现
前面我们讨论了经典的数字PID控制算法及其常见的改进与补偿算法,基本已经覆盖了无模型和简单模型PID控制经典算法的大部.再接下来的我们将讨论智能PID控制,智能PID控制不同于常规意义下的智能控制,是 ...
- PID控制器开发笔记之十:步进式PID控制器的实现
对于一般的PID控制系统来说,当设定值发生较大的突变时,很容易产生超调而使系统不稳定.为了解决这种阶跃变化造成的不利影响,人们发明了步进式PID控制算法. 1.步进式PID的基本思想 所谓步进式PID ...
- PID控制器开发笔记之九:基于前馈补偿的PID控制器的实现
对于一般的时滞系统来说,设定值的变动会产生较大的滞后才能反映在被控变量上,从而产生合理的调节.而前馈控制系统是根据扰动或给定值的变化按补偿原理来工作的控制系统,其特点是当扰动产生后,被控变量还未变化以 ...
- PID控制器开发笔记之六:不完全微分PID控制器的实现
从PID控制的基本原理我们知道,微分信号的引入可改善系统的动态特性,但也存在一个问题,那就是容易引进高频干扰,在偏差扰动突变时尤其显出微分项的不足.为了解决这个问题人们引入低通滤波方式来解决这一问题. ...
随机推荐
- [译]使用mediatR的notification来扩展的的应用
原文 你不希望在controller里面出现任何领域知识 开发者经常有这样的疑问"这个代码应该放在哪呢?"应该使用仓储还是query类?.... 怎么去实现职责分离和单一职责呢? ...
- Python之List列表的增删改查
序列是Python中最基本的数据结构.序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推. Python有6个序列的内置类型,但最常见的是列表和元组. 序列 ...
- Shiro入门 - 通过自定义Realm连数数据库进行认证
添加shiro-realm.ini文件 [main] #自定义Realm myRealm=test.shiro.MyRealm #将myRealm设置到securityManager,相当于Sprin ...
- 生成器的throw和close方法
def gen_func(): try: yield 1 except Exception as e: pass yield 2 yield 3 yield 4 yield 5 return &quo ...
- Hibernate Transformers之三种结果转换说明
在hibernate使用的过程中,我们通常需要对结果进行解释.Hibernate为我们提供了以下3种查询结果解释方法: Transformers.ALIAS_TO_ENTITY_MAP //把输出结果 ...
- 基于keepalived搭建MySQL热机集群
背景 MySQL的高可用方案一般有如下几种: keepalived+双主,MHA,MMM,Heartbeat+DRBD,PXC,Galera Cluster 比较常用的是keepalived+双主,M ...
- img大小和background-size
img 不设置img标签的width和height,将显示图片真实大小 只设置width或height,另一个将按比例自动缩放 设置了width和height,将按设置的大小来显示 img图片自适应( ...
- Idea实用配置
参考:https://github.com/judasn/IntelliJ-IDEA-Tutorial 1.代码提示不区分大小写 2.跳到指定行 Ctrl + G Ctrl 快捷键 介绍 Ctrl + ...
- 【leetcode】893. Groups of Special-Equivalent Strings
Algorithm [leetcode]893. Groups of Special-Equivalent Strings https://leetcode.com/problems/groups-o ...
- [转]python3之paramiko模块(基于ssh连接进行远程登录服务器执行命令和上传下载文件的功能)
转自:https://www.cnblogs.com/zhangxinqi/p/8372774.html 阅读目录 1.paramiko模块介绍 2.paramiko的使用方法 回到顶部 1.para ...