改进初学者的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来说可能会成为累赘。如果您使用的语言确实是双精度,我建议将所有双精度更改为浮点数。

欢迎关注:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/499405.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

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

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

改进初学者的PID-微分冲击

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

LwIP应用开发笔记之一:LwIP无操作系统基本移植

现在,TCP/IP协议的应用无处不在。随着物联网的火爆,嵌入式领域使用TCP/IP协议进行通讯也越来越广泛。在我们的相关产品中,也都有应用,所以我们结合应用实际对相关应用作相应的总结。 1、技术准备 我们采用的开发平台是STM32F407…

改进初学者的PID-修改整定参数

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

改进初学者的PID-积分饱和

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

改进初学者的PID-手自动切换

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

改进初学者的PID-初始化

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

如何优化代码和RAM大小

如果供应商为我自己的项目提供了一个起点,那就太好了。工作blinky始终是一个伟大的首发。方便总是有代价,而且“blinky”就是夸大“切换GPIO引脚”的代码大小。对于具有少量RAM和FLASH的设备,这可能会引起关注:如果blinky占用那么…

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

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

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

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

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

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

PID:我应该何时计算积分项?

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

Arduino PID自整定库

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

LwIP应用开发笔记之二:LwIP无操作系统UDP服务器

前面我们已经完成了LwIP协议栈基于逻辑的基本移植,在这一节我们将以RAW API来实现UDP服务器。 1、UDP协议简述 UDP协议全称是用户数据报协议,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。在OSI模型中,处于传输层…

LwIP应用开发笔记之三:LwIP无操作系统UDP客户端

前一节我们实现了基于RAW API的UDP服务器,在接下来,我们进一步利用RAW API实现UDP客户端。 1、UDP协议简述 UDP协议全称是用户数据报协议,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。在OSI模型中,处…

LwIP应用开发笔记之四:LwIP无操作系统TFTP服务器

前面我们已经实现了UDP的回环客户端和回环服务器的简单应用,接下来我们实现一个基于UDP的简单文件传输协议TFTP。 1、TFTP协议简介 TFTP是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务。端…

LwIP应用开发笔记之五:LwIP无操作系统TCP服务器

前面我们实现了UDP服务器及客户端以及基于其上的TFTP应用服务器。接下来我们将实现同样广泛应用的TCP协议各类应用。 1、TCP简述 TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由…

LwIP应用开发笔记之六:LwIP无操作系统TCP客户端

上一篇我们基于LwIP协议栈的RAW API实现了一个TCP服务器的简单应用,接下来一节我们来实现一个TCP客户端的简单应用。 1、TCP简述 TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议&a…

LwIP应用开发笔记之七:LwIP无操作系统HTTP服务器

前面我们实现了TCP服务器和客户端的简单应用,接下来我们实现一个基于TCP协议的应用协议,那就是HTTP超文本传输协议。 1、HTTP协议简介 超文本传输协议(Hyper Text Transfer Protocol),简称HTTP,是一种基于…

LwIP应用开发笔记之八:LwIP无操作系统HTTP客户端

前面我们实现了TCP服务器和客户端的简单应用,接下来我们实现一个基于TCP协议的应用协议,那就是HTTP超文本传输协议 1、HTTP协议简介 超文本传输协议(Hyper Text Transfer Protocol),简称HTTP,是一种基于T…