存在的问题
本次调整的目的是消除称为“Derivative Kick”的现象。
上图反应了这个问题。既然 error=Setpoint-Input, 任何 Setpoint 的变化将导致error瞬时发生变化。 这种变化的导数是无穷大(实际上,既然dt不是0,只是计算为一个非常大的数字)。这个数字被送入pid方程,输出一个非期望的峰值。幸运的是有一个简单的方法来摆脱这个。
解决方案
导数误差等于负导数的输入,除非当Setpoint 改变。这不是一个完美的解决方案,相对于添加(Kd *误差导数),我们减去(Kd *输入的导数)。这被称为使用“导数测量”。
The Code
/*working variables*/ unsigned long lastTime; double Input, Output, Setpoint; double errSum, lastInput; double kp, ki, kd; int SampleTime = 1000; //1 sec void Compute() { 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); /*技术PID输出,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; } }
这里的修改非常容易。我们替换误差导数和输入导数。记住最后输入而不是最后误差。
The Result
这里就是修改后的结果,注意,输入看起来仍然相同。所以我们得到同样的性能,但每次Setpoint 的变化不会输出巨大的峰值。
这或许是也或许不是一个大问题。这取决于你的程序对于输出峰值的敏感度。
相关推荐
xml初学进阶xml初学进阶xml初学进阶
XML初学者进阶,适合初学者.
汉化初学者进阶教程-4.rar 汉化初学者进阶教程-4.rar 汉化初学者进阶教程-4.rar
资源包内容详实,覆盖了Nginx的各种应用场景和实践技巧,适合初学者和进阶者使用。 在本资源包中,您将获得以下收益: - 安装Nginx:通过本资源包提供的详细步骤,您可以轻松完成Nginx的安装和配置,无需繁琐的操作...
python基础知识章节大纲,有结构性的学习思维,事半功倍! 本PDF 严格按照《python 编程初学者指南》人民邮电出版社2014年11月第一版知识体系,做出的学习笔记,主要用来供自己学习和复习之用。
xml初学者进阶 初学xml的工具书 风趣幽默的语言风格,通俗易懂
模仿 天猫,亚马逊,加入了localStorage应用,融入了图片闪光、楼层、返回顶部、css3动画、对象写法、轮播图等效果,非常适合初学者或者初学进阶者学习。本源码所有内容仅供学习,不负任何法律责任。对于二次传播者...
资源关于计算机图像分类的经典论文,包括经典的计算机图像分类的论文,LeNet、AlexNet、GoogLeNet、NIN、VGG、ResNet、从数学的角度理解卷积&卷积神经网络、关于深层神经网络vs浅层神经网络的研究、卷积神经网络的...
JAVA技术入门后框架学习,适合初学者到进阶联系。数据库Mysql,项目导入MyEclipse后直接运行,数据库在项目中
初入Android开发殿堂的,不看后悔,本人从事Android开发,资源较多,不方便发送,如果有希望交流留言练习,呵呵
Java 初学者进阶项目,角色权限管理系统
Radmin3.2View汉化初学者进阶教程-4
本篇文章针对的对象是汉化爱好者中的初学者
初学者进阶必须学会的东东,书上介绍的不够详细,我来转一个。
对oracle初学者和有一定oracle基础的人,是你们进阶的好帮手
46例源代码包含串口、socket、计时器、各种控件等的使用用例 。适合半初学者进阶
XML 初学进阶XML 初学进阶
来自对岸台湾的一本LINUX基础学习建议,还不错。
XML初学进阶---XML初学者的福音,强烈推荐!
xml初学进阶.chm xml初学进阶.chm xml初学进阶.chm xml初学进阶.chm xml初学进阶.chm