最近看到了Brett Beauregard发表的有关PID的系列文章,感觉对于理解PID算法很有帮助,于是将系列文章翻译过来!在自我提高的过程中,也希望对同道中人有所帮助。作者Brett Beauregard的原文网址:http://brettbeauregard.com/blog/2011/04/improving-the-beginner%E2%80%99s-pid-derivative-kick/

1、问题

这个修改将稍微调整微分项。其目标是消除一种被称为“微分冲击”的现象。

上图说明了问题。由于error = Setpoint-Input,设定值的任何变化都会导致偏差的瞬时变化。这种变化的导数是无穷大(实际上,由于dt不是0,它只是一个非常大的数字。)这个数字被输入PID方程,这导致输出中出现不希望的峰值。幸运的是,有一种简单的方法可以摆脱这种情况。

2、解决方案

事实证明,当设定值发生变化时,偏差的导数等于输入的负导数。这最终成为一个完美的解决方案。我们减去(Kd *输入的导数)而不是添加(Kd *偏差的导数)。这被称为使用“基于测量的微分”。

3、代码

/*working variables*/
unsigned long lastTime;
double Input,Output,Setpoint;
double errSum,lastInput;
double kp,ki,kd;
int SampleTime = 1000; //1 secvoidCompute()
{unsigned long now = millis();int timeChange = (now - lastTime);if(timeChange>=SampleTime){/*Compute all the working error variables*/double error = Setpoint - Input;errSum += error;double dInput = (Input - lastInput);/*Compute PID Output*/Output = kp * error + ki * errSum - kd * dInput;/*Remember some variables for next time*/lastInput = Input;lastTime = now;}
}
void SetTunings(double Kp,double Ki,double Kd)
{double SampleTimeInSec = ((double)SampleTime)/1000;kp = Kp;ki = Ki * SampleTimeInSec;kd = Kd / SampleTimeInSec;
}
void SetSampleTime(int NewSampleTime)
{if (NewSampleTime > 0){double ratio  = (double)NewSampleTime/ (double)SampleTime;ki *= ratio;kd /= ratio;SampleTime = (unsigned long)NewSampleTime;}
}

这里的修改非常简单。我们用-dInput替换+ dError。我们现在需要记住lastInput,而不是记住lastError

4、结果

以下是这些修改对我们的影响。请注意,输入看起来仍然相同。所以我们得到相同的性能,但是每次设定点改变时我们都不会发出巨大的输出尖峰。

这也许没什么大不了的。这完全取决于应用程序对输出峰值有多敏感。但在我看来,没有冲击就不需要做更多的工作,所以为什么不把事情做好呢?

欢迎关注:

改进初学者的PID-微分冲击相关推荐

  1. 改进初学者的PID-介绍

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

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

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

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

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

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

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

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

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

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

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

  7. 改进初学者的PID-初始化

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

  8. PID微分积分电路(转载)

    很多朋友觉得PID是遥不可及,很神秘,很高大上的一种控制,对其控制原理也很模糊,只知晓概念性的层面,知其然不知其所以然,那么本文从另类视角来探究微分.积分电路的本质,意在帮助理解PID的控制原理. ( ...

  9. 针对初学者的PID算法教程,以及趣味总结

    关注+星标公众号,不错过精彩内容 来源 | 技成培训 PID的数学模型 在工业应用中PID及其衍生算法是应用最广泛的算法之一,是当之无愧的万能算法,如果能够熟练掌握PID算法的设计与实现过程,对于一般 ...

最新文章

  1. mongoDB学习笔记(一)
  2. 数据库服务器 之 PostgreSQL数据库的日常维护工作
  3. Java并发编程-信号量
  4. phpstorm一个窗口打开多个项目
  5. P6378 [PA2010] Riddle(2-sat/前后缀优化建图)
  6. 【自动化】Python3+Selenium3自动化测试-准备工作
  7. 这个东西可以温暖你想打BUG的心......
  8. [js]js设计模式-构造函数模式
  9. 深入理解css中position属性及z-index属性
  10. 国内免费汉语语料库-NLP
  11. pytorch实现猫狗分类+数据集
  12. 【开源项目分享】使用select、多线程完成的多人联机对战五子棋小游戏(C语言实现)
  13. 计算机ip地址会变吗,电脑IP地址会变吗?
  14. 新型智慧城市投融资经验分享
  15. centos7密码正确登录失败
  16. 工作记录 01-02-2018 至 03-16-2018
  17. 海思HI3516 MIPI屏幕调试笔记
  18. amixer: Unable to find simple control 'Master',0
  19. 计算机汉字编码不能使用内码,汉字编码及区位码查询算法
  20. android程序开发笔记

热门文章

  1. 【LeetCode】3月21日打卡-Day6
  2. SSM:Maven整合ssm时的步骤
  3. Valid BFS? CodeForces - 1037D(思维 bfs)
  4. rsync 3.1.1源代码编译安装配置
  5. 分享三个非常适合新手的网站
  6. css在盒子中垂直居中和固定居中
  7. 【HTML5】Server-Sent服务器发送事件
  8. wp8.1 Study11:APP里文件读写和使用XML和Json序列化
  9. SQL经典语句(转载)
  10. [译]How to make searching faster