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

1、问题

对于任何可靠的PID算法,拥有在系统运行时更改整定参数的能力都是必须的。

如果你试图在系统运行时改变整定参数,在初学PID的人看来会显得有点疯狂。让我们看看这是为什么?以下是初学者的 PID 在上述参数更改前后的状态:

因此,我们可以立即将这种差异归咎于积分项(或“I项”)。只有当参数发生变化时,它才会发生剧烈的变化。为什么会这样?这与初学积分的人对积分的理解有关:

这种解释在 Ki 被改变之前都是可以正常工作的。然后,你突然把这个新的 Ki 乘以你积累的整个误差总和。这不是我们想要的!我们只想影响事情后续的发展。

2、解决方案

有几种方法可以处理这个问题。我在上一个库中使用的方法是重新缩放偏差累计。Ki 翻了一倍?或者把偏差累计削减一半。这可以避免积分项撞击,并且也能工作的很好。不过,这有点笨拙,我想出了更优雅的东西。(我不可能是第一个想到这个问题,但我确实是一个人想到的。这算数!)

这个方案需要一个小的基本代数 (还是微积分?)

我们不是让 Ki 处在积分之外,而是把它带到里面。看起来我们视乎什么都没做,但我们会看到,在实践中,这带来了很大的变化。

现在,我们把误差乘以那个时候的Ki。然后我们存储它的和。当Ki发生变化时,没有任何变化,因为所有旧的Ki都已经“存在银行”了。我们得到一个平稳的转换,没有额外的数学运算。这可能会让我成为一个极客,但我觉得这很性感。

3、代码

/*working variables*/
unsigned long lastTime;
double Input,Output,Setpoint;
double ITerm,lastInput;
double kp,ki,kd;
int SampleTime = 1000;//1 sec
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);double dInput = (Input - lastInput);/*Compute PID Output*/Output = kp * error + ITerm - kd * dInput;/*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;}
}

因此,我们用复合积分项变量替换了 [第4行]偏差求和变量。它计算 Ki * 偏差,而不仅仅是偏差 [第15行]。此外,由于 Ki 现在被隐藏在积分项中,因此它将从主 PID 计算 [第19行] 中删除。

4、结果

那么,这是如何解决问题的。在修改Ki之前,它重新计算了所有偏差的总和;我们看到的每一个偏差值。有了这段代码,之前的偏差将保持不变,而新的Ki只会影响事情的进展,这正是我们想要的。

译注:对于本篇讨论的修改整定参数对积分项的影响问题。采用位置式PID公式确实存在这一问题,作者的解决方式也很赞。因为这就是增量式PID积分项的默认处理方式。所以如果采用增量式PID就不会存在这个问题了。

欢迎关注:

改进初学者的PID-修改整定参数相关推荐

  1. PID控制器改进笔记之六:改进PID控制器之参数设定

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

  2. 参数整定临界比例度实验_PID理解起来很难?系统讲解PID控制及参数调节,理论加实际才好!...

    在实际工程中,应用最为广泛的调节器控制规律为比例.积分.微分控制,简称PID控制,又称PID调节.PID控制器问世至今以其结构简单.稳定性好.工作可靠.调整方便而成为工业控制的主要技术之一. PID调 ...

  3. PID控制器改进笔记之一:改进PID控制器之参数动态调整

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

  4. PID控制算法与参数整定,用这几招轻松搞定!

    关注.星标公众号,不错过精彩内容 直接来源:21ic电子网 之前给大家分享过PID基础理论的文章: 重温经典PID算法 PID原理和参数调试 今天进一步分享一些PID相关细节内容. 在过程控制中,按偏 ...

  5. 临界比例度法 matlab程序,扩充临界比例度法整定参数及PID控制.doc

    扩充临界比例度法整定参数及PID控制 仲恺农业工程学院课程设计报告书 院 系:学院所 选 题 目: 专 业 班 别:姓 名:学 号:提 交 日 期:年 月日 0 引言3 1 设计任务3 1.1设计目的 ...

  6. # Arduino小车PID调速——整定参数初试水

    Arduino小车PID调速--整定参数初试水 在实现了小车较为可靠的测速基础上,便可以正式开展PID调速实验了.本文是基于使用Arduino平台上由Brett Beauregard大神写的PID库进 ...

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

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

  8. 理论应用实例水杯_PID理解起来很难?系统讲解PID控制及参数调节,理论加实际才好...

    在实际工程中,应用最为广泛的调节器控制规律为比例.积分.微分控制,简称PID控制,又称PID调节.PID控制器问世至今以其结构简单.稳定性好.工作可靠.调整方便而成为工业控制的主要技术之一. PID调 ...

  9. PID算法 控制参数如何设定调节

    PID控制简介          目前工业自动化水平已成为衡量各行各业现代化水平的一个重要标志.同时,控制理论的发展也经历了古典控制理论.现代控制理论和智能控制理论三个阶段.智能控制的典型实例是模糊全 ...

最新文章

  1. 高德联手凯迪拉克 发布全球首个高精地图应用
  2. 《深入理解Java虚拟机》笔记01 -- 运行时数据区
  3. java 抢单功能设计_java毕业设计_springboot框架的抢单兼职
  4. eclipse导入项目Archive for required library cannot be read or is not a valid ZIP file
  5. BAT 力捧的 AI 项目再次爆发,这些程序员都受影响!
  6. 编程c语言顺口溜,C语言运算符优先级顺口溜[转]
  7. Java中Math3 各种随机数生成器的使用(Random Generator)
  8. JAVA无法加载此类文件,ORA-00376: 此时无法读取文件问题处理
  9. SpringBoot集成Spring Security(1)——入门程序
  10. win10计算机管理如何分区,windows10如何对电脑硬盘进行分区
  11. UNP(2rd)第二卷源码编译
  12. coji 编程机器人_娃喜欢就行—“编程机器人”COJI
  13. 【达内课程】Android自动化测试框架Robotium
  14. 商家后台服务操作失败!服务上架失败【已上架过此类型插件】
  15. Linux中缺32位运行库steam,尝试安装Steam错误:您缺少以下32位库,并且Steam可能无法运行:...
  16. 实用网址(永久更新中)
  17. SYSLINUX 6.03不支持64bit的ext4
  18. LaTeX 文字对齐
  19. java 登入界面制作_JavaFX界面设计之登录界面的制作
  20. SEO是做什么的,每天需要做什么

热门文章

  1. 咨询笔记:麦肯锡7步成诗
  2. 【LeetCode】3月25日打卡-Day10
  3. JavWeb笔记:JavaScript总结
  4. redis集群的搭建详细教程
  5. 五大原则让你的代码不再受bug的困扰
  6. 关系数据库SQL之可编程性触发器
  7. Oracle函数大全1
  8. 数据库基础知识——MySQL服务的启动和停止
  9. 【剑指offer】面试题42:连续子数组的最大和(java)
  10. daz模型导入marvelous_传世工坊自制Daz Studio 4.10 系列入门教程