从PID控制的基本原理我们知道,微分信号的引入可改善系统的动态特性,但也存在一个问题,那就是容易引进高频干扰,在偏差扰动突变时尤其显出微分项的不足。为了解决这个问题人们引入低通滤波方式来解决这一问题。

1、不完全微分的基本思想

  微分项有引入高频干扰的风险,但若在控制算法中加入低通滤波器,则可使系统性能得到改善。方法之一就是在PID算法中加入一个一阶低通滤波器。这就是所谓的不完全微分,其结构图如下:

或者是另一种形式:

在这里我们考虑第一种结构形式。在这种情况下,微分与一阶惯性环节结合,其微分部分的计算公式可表示如下:

其中α的取值在0和1之间,有滤波常数和采样周期确定。据此我们将其增量化,则可以得到为不完全微分的增量计算公式:

或者表示为:

这两种表示方式是等价的,第二种表示法与我们的完全微分PID算法增量型式表示更接近,好理解。而且与位置型的表示法也更为一致,所以我们选择第二种表示法。

2、算法实现

经过前面的分析及公式推导,我们想要实现不完全微分其实已经相当容易了。为了便于理解,我们保持比例和积分为基本的格式,只对微分部分采用不完全微分算法。

1)位置型PID算法实现

位置型PID实现过程与前面的一样,所不同的是需要增加前一个Ud值。首先定义PID对象的结构体:

  1. /*定义结构体和公用体*/
  2.  
  3. typedef struct
  4.  
  5. {
  6.  
  7. float setpoint; //设定值
  8.  
  9. float proportiongain; //比例系数
  10.  
  11. float integralgain; //积分系数
  12.  
  13. float derivativegain; //微分系数
  14.  
  15. float lasterror; //前一拍偏差
  16.  
  17. float lastdev; //前一拍时的微分项值
  18.  
  19. float alpha; //不完全微分系数
  20.  
  21. float result; //输出值
  22.  
  23. float integral;//积分值
  24.  
  25. }PID;

  接下来实现PID控制器:

  1. void PIDRegulation(PID *vPID, float processValue)
  2.  
  3. {
  4.  
  5. float thisError;
  6.  
  7. float thisDev;
  8.  
  9. thisError=vPID->setpoint-processValue;
  10.  
  11. vPID->integral+=thisError;
  12.  
  13. thisDev= vPID->derivativegain*(- vPID-> alpha)*(thisError-vPID->lasterror)+ vPID-> alpha* vPID-> lastdev;
  14.  
  15. vPID->result=vPID->proportiongain*thisError+vPID->integralgain*vPID->integral+ thisDev;
  16.  
  17. vPID->lasterror=thisError;
  18.  
  19. vPID->lastdev = thisDev;
  20.  
  21. }

  这就实现了一个最简单不完全微分的位置型PID控制器,当然没有考虑任何干扰条件,仅仅只是对数学公式的计算机语言化。

2)增量型PID算法实现

  增量型不完全微分PID控制器的实现就是以前面的增量型公式为基础。首先定义PID对象的结构体:

  1. /*定义结构体和公用体*/
  2.  
  3. typedef struct
  4.  
  5. {
  6.  
  7. float setpoint; //设定值
  8.  
  9. float proportiongain; //比例系数
  10.  
  11. float integralgain; //积分系数
  12.  
  13. float derivativegain; //微分系数
  14.  
  15. float lasterror; //前一拍偏差
  16.  
  17. float preerror; //前两拍偏差
  18.  
  19. float lastdeltadev; //前一拍时的微分项增量
  20.  
  21. float alpha; //不完全微分系数
  22.  
  23. float deadband; //死区
  24.  
  25. float result; //输出值
  26.  
  27. }PID;

  接下来实现PID控制器:

  1. void PIDRegulation(PID *vPID, float processValue)
  2.  
  3. {
  4.  
  5. float thisError;
  6.  
  7. float increment;
  8.  
  9. float deltaDev;
  10.  
  11. float pError,dError,iError;
  12.  
  13. thisError=vPID->setpoint-processValue; //得到偏差值
  14.  
  15. pError=thisError-vPID->lasterror;
  16.  
  17. iError=thisError;
  18.  
  19. dError=thisError-*(vPID->lasterror)+vPID->preerror;
  20.  
  21. deltaDev= vPID->derivativegain*(- vPID-> alpha)*dError+ vPID-> alpha* vPID-> lastdeltadev;
  22.  
  23. increment=vPID->proportiongain*pError+vPID->integralgain*iError+ deltaDev; //增量计算
  24.  
  25. vPID->preerror=vPID->lasterror; //存放偏差用于下次运算
  26.  
  27. vPID->lasterror=thisError;
  28.  
  29. vPID-> lastdeltadev = deltaDev;
  30.  
  31. vPID->result+=increment;
  32.  
  33. }

  这就实现了一个最简单的增量型不完全微分PID控制器,也没有考虑任何的干扰条件,仅仅只是对数学公式的计算机语言化。

3、总结

  不完全微分方式在微分环节采用了低通滤波有效地提高了微分项的特性。其中α的取值是一个0~1之间的数。两个极限值,在0时其实就是没有滤波的普通微分环节;而取1时,则没有微分作用。所以α的取值对不完全微分的效果是至关重要的,一般要根据被控对象的特性来确定。

