改进初学者的PID-修改整定参数
最近看到了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-修改整定参数的更多相关文章
- 改进初学者的PID-介绍
最近看到了Brett Beauregard发表的有关PID的系列文章,感觉对于理解PID算法很有帮助,于是将系列文章翻译过来!在自我提高的过程中,也希望对同道中人有所帮助.作者Brett Beaure ...
- 改进初学者的PID-测量的比例编码
最近看到了Brett Beauregard发表的有关PID的系列文章,感觉对于理解PID算法很有帮助,于是将系列文章翻译过来!在自我提高的过程中,也希望对同道中人有所帮助.作者Brett Beaure ...
- 【技术】Arduino PID自整定库
最近看到了Brett Beauregard发表的有关PID的系列文章,感觉对于理解PID算法很有帮助,于是将系列文章翻译过来!在自我提高的过程中,也希望对同道中人有所帮助.作者Brett Beaure ...
- 改进初学者的PID-测量的比例介绍
最近看到了Brett Beauregard发表的有关PID的系列文章,感觉对于理解PID算法很有帮助,于是将系列文章翻译过来!在自我提高的过程中,也希望对同道中人有所帮助.作者Brett Beaure ...
- 改进初学者的PID-正反作用
最近看到了Brett Beauregard发表的有关PID的系列文章,感觉对于理解PID算法很有帮助,于是将系列文章翻译过来!在自我提高的过程中,也希望对同道中人有所帮助.作者Brett Beaure ...
- 改进初学者的PID-采样时间
最近看到了Brett Beauregard发表的有关PID的系列文章,感觉对于理解PID算法很有帮助,于是将系列文章翻译过来!在自我提高的过程中,也希望对同道中人有所帮助.作者Brett Beaure ...
- mac 修改系统配置参数 主机名 等
mac 修改系统配置参数,可以使用 命令 scutil 参考网址: https://developer.apple.com/library/mac/documentation/Darwin/Refer ...
- uboot启动阶段修改启动参数方法及分析
作者:围补 本来启动方式这节不是什么复杂的事儿,不过想简单的说清楚明白,还真是不知道怎么组织.毕竟文字跟有声语言表达有别.但愿简单的东西别让我讲的太复杂! Arm板系统文件一般有三个——bootloa ...
- 测试修改gcs_server_processes参数
RAC部署前提是要求各节点的主机硬件一致的,但实际如果碰上一些不规范的客户,经费有限或是扩容时已买不到同样的机器,那么采购的机器会有一些区别,比如RAC各节点的CPU核数有区别,那么默认的gcs_se ...
随机推荐
- Idea导入maven项目
1.idea中有项目的关闭项目 File>>close project 回到截图 下一步>下一步
- 2019/8/20 Test
题目 简述 做法 \(BSOJ2237\) 求\(\displaystyle{k\in G:\sum_{i\in G\vee j\in G}\frac{C^k_{i,j}}{C_{i,j}}}\),其 ...
- (二)IDEA使用,快捷键
idea的快捷键设置: idea支持使用其他开发工具的快捷键,可以在此设置: idea 默认的本身的快捷键: 常用快捷键 Ctrl + Alt + s 打开设置选项 Alt + Enter 修复提示 ...
- TPC-H 测试参考
https://github.com/digoal/pg_tpch ---明天以此为准 https://www.jianshu.com/p/83e670cf3ffb https://yq.aliyu ...
- C# 可为空?及(??、?. )
可空类型修饰符(?): 引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空. 例如:string str=null; 是正确的,int i=null; 编译器就会报错. 为了使值类型也 ...
- C# 中文序列按笔画排序
问题:给定一串含中文的序列,按首字符的笔画数排序 因为默认是按拼音来排序的, 借助Globalization命名空间,包含定义区域性相关信息的类,这些信息包括语言,国家/地区,正在使用的日历,日期.货 ...
- cube.js 学习(四)cube.js cube 说明
cube 是cube.js data schema 的核心,里面定义了生成sql 的说明 一个比较全的schema 例子 cube(`Users`, { sql: `select * from u ...
- web场景的监控
在一台可以连外网的主机上创建web场景, 添加步骤,zabbix可以步骤化web页面,例如,登陆操作,正常操作是要先验证用户获取token,step1就可以是先访问token页面,获取到返回的toke ...
- C位运算符的使用
#include <stdio.h> int main(void) { //位运算符 & | ^ ~ printf("8|2=%d\n",8|2);// 10 ...
- Day11:Flex布局
参考: 来源:http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html 网页布局是css的一个重点. 盒子模型 display属性 positi ...