最近看到了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;
建议是这样的:spa
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秒。可是为了确保我没有遗漏任何东西,我决定再作一次测试。我没有改变设定值,而是在系统中引入了负载变化。code
一样,现有的 PID 代码性能更好,处理负载变化更快。blog
那么判决呢?虽然这是一个有趣的锻炼,但我认为结果很清楚。我会保持原来的代码。进程
欢迎关注:get