欢迎关注:

PID控制器开发笔记之六:不完全微分PID控制器的实现的更多相关文章

  1. PID控制器开发笔记之十一:专家PID控制器的实现

    前面我们讨论了经典的数字PID控制算法及其常见的改进与补偿算法,基本已经覆盖了无模型和简单模型PID控制经典算法的大部.再接下来的我们将讨论智能PID控制,智能PID控制不同于常规意义下的智能控制,是 ...

  2. PID控制器开发笔记之四:梯形积分PID控制器的实现

    从微积分的基本原理看,积分的实现是在无限细分的情况下进行的矩形加和计算.但是在离散状态下,时间间隔已经足够大,矩形积分在某些时候显得精度要低了一些,于是梯形积分被提出来以提升积分精度. 1.梯形积分基 ...

  3. PID控制器开发笔记之五:变积分PID控制器的实现

    在普通的PID控制算法中,由于积分系数Ki是常数,所以在整个控制过程中,积分增量是不变的.然而,系统对于积分项的要求是,系统偏差大时,积分作用应该减弱甚至是全无,而在偏差小时,则应该加强.积分系数取大 ...

  4. PID控制器开发笔记(转)

    源: PID控制器开发笔记

  5. PID控制器开发笔记之七:微分先行PID控制器的实现

    前面已经实现了各种的PID算法,然而在某些给定值频繁且大幅变化的场合,微分项常常会引起系统的振荡.为了适应这种给定值频繁变化的场合,人们设计了微分先行算法. 1.微分先行算法的思想 微分先行PID控制 ...

  6. PID控制器开发笔记之十三:单神经元PID控制器的实现

    神经网络是模拟人脑思维方式的数学模型.神经网络是智能控制的一个重要分支,人们针对控制过程提供了各种实现方式,在本节我们主要讨论一下采用单神经元实现PID控制器的方式. 1.单神经元的基本原理 单神经元 ...

  7. PID控制器开发笔记之八:带死区的PID控制器的实现

    在计算机控制系统中,由于系统特性和计算精度等问题,致使系统偏差总是存在,系统总是频繁动作不能稳定.为了解决这种情况,我们可以引入带死区的PID算法. 1.带死区PID的基本思想 带死区的PID控制算法 ...

  8. PID控制器开发笔记之一:PID算法原理及基本实现

    在自动控制中,PID及其衍生出来的算法是应用最广的算法之一.各个做自动控制的厂家基本都有会实现这一经典算法.我们在做项目的过程中,也时常会遇到类似的需求,所以就想实现这一算法以适用于更多的应用场景. ...

  9. PID控制器开发笔记之二:积分分离PID控制器的实现

    前面的文章中,我们已经讲述了PID控制器的实现,包括位置型PID控制器和增量型PID控制器.但这个实现只是最基本的实现,并没有考虑任何的干扰情况.在本节及后续的一些章节,我们就来讨论一下经典PID控制 ...

随机推荐

  1. 本地测试使用Tomcat,生产环境使用GlassFish。

    总结:Tomcat8 = javaee7规范(servlet3.1 + jsp2.3 + el3.0 + websocket1.0) + java7 [配置初始化参数使用jdk8编译]conf/web ...

  2. 迅为-IMX6开发板十层PCB制造,24小时开机测试,满负荷测试运行俩天,没有死机

    迅为-IMX6开发板——工业主板的优势 1.元器件 IMX6工业主板选料,选用经过长时间.高要求验证元器件,保证产品在复杂条件下,耐高温.抗潮湿等工业场合的需求. 2.PCB设计 IMX6工业主板采用 ...

  3. WIN10配置MongoDB

    WIN10配置MongoDB 1. 下载 [MongoDB 官网下载链接](https://www.mongodb.com/download-center?jmp=nav#community) 2. ...

  4. Codeforces891C(892E)

    传送门:here 简述题意:                                                                                       ...

  5. linux 僵屍进程

    参考链接 :  http://soft.chinabyte.com/os/5/12172005.shtml

  6. 深度学习——深度神经网络(DNN)反向传播算法

    深度神经网络(Deep Neural Networks,简称DNN)是深度学习的基础. 回顾监督学习的一般性问题.假设我们有$m$个训练样本$\{(x_1, y_1), (x_2, y_2), …, ...

  7. Create C++ Class

    创建“目标物体”,是世界场景中的一个物体,当玩家经过时,可以将它拾起,并带至某处 选择Actor为父类,创建FPSObjectiveActor类   注:点击公有按钮就会把头文件放入Public文件夹 ...

  8. java实现在线浏览PDF文档功能

    实现在线浏览pdf文档功能(本代码适用于项目服务中固定的并且少量的pdf浏览,比如注册时的注册条款在线浏览等): //设置响应内容类型为PDF类型 response.setContentType(&q ...

  9. 论文笔记系列-Multi-Fidelity Automatic Hyper-Parameter Tuning via Transfer Series Expansion

    论文: Multi-Fidelity Automatic Hyper-Parameter Tuning via Transfer Series Expansion 我们都知道实现AutoML的基本思路 ...

  10. Java基础3-数组操作;类概述

    昨日内容回顾 数据类型 基本数据类型 1) byte, short, int, long, float, double 2) boolean[true, false] 3) char 100: 默认为 ...