最近看到了Brett Beauregard发表的有关PID的系列文章,感觉对于理解PID算法很有帮助,于是将系列文章翻译过来!在自我提高的过程中,也希望对同道中人有所帮助。作者Brett Beauregard的原文网址:http://brettbeauregard.com/blog/2011/04/improving-the-beginner’s-pid-reset-windup/

1、问题所在

积分饱和是一个陷阱,它可能比任何其他内容对初学者有更多的要求。当 PID 认为它可以做一些它做不到的事情时,就会发生这种情况。例如,Arduino 上的 PWM 输出接受0-255 之间的值。默认情况下,PID 不知道这一点。如果它认为300-400-500 会奏效,它将尝试那些期望得到它所需要的东西的值。由于在现实中,该值被限制在 255,它只会继续尝试越来越多的数字,而不会取得任何进展。

这个问题以奇怪的滞后的形式显现出来。上面我们可以看到,输出以 "非常兴奋" 的方式超出了外部限制。当设定值下降时,输出必须在低于255的限制线之前逐步减少。

2、解决方案步骤1

有几种方法可以缓解积分饱和,但我选择的方法如下:告诉 PID 输出限制是什么。在下面的代码中,您将看到现在有一个 SetOuputLimits函数。一旦达到任一限制,pid 停止求和 (积分)。它知道没有什么可做的; 它知道自己已经无能为力。由于输出不会积分饱和,所以当设定值下降到我们可以做一些事情的范围内时,我们会得到立即的响应。

3、解决方案步骤2

不过,请注意,在上面的图表中,虽然我们摆脱了那个积分饱和滞后,但我们并没有完成这一步。PID认为它正在发送的东西,和刚刚发送的东西间还是存在偏差。为什么?比例项和 (在较小的程度上) 微分项的存在。

尽管积分项已被安全地钳位,但P和D仍在增加他们两的份额,产生的结果也有可能会高于输出限制。在我看来,这依然是不可接受的。如果用户调用名为 "SetOutputLimits" 的函数,他们必须假定这意味着“输出将保留在这些值之内”。因此,对于步骤2,我们将其作为一个有效的假设。除了钳位积分项之外,我们还要钳位输出值,使其保持在预期的位置。

