最近看到了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 = ; //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)/;
kp = Kp;
ki = Ki * SampleTimeInSec;
kd = Kd / SampleTimeInSec;
} void SetSampleTime(int NewSampleTime)
{
if (NewSampleTime > )
{
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-介绍

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

  2. 改进初学者的PID-测量的比例编码

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

  3. 【技术】Arduino PID自整定库

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

  4. 改进初学者的PID-测量的比例介绍

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

  5. 改进初学者的PID-正反作用

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

  6. 改进初学者的PID-采样时间

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

  7. mac 修改系统配置参数 主机名 等

    mac 修改系统配置参数,可以使用 命令 scutil 参考网址: https://developer.apple.com/library/mac/documentation/Darwin/Refer ...

  8. uboot启动阶段修改启动参数方法及分析

    作者:围补 本来启动方式这节不是什么复杂的事儿,不过想简单的说清楚明白,还真是不知道怎么组织.毕竟文字跟有声语言表达有别.但愿简单的东西别让我讲的太复杂! Arm板系统文件一般有三个——bootloa ...

  9. 测试修改gcs_server_processes参数

    RAC部署前提是要求各节点的主机硬件一致的,但实际如果碰上一些不规范的客户,经费有限或是扩容时已买不到同样的机器,那么采购的机器会有一些区别,比如RAC各节点的CPU核数有区别,那么默认的gcs_se ...

随机推荐

  1. 关闭win10 任务栏窗口预览的步骤:

    win10虽好,但是总有不利于使用的反人类设计,好在可以设置,这也是比较好了的, 作为开发人员,经常会开好几个窗口,但是win10的预览很不好,设计的就是娱乐用途一般,因此必须是把他关了 一下步骤亲自 ...

  2. 洛谷 P1955 [NOI2015]程序自动分析 题解

    每日一题 day22 打卡 Analysis 离散化+并查集 先离散化所有的约束条件,再处理所有e=1的条件,将i的祖先和j的祖先合并到一个集合中:e=0时,如果i的祖先与j的祖先在同一个集合中,说明 ...

  3. 汇编语言笔记 CALL和RET指令

    转载地址:http://www.cnblogs.com/dennisOne ☞模块化程序设计 模块化程序设计 汇编语言通过call和ret指令实现了模块化程序设计.可以实现多个相互联系.功能独立的子程 ...

  4. printf的使用

    #!/bin/bashprintf "|------------------------------------\n"printf "this is printf str ...

  5. ArcGIS分支版本化( Branch Versioning )技术介绍

    概述 分支版本化技术是有别于传统的SDE版本化技术,它用于支持WebGIS模式下的多用户长事务编辑. 优势功能 使用分支版本化技术将获得以下功能 1. 支持长事务的编辑. 2. 支持Undo和Redo ...

  6. Pytest权威教程17-安装和使用插件

    目录 安装和使用插件 在测试模块或conftest文件中要求/加载插件 找出哪些插件是可用的 按名称取消/取消注册插件 返回: Pytest权威教程 安装和使用插件 本节讨论如何安装和使用第三方插件. ...

  7. 解释下Http请求头和常见响应状态码

    Accept-Charset:指出浏览器可以接受的字符编码.英文浏览器的默认值是ISO-8859-1.ccept:指浏览器或其他客户可以接爱的MIME文件格式.可以根据它判断并返回适当的文件格式. A ...

  8. sturts标签中

    struts中的s标签中textfield和textarea中不需要加上value和中间值,通过name可以直接取到. textfield和textarea标签没有value属性,需要加上${ylqx ...

  9. 小程序中嵌套的h5页面设置分享转发

    场景描述:当在小程序中打开h5页面时,希望小程序的转发出去的标题,图片,跳转link可以通过h5通信实现自定义. 实现方式:通过h5给小程序通信,发送标题,图片,跳转link等信息,让小程序设置分享. ...

  10. Mybatis传参- 被逗号分割的字符串

    String ids = "1,2,3,4,5,6",如ids作为参数传递,查询list返回.mybatis用foreach处理并返回. SELECT * FROM yp_popu ...