积分作用的引入是为了消除系统的静差,提高控制精度。但是如果一个系统总是存在统一个方向的偏差,就可能无限累加而进而饱和,极大影响系统性能。抗积分饱和就是用以解决这一问题的方法之一。这一节我们就来实现抗积分饱和的PID算法。

1、抗积分饱和的基本思想

所谓积分饱和就是指系统存在一个方向的偏差,PID控制器的输出由于积分作用的不断累加而扩大,从而导致控制器输出不断增大超出正常范围进入饱和区。当系统出现反响的偏差时,需要首先从饱和区退出,而不能对反向的偏差进行快速的响应。

为了解决积分饱和的问题,人们引入了抗积分饱和的PID算法。所谓抗积分饱和算法,其思路是在计算U(k)的时候,先判断上一时刻的控制量U(k-1)是否已经超出了限制范围。若U(k-1)>Umax,则只累加负偏差;若U(k-1)<Umin,则只累加正偏差。从而避免控制量长时间停留在饱和区。

2、算法实现

抗积分饱和的思想很简单,解释在控制器输出的最大最小值附近限制积分的累积情况,以防止在恢复时没有响应。根据前面得分系我们可以得到如下的流程图:

1)位置型PID算法实现

对于位置型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 result; //输出值
  18.  
  19. float integral;//积分值
  20.  
  21. float maximum;//最大值
  22.  
  23. float minimum;//最小值
  24.  
  25. }PID;

接下来实现PID控制器:

  1. void PIDRegulation(PID *vPID, float processValue)
  2.  
  3. {
  4.  
  5. float thisError;
  6.  
  7. thisError=vPID->setpoint-processValue;
  8.  
  9. if(vPID->result>vPID->maximum)
  10.  
  11. {
  12.  
  13. if(thisError<=)
  14.  
  15. {
  16.  
  17. vPID->integral+=thisError;
  18.  
  19. }
  20.  
  21. }
  22.  
  23. else if(vPID->result<vPID->minimum)
  24.  
  25. {
  26.  
  27. if(thisError>=)
  28.  
  29. {
  30.  
  31. vPID->integral+=thisError;
  32.  
  33. }
  34.  
  35. }
  36.  
  37. else
  38.  
  39. {
  40.  
  41. vPID->integral+=thisError;
  42.  
  43. }
  44.  
  45. vPID->result=vPID->proportiongain*thisError+vPID->integralgain*vPID->integral+vPID->derivativegain*(thisError-vPID->lasterror);
  46.  
  47. vPID->lasterror=thisError;
  48.  
  49. }

2)增量型PID算法实现

增量型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 deadband; //死区
  20.  
  21. float result; //输出值
  22.  
  23. float maximum;//最大值
  24.  
  25. float minimum;//最小值
  26.  
  27. }PID;

接下来实现PID控制器:

  1. void PIDRegulation(PID *vPID, float processValue)
  2.  
  3. {
  4.  
  5. float thisError;
  6.  
  7. float increment;
  8.  
  9. float pError,dError,iError;
  10.  
  11. thisError=vPID->setpoint-processValue; //得到偏差值
  12.  
  13. pError=thisError-vPID->lasterror;
  14.  
  15. iError=;
  16.  
  17. dError=thisError-*(vPID->lasterror)+vPID->preerror;
  18.  
  19. if(vPID->result>vPID->maximum)
  20.  
  21. {
  22.  
  23. if(thisError<=)
  24.  
  25. {
  26.  
  27. iError=thisError;
  28.  
  29. }
  30.  
  31. }
  32.  
  33. else if(vPID->result<vPID->minimum)
  34.  
  35. {
  36.  
  37. if(thisError>=)
  38.  
  39. {
  40.  
  41. iError=thisError;
  42.  
  43. }
  44.  
  45. }
  46.  
  47. else
  48.  
  49. {
  50.  
  51. iError=thisError;
  52.  
  53. }
  54.  
  55. increment=vPID->proportiongain*pError+vPID->integralgain*iError+vPID->derivativegain*dError; //增量计算
  56.  
  57. vPID->preerror=vPID->lasterror; //存放偏差用于下次运算
  58.  
  59. vPID->lasterror=thisError;
  60.  
  61. vPID->result+=increment;
  62.  
  63. }

3、总结

所谓抗积分饱和就是防止由于长期存在一个方向的偏差而对相反方向的偏差迟滞响应。本文的方法是在达到极值后将不再对这一方向的偏差做出反应相反只对另一方向的偏差做出反应。事实上由于偏差的存在有可能造成输出值超限的情况,所以还需要对输出值作出限制。

欢迎关注:

PID控制器开发笔记之三:抗积分饱和PID控制器的实现的更多相关文章

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

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

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

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

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

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

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

    源: PID控制器开发笔记

  5. PID控制算法的C语言实现六 抗积分饱和的PID控制算法C语言实现

    所谓的积分饱和现象是指如果系统存在一个方向的偏差,PID控制器的输出由于积分作用的不断累加而加大,从而导致执行机构达到极限位置,若控制器输出U(k)继续增大,执行器开度不可能再增大,此时计算机输出控制 ...

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

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

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

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

  8. PID控制器开发笔记之十二:模糊PID控制器的实现

    在现实控制中,被控系统并非是线性时不变的,往往需要动态调整PID的参数,而模糊控制正好能够满足这一需求,所以在接下来的这一节我们将讨论模糊PID控制器的相关问题.模糊PID控制器是将模糊算法与PID控 ...

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

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

随机推荐

  1. [译]Use Dependency Injection In WebForms Application

    怎么在已用的WebForm应用中使用DI 假设有一个电影网站,有个页面会列出最近热门的电影.这个项目中使用了仓储模式来获取数据. public partial class Default : Syst ...

  2. “<textarea>”内的文字对齐

    转载:https://blog.csdn.net/henryzhang2009/article/details/9283803 转: textarea会把开始标签到结束标签里的内容全部原样显示,包括空 ...

  3. Viterbi

    把语音分割为计算发音质量测度所需要的小单元时候,需要进行Viterbi对齐 Viterbi,在htk和sphinx中,也被称作token passing model Viterbi解码图是 状态数Sm ...

  4. python购物车作业

    # -*- coding:utf8 -*- # Author:Wang Yao goods = [{"name": "电脑", "price" ...

  5. python3:实现输出等边三角形、直角三角形

    学习python,用的是3.5的版本: 记录一下学习历程~ 一.先来一个简单的,输出直角三角形: ***知识点:for循环,range()函数 二.进阶:输出等边三角形 ******知识点:嵌套for ...

  6. linux 启动管理

  7. python - zipfile模块

    import zipfile # f=zipfile.ZipFile(filename, mode="r", compression=ZIP_STORED, allowZip64= ...

  8. AtomicLong和LongAdder的区别

    AtomicLong的原理是依靠底层的cas来保障原子性的更新数据,在要添加或者减少的时候,会使用死循环不断地cas到特定的值,从而达到更新数据的目的. LongAdder在AtomicLong的基础 ...

  9. Django 基于类的通用视图

    在早期,我们认识到在视图开发过程中有共同的用法和模式.这时我们引入基于函数的通用视图来抽象这些模式以简化常见情形的视图开发. 基于函数视图的用法有以下三种: def index(request): r ...

  10. Zookeeper学习笔记3

    客户端的操作 zkCli.sh 官方文档 ls / [zookeeper] get / cZxid = 0x0 ctime = Thu Jan 01 08:00:00 CST 1970 mZxid = ...