(注意: 您可能会问为什么我们需要钳位这两个。如果我们要控制输出限制,为什么要单独钳位积分项呢?如果我们只是钳位输出,积分项就会不停的增长。虽然在向上的过程中,输出看起来会很好,但我们会看到在下降的过程中,会受到积分饱和的影响。

4、代码

/*working variables*/
unsigned long lastTime;
double Input,Output,Setpoint;
double ITerm,lastInput;
double kp,ki,kd;
int SampleTime = 1000;//1 secdouble outMin,outMax;
void Compute()
{unsigned long now = millis();int timeChange = (now - lastTime);if(timeChange>=SampleTime){/*Compute all the working error variables*/double error = Setpoint - Input;ITerm+= (ki * error);if(ITerm> outMax) ITerm= outMax;else if(ITerm< outMin) ITerm= outMin;double dInput = (Input - lastInput);/*Compute PID Output*/Output = kp * error + ITerm- kd * dInput;if(Output > outMax) Output = outMax;else if(Output < outMin) Output = outMin;/*Remember some variables for next time*/lastInput = Input;lastTime = now;}
}void SetTunings(double Kp,double Ki,double Kd)
{double SampleTimeInSec = ((double)SampleTime)/1000;kp = Kp;ki = Ki * SampleTimeInSec;kd = Kd / SampleTimeInSec;
}void SetSampleTime(int NewSampleTime)
{if (NewSampleTime > 0){double ratio  = (double)NewSampleTime/(double)SampleTime;ki *= ratio;kd /= ratio;SampleTime = (unsigned long)NewSampleTime;}
}void SetOutputLimits(double Min,double Max)
{if(Min > Max) return;outMin = Min;outMax = Max;if(Output > outMax) Output = outMax;else if(Output < outMin) Output = outMin;if(ITerm> outMax) ITerm= outMax;else if(ITerm< outMin) ITerm= outMin;
}

添加了一个新函数,允许用户指定输出限制 [52-63 行]。这些限制用于钳位积分项 [17-18] 和输出 [23-24]

5、最终结果

正如我们所看到的,积分饱和被消除了。此外,输出将保留在我们希望的位置。这意味着无需对输出进行外部钳位。如果希望它的范围从23到 167,您可以将它们设置为输出限制。

欢迎关注:

改进初学者的PID-积分饱和相关推荐

  1. PID积分饱和 和 积分分离

    PID积分饱和 和 积分分离 1.积分饱和:积分是当前误差的累加ei_sum=ei_sum +err_now;积分饱和则是当你pid输出到了你想要的最大值,但存在外界干扰造成err_now当前误差仍然 ...

  2. 反积分饱和 程序_三面大疆惨败,因为不懂PID的积分抗饱和

    0 前面的话 理想的PID算法往往不能满足实际使用中的很多场景,比如积分饱和的问题,因此需要在此基础上对积分器做抗饱和处理,积分anti windup的优化.这不,隆哥这次面试,直接挂在这么基础的知识 ...

  3. 反积分饱和 程序_非常通俗易懂的PID控制(2)--积分饱和

    第一篇在: 非常通俗易懂的PID控制(1) - 江知季的文章 - 知乎 上一篇讲述了PID的原理,看起来控制是十分完美的,至少在理论上. 不过现实总是不完美的. 因为在PID输出的控制信号(在理论上可 ...

  4. PID控制器开发笔记之三:抗积分饱和PID控制器的实现

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

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

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

  6. PID控制的深入探讨(位置式PID、增量式PID、PID的积分饱和)

    本文主要探讨PID算法在使用时的一些实际问题.处理技巧和方法,学习本节内容需要先对PID控制算法有基本的了解. 1)PID控制的基本原理 PID是一个二阶线性控制器,它具有不需要建立数学模型,控制效果 ...

  7. 抗积分饱和PID控制器

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

  8. 改进初学者的PID-介绍

    最近看到了Brett Beauregard发表的有关PID的系列文章,感觉对于理解PID算法很有帮助,于是将系列文章翻译过来!在自我提高的过程中,也希望对同道中人有所帮助.作者Brett Beaure ...

  9. matlab限幅器无饱和怎么设置,抗积分饱和算法:输出限幅.ppt

    抗积分饱和算法:输出限幅 模块八 数字控制器设计 本章要点 1. 连续化设计方法 重点:数字PID设计 2. 直接离散化设计方法 重点:最少拍控制算法 3. 大林算法与纯滞后控制 4. 模糊控制基础 ...

最新文章

  1. sigterm sigint sigkill 区别
  2. AppStore IPv6-only审核被拒原因分析及解决方案-b
  3. 东芝2505扫描软件_东芝P300机械硬盘上膛体验:内存大了,小姐姐再也不愁无处安放了...
  4. 如何保证战略落地_战略如何规划落地?值得借鉴
  5. SAP Commerce Cloud 2011装好之后,访问Accelerator时遇到错误
  6. 思科3550 IOS
  7. hadoop大数据开发基础_Java大数据开发(三)Hadoop(2)经典的Hadoop
  8. LeetCode-数组-三数之和
  9. kt条件例题运筹学_2016年山东大学管理学院运筹学(线性规划部分)之运筹学基础及应用(同等学力加试)复试笔试最后押题五套卷...
  10. SpringMVC的Restful风格
  11. 免费书籍库,供大家收藏
  12. python游戏设计毕业论文_游戏毕业设计论文
  13. vector_capl
  14. CSS3实现八方向云台控制器器样式
  15. 【Python学习笔记】复习sql主键外键索引
  16. 您知道这是什么的,对吧!
  17. linux iio子系统
  18. 程序提示:control reaches end of non-void function [-Wreturn-type]
  19. maven编译,执行测试用例报错 The forked VM terminated without saying properly goodbye. VM crash or System.exit c
  20. python独立样本t检验 图_Graphpad 分析教程 | 手把手教你玩转独立样本 t 检验

热门文章

  1. cosine_similarity和torch.cosine_similarity速度差异(人间奇事)
  2. [游戏开发-学习笔记]菜鸟慢慢飞(12)- Unity3D中LitJson 解析遇到的问题
  3. 【转】chrome浏览器的跨域设置——包括版本49前后两种设置
  4. ubuntu 上已经安装libxml2还提示需要reinstall的解决方法
  5. Custom PuTTY Color Themes
  6. spring-security-学习笔记-01-基本概念
  7. 计算机网络——编码和调制
  8. linux的常用操作——静态库
  9. 计算机网络(二十五)-IP数据报格式
  10. hutool的定时任务不支持依赖注入怎么办_设计一个任务调度算法,时间轮算法,比优先队列更高效...