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

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

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

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

2、算法实现

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

2.1、位置型PID算法实现

对于位置型PID的抗积分饱和算法其实就是在基本的PID基础上加上抗积分饱和的操作,增加量个机锋的极限值。首先定义PID对象的结构体:

/*定义结构体和公用体*/
typedef struct
{floatsetpoint;       //设定值floatproportiongain;     //比例系数floatintegralgain;      //积分系数floatderivativegain;    //微分系数floatlasterror;     //前一拍偏差floatresult; //输出值floatintegral;//积分值floatmaximum;//最大值floatminimum;//最小值
}PID;

接下来实现PID控制器:

void PIDRegulation(PID *vPID, float processValue)
{floatthisError;thisError=vPID->setpoint-processValue;if(vPID->result>vPID->maximum){if(thisError<=0){vPID->integral+=thisError;}}elseif(vPID->result<vPID->minimum){if(thisError>=0){vPID->integral+=thisError;}}else{vPID->integral+=thisError;}vPID->result=vPID->proportiongain*thisError+vPID->integralgain*vPID->integral+vPID->derivativegain*(thisError-vPID->lasterror);vPID->lasterror=thisError;
}

2.2、增量型PID算法实现

增量型PID的抗积分饱和的实现也是一样在最基本的增量型PID算法中引入极大极小的限值,并在算法中通过比较限值实现抗饱和的操作。

首先定义PID对象的结构体:

/*定义结构体和公用体*/
typedef struct
{floatsetpoint;       //设定值floatproportiongain;     //比例系数floatintegralgain;      //积分系数floatderivativegain;    //微分系数floatlasterror;     //前一拍偏差floatpreerror;     //前两拍偏差floatdeadband;     //死区floatresult; //输出值floatmaximum;//最大值floatminimum;//最小值
}PID;

接下来实现PID控制器:

void PIDRegulation(PID *vPID, float processValue)
{floatthisError;floatincrement;floatpError,dError,iError;thisError=vPID->setpoint-processValue; //得到偏差值pError=thisError-vPID->lasterror;iError=0;dError=thisError-2*(vPID->lasterror)+vPID->preerror;if(vPID->result>vPID->maximum){if(thisError<=0){iError=thisError;}}elseif(vPID->result<vPID->minimum){if(thisError>=0){iError=thisError;}}else{iError=thisError;}increment=vPID->proportiongain*pError+vPID->integralgain*iError+vPID->derivativegain*dError;   //增量计算vPID->preerror=vPID->lasterror; //存放偏差用于下次运算vPID->lasterror=thisError;vPID->result+=increment;
}

3、总结

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

欢迎关注:

PID控制器开发笔记之三:抗积分饱和PID控制器的实现相关推荐

  1. 反积分饱和 程序_用抗积分饱和PID控制传递函数为G(s)的被控对象

    题目:用抗积分饱和PID控制传递函数为G(s)的被控对象 G(s)=523500/(s^3+87.35s^2+10470s) 二.抗积分饱和原理 积分饱和现象是在系统存在一个方向的偏差,PID控制器的 ...

  2. 抗积分饱和PID控制器

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

  3. 抗积分饱和 PID代码实现,matlab仿真实现

    抗饱和PID 前几天开始我就计划把c电机仿真的PI控制器代码优化一下的时候,群里刚好讨论了Microchip的AN1078文档中的PI框图: 在这里插入图片描述 找了点视频和文章,大家感兴趣可以去看 ...

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

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

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

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

  6. PID控制器改进笔记之三:改进PID控制器之正反作用

    前面我们发布了一系列PID控制器相关的文章,包括经典PID控制器以及参数自适应的PID控制器.这一系列PID控制器虽说实现了主要功能,也在实际使用中取得了良好效果,但还有很多的细节部分可以改进以提高性 ...

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

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

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

    源: PID控制器开发笔记 转载于:https://www.cnblogs.com/LittleTiger/p/10499701.html

  9. PID控制器改进笔记之二:改进PID控制器之手自动切换

    前面我们发布了一系列PID控制器相关的文章,包括经典PID控制器以及参数自适应的PID控制器.这一系列PID控制器虽说实现了主要功能,也在实际使用中取得了良好效果,但还有很多的细节部分可以改进以提高性 ...

最新文章

  1. 2022-2028年中国防臭袜行业投资分析及前景预测报告
  2. MyBatis批量插入几千条数据慎用foreach
  3. 老板说我最近飘了,都敢用 MySQL 实现分布式锁了
  4. 利用epoll写一个迷你的网络事件库
  5. c语言readdir函数功能,C语言readdir()函数:读取目录函数
  6. RPC框架的可靠性设计
  7. 高级ZK:异步UI更新和后台处理–第1部分
  8. 领域驱动设计和业务建模的最佳实现模式
  9. SpringCloud 从菜鸟到大牛之六 消息和异步 MQ
  10. RDS关系型数据库服务
  11. python微信开发入门_python tornado微信开发入门代码
  12. pyqsplitter 保持一个窗口不能拖动_Axure教程:左侧导航如何自适应浏览器窗口高度?...
  13. SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder“.
  14. 关于数模中编程的一点愚见
  15. 惠普HP LaserJet 1320n 打印机驱动
  16. SQLyog 安装教程
  17. 产品经理的职责有哪些?该做什么?
  18. 如何写好项目规划和方案设计文档
  19. 如何用outlook添加qq邮箱账户
  20. 基于BOA的嵌入式Web项目【机房温度监控】

热门文章

  1. CreateFile
  2. profile 配置文件修改后如何生效?
  3. JSP 简介(转载)
  4. lintcode12 带最小值操作的栈
  5. 个人觉得好的文章链接推荐【转载,侵权立删】
  6. python-k近邻分类器-KNN
  7. 第一章 计算机网络 4 性能指标 [计算机网络笔记]
  8. 【剑指offer】面试题07. 重建二叉树(Java)
  9. 思科nat配置实例_Cisco ASA 5520(8.2.4)配置企业内网案例
  10. 1.php查询数据,查询数据 - ThinkPHP 5.1 完全开发手册