改进初学者的PID-介绍
最近看到了Brett Beauregard发表的有关PID的系列文章,感觉对于理解PID算法很有帮助,于是将系列文章翻译过来!在自我提高的过程中,也希望对同道中人有所帮助。作者Brett Beauregard的原文网址:http://brettbeauregard.com/blog/2011/04/improving-the-beginners-pid-introduction/
结合新的Arduino PID库的发布,我决定发布这一系列帖子。最后一个库虽然稳定,但并没有真正提供任何代码解释。这次计划的目的是详细解释为什么代码是这样的。我希望这对两类人有用:
- 直接对Arduino PID库中发生的事情感兴趣的人将得到详细的解释。
- 任何编写自己的PID算法的人都可以看看我是如何做的,并借鉴他们喜欢的东西。
这将是一个艰难的过程,但我认为我找到了解释我的代码的一个不太痛苦的方法。我将从我称之为“初学者的PID”开始。然后我将逐步改进它,直到我们留下一个高效,强大的pid算法。
初学者的PID
这是每个人第一次学习它时接触的PID方程式:
这导致几乎每个人都编写以下PID控制器:
/*working variables*/
unsigned long lastTime;
double Input,Output,Setpoint;
double errSum,lastErr;
double kp,ki,kd;
void Compute()
{
/*How long since we last calculated*/
unsigned long now = millis();
double timeChange = (double)(now - lastTime); /*Compute all the working error variables*/
double error = Setpoint - Input;
errSum += (error * timeChange);
double dErr = (error - lastErr) / timeChange; /*Compute PID Output*/
Output = kp * error + ki * errSum + kd * dErr; /*Remember some variables for next time*/
lastErr = error;
lastTime = now;
} void SetTunings(double Kp,double Ki,double Kd)
{
kp = Kp;
ki = Ki;
kd = Kd;
}
Compute()被定期或不定期地调用,并且它运行良好。不过,这样的PID并不是“非常好用”。如果我们要将此代码转换为与工业PID控制器相同的代码,我们将不得不解决以下问题:
1、采样时间—如果以固定间隔评估PID算法,则该算法的运行效果最佳。如果算法知道这个间隔,我们也可以简化一些内部的数学计算。
2、微分冲击—这虽然不是最重要的,但很容易处理,所以我们就先处理它。
3、改变整定参数—一个好的PID算法是可以在不影响内部工作的情况下改变整定参数的算法。
4、积分饱和—我们将讨论积分饱和,并实现一个很好的解决方案。
5、开/关(自动/手动)—在大多数应用中,有时需要关闭PID控制器并手动调节输出,而不会影响控制器。
6、初始化—当控制器第一次打开时,我们想要一个“无扰动切换”。也就是说,我们不希望输出突然变成一些新值。
7、正反作用—最后一种方法,并且不改变系统的鲁棒性和名称。它旨在确保用户使用正确的符号输入调整参数。
8、新:测量的比例—添加此功能可以更轻松地控制某些类型的过程。
一旦我们解决了所有这些问题,我们就会拥有一个可靠的PID算法。我们还将获得Arduino PID库最新版本中使用的代码,这并非巧合。因此,无论您是尝试编写自己的算法,还是试图了解PID库中的内容,我希望这可以帮助您解决问题。让我们开始吧。
更新:在所有代码示例中,我使用的是双精度。在Arduino上,double与float相同(单精度。)真双精度对于PID来说可能会成为累赘。如果您使用的语言确实是双精度,我建议将所有双精度更改为浮点数。
欢迎关注:
改进初学者的PID-介绍的更多相关文章
- 初学者SQL语句介绍
初学者SQL语句介绍 1.用 Select 子句检索记录 Select 子句是每一个检索数据的查询核心.它告诉数据库引擎返回什么字段. Select 子句的常见形式是: S ...
- 改进初学者的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 ...
- 改进初学者的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 ...
随机推荐
- sublime+python3 中文环境
工具-编译系统-新编译系统 { "cmd": ["C:/Program Files (x86)/Python36-32/python.exe","-u ...
- Oracle 日期型 将timestamp类型转换为date类型
Oracle将timestamp类型转换为date类型有三种方法 1.使用to_char先转为字符型,在使用to_date再转为日期型 select to_date(to_char(systimest ...
- Kubernetes 学习26 基于kubernetes的Paas概述
一.概述 1.通过以往的学习应该可以了解到k8s 和以往提到的devops概念更容易落地了.比如我们说的CI,CD,CD a.CI(Continuous Integration):持续集成 b.CD( ...
- Kubernetes 学习15 kubernetes 认证及serviceaccount
一.概述 1.通过此前描述可以知道k8s是以后运行我们生产环境中重要应用程序的尤其是无状态程序的一个非常重要的平台.这里面能托管一些核心应用以及核心数据,很显然对于k8s对应接口的访问不是任何人都可以 ...
- noip考点整理(应该不是很完整……)
部分来自百度百科.其他的博客 一.必须会的 1.暴力: DFS.BFS.灌水法搜索.回溯搜索.记忆化搜索.启发式搜索.最优性剪枝.可行性剪枝 2.贪心 3.模拟 4.骗分 二.基础算法 1.图论:SP ...
- codevs 4028 EZ系列
4028 EZ系列之愤怒的一天 题目描述 Description 有一天,在某某教学楼某某课室某某课桌旁,某某某大声尖叫起来. 在那一瞬间,勇敢的丁畅大大站了出来,向某某某讨好,结果被揍得半死. ...
- Python中多层List展平为一层
小书匠python 使用Python脚本的过程中,偶尔需要使用list多层转一层,又总是忘记怎么写搜索关键词,所以总是找了很久,现在把各种方法记录下来,方便自己也方便大家. 方法很多,现在就简单写8种 ...
- 浅谈python闭包及装饰器
1. 什么是闭包: 闭包 是指有权访问另一个函数作用域中变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量,利用闭包可以突破作用链域,将函数内部的变 ...
- Java设计模式之二工厂模式
在上一篇中我们学习了单例模式,介绍了单例模式创建的几种方法以及最优的方法.本篇则介绍设计模式中的工厂模式,主要分为简单工厂模式.工厂方法和抽象工厂模式. 简单工厂模式 简单工厂模式是属于创建型模式,又 ...
- lol英雄时刻
2019.5.30 翻出了当年人生中第一次LOL五杀截图...我用佐伊拿五杀了! 第一次五杀超激动的