• 改进初学者的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控制器:

     1 /*working variables*/
     2 unsigned long lastTime;
     3 double Input,Output,Setpoint;
     4 double errSum,lastErr;
     5 double kp,ki,kd;
     6 void Compute()
     7 {
     8    /*How long since we last calculated*/
     9    unsigned long now = millis();
    10    double timeChange = (double)(now - lastTime);
    11  
    12    /*Compute all the working error variables*/
    13    double error = Setpoint - Input;
    14    errSum += (error * timeChange);
    15    double dErr = (error - lastErr) / timeChange;
    16  
    17    /*Compute PID Output*/
    18    Output = kp * error + ki * errSum + kd * dErr;
    19  
    20    /*Remember some variables for next time*/
    21    lastErr = error;
    22    lastTime = now;
    23 }
    24  
    25 void SetTunings(double Kp,double Ki,double Kd)
    26 {
    27    kp = Kp;
    28    ki = Ki;
    29    kd = Kd;
    30 }

      Compute()被定期或不定期地调用,并且它运行良好。不过,这样的PID并不是“非常好用”。如果我们要将此代码转换为与工业PID控制器相同的代码,我们将不得不解决以下问题:

      1、采样时间—如果以固定间隔评估PID算法,则该算法的运行效果最佳。如果算法知道这个间隔,我们也可以简化一些内部的数学计算。

      2、微分冲击—这虽然不是最重要的,但很容易处理,所以我们就先处理它。

      3、改变整定参数—一个好的PID算法是可以在不影响内部工作的情况下改变整定参数的算法。

      4、积分饱和—我们将讨论积分饱和,并实现一个很好的解决方案。

      5、开/关(自动/手动)—在大多数应用中,有时需要关闭PID控制器并手动调节输出,而不会影响控制器。

      6、初始化—当控制器第一次打开时,我们想要一个“无扰动切换”。也就是说,我们不希望输出突然变成一些新值。

      7、正反作用—最后一种方法,并且不改变系统的鲁棒性和名称。它旨在确保用户使用正确的符号输入调整参数。

      8、新:测量的比例—添加此功能可以更轻松地控制某些类型的过程。

      一旦我们解决了所有这些问题,我们就会拥有一个可靠的PID算法。我们还将获得Arduino PID库最新版本中使用的代码,这并非巧合。因此,无论您是尝试编写自己的算法,还是试图了解PID库中的内容,我希望这可以帮助您解决问题。让我们开始吧。

      更新:在所有代码示例中,我使用的是双精度。在Arduino上,double与float相同(单精度。)真双精度对于PID来说可能会成为累赘。如果您使用的语言确实是双精度,我建议将所有双精度更改为浮点数。

    欢迎关注:

  • 相关阅读:
    LETTers比赛第十二场解题报告
    LETTers练习赛第十场 第四题
    LETTers练习赛第十场 第二题
    LETTers练习赛第十场 第一题
    LETTers练习赛十一场解题报告
    RedHat Enterprise Linux 基本网络配置
    c# 连接MySQL中文乱码问题的解决方法
    [原]iBatis.Net(C#)系列一:简介及运行环境
    ArcGIS 9.3 sp1 下载更新
    [原]iBatis.Net(C#)系列二:SQL数据映射
  • 原文地址:https://www.cnblogs.com/foxclever/p/11108901.html
Copyright © 2020-2023  润新知