zoukankan      html  css  js  c++  java
  • PID:我应该何时计算积分项?

      最近看到了Brett Beauregard发表的有关PID的系列文章,感觉对于理解PID算法很有帮助,于是将系列文章翻译过来!在自我提高的过程中,也希望对同道中人有所帮助。作者Brett Beauregard的原文网址:http://brettbeauregard.com/blog/2011/07/pid-when-should-i-compute-the-integral-term/

      最近有一个建议张贴到初学者的PID系列。争议的焦点是,如果您解决拉普拉斯域中的问题,它指定了执行积分项的不同方式。评论人士建议,与其看某一点的误差总和,不如看最后一个点的总和。

      因此,当前的代码是这样的:

     1 /*Compute all the working error variables*/
     2 double input = *myInput;
     3 double error = *mySetpoint - input;
     4 ITerm+= (ki * error);
     5 if(ITerm > outMax) ITerm= outMax;
     6 else if(ITerm < outMin) ITerm= outMin;
     7 double dInput = (input - lastInput);
     8  
     9 /*Compute PID Output*/
    10 double output = kp * error + ITerm- kd * dInput;

      建议是这样的:

     1 /*Compute all the working error variables*/
     2 double input = *myInput;
     3 double error = *mySetpoint - input;
     4  
     5 double dInput = (input - lastInput);
     6  
     7 /*Compute PID Output*/
     8 double output = kp * error + ITerm- kd * dInput;
     9  
    10 ITerm+= (ki * error);
    11 if(ITerm > outMax) ITerm= outMax;
    12 else if(ITerm < outMin) ITerm= outMin;

      我从未见过这样做,但我想我应该试一试。我设计的测试是一个简单的设定值阶跃,然后是一个斜坡下降。

     

      当控制器设置为默认的采样时间时,差异是无法察觉的。为了突出这两种方法之间的差异,我决定将PID采样时间从默认值100mS提高到5秒。

     

      这里我们可以看到一个明显的赢家。现有的PID代码的性能比建议的要好,这可能是因为积分项对进程更改的响应要早5秒。但是为了确保我没有遗漏任何东西,我决定再做一次测试。我没有改变设定值,而是在系统中引入了负载变化。

     

      同样,现有的 PID 代码性能更好,处理负载变化更快。

      那么判决呢?虽然这是一个有趣的锻炼,但我认为结果很清楚。我会保持原来的代码。

    欢迎关注:

  • 相关阅读:
    MST(prim)+树形dp-hdu-4756-Install Air Conditioning
    Java常用排序算法+程序员必须掌握的8大排序算法
    高可用可伸缩架构实用经验谈
    MYSQL索引失效的各种情形总结
    MySQL使用索引的场景及真正利用索引的SQL类型
    MySQL数据库索引的4大类型以及相关的索引创建
    JVM调优浅谈
    dubbo作为消费者注册过程分析--????
    webservice 协议
    你应该知道的 RPC 原理
  • 原文地址:https://www.cnblogs.com/foxclever/p/11664704.html
Copyright © 2011-2022 走看看