存在的问题
本次调整的目的是消除称为“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 的变化不会输出巨大的峰值。
这或许是也或许不是一个大问题。这取决于你的程序对于输出峰值的敏感度。
相关推荐
本合集旨在为初学者提供全面的LabVIEW学习资源,同时也包含了帮助进阶用户提升技能的高级技巧。 一、LabVIEW基础入门 LabVIEW的基础在于其独特的图标化编程方式,称为G(Graphical Programming)。用户通过拖拽函数...
本压缩包资源集合了PID控制理论的深入讲解、实践例程以及参数整定方法,适合于初学者和进阶者学习。 首先,PID算法的核心是通过比例(P)、积分(I)和微分(D)三个部分的结合来调整系统的响应。比例项直接影响...
通过博途,用户可以创建虚拟的输入/输出设备,并观察PID控制器对系统行为的影响,这特别适合初学者进行学习和实践。 4. **波形分析**:在博途中,PID仿真的一个重要方面是波形显示。用户可以查看输入信号、输出信号...
本教程将从入门到精通,深入讲解PID的工作原理、设计方法以及参数整定,帮助初学者全面掌握这一核心控制技术。 1. PID基本原理: PID控制器通过结合比例(P)、积分(I)和微分(D)三个部分来调整系统的输出,以...
【适用人群】:适用于希望学习不同技术领域的初学者或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础...
《PLC编程入门视频教程-PLC进阶三十六式》是一套全面介绍可编程逻辑控制器(PLC)编程技术的教程,旨在帮助初学者快速掌握PLC的基础知识和高级应用技巧。PLC是工业自动化领域中不可或缺的设备,用于控制自动化系统的...
7. 教程文档:详细解释每个概念和技术,适合初学者入门和进阶学习。 通过学习这个资料包,你可以了解PID算法的基本原理,掌握其在智能小车控制系统中的应用,以及如何通过调试参数来改善系统的稳定性、响应速度和...
通过这个汇总,无论是初学者还是有一定经验的工程师,都可以系统地学习和掌握PID算法在实际项目中的应用,提升飞思卡尔智能车的控制性能。同时,这些知识也可以广泛应用于机器人、无人机、自动化生产线等众多领域,...
本压缩包“51单片机初学者入门例程”为初学者提供了一个丰富的学习平台,通过一系列逐步进阶的例程,帮助学习者掌握51单片机的基本操作和应用。 在学习51单片机的过程中,首先要了解其基本结构。51单片机主要由CPU...
PID控制器是一种广泛应用在自动化控制领域的算法,其全称为比例-积分-微分控制器。这个控制器通过结合比例(P)、积分(I)和微分(D)三个部分的输出来调整...无论是初学者还是经验丰富的工程师,都能从中受益匪浅。
STM32平衡小车项目是一个基于STM32微控制器的嵌入式系统开发实例,它主要...无论你是初学者还是进阶者,这个项目都将为你提供宝贵的学习经验。在实践中,不断尝试、调试和优化,将有助于你成为更加熟练的嵌入式开发者。
通过这20个STM32项目,初学者可以从基础到进阶,全面掌握STM32微控制器的使用,为后续更复杂的嵌入式系统开发打下坚实基础。在实践中学习,不断积累经验,将理论知识转化为实际操作能力,是成为一名优秀的STM32...
### PID学习资料知识点详解 #### 一、自动调节系统的发展历程 ...以上是关于PID学习资料的一些关键知识点总结,希望通过这些内容能够帮助初学者更好地理解和掌握PID控制的基本原理及其在实际应用中的运用。
接着详细介绍了三个版本的模型:初学者版本(创建基本传递函数模型)、可修改版本(增益调整的传递函数模型)以及进阶版本(PID 控制器与反馈系统模型)。每个版本都附有具体的步骤指导、组件说明和代码示例,帮助...
【基于AT89C51单片机的水温控制系统】是一种常见的电子工程设计,尤其适合初学者和进阶学习者进行毕业设计、课程设计、大作业或工程实训。AT89C51是一款广泛应用的8位微控制器,由美国Atmel公司生产,其在嵌入式系统...
初学者应熟悉这些窗口的功能,学会如何输入命令、查看变量和运行脚本。 2. **基本数据类型**:Matlab支持数值型、字符型、逻辑型等多种数据类型。理解这些数据类型的特点,如向量、矩阵的创建和操作,是学习Matlab...
对于初学者和进阶者,这个压缩包提供了一整套的学习资料和实际操作素材。初学者可以从基础的机械设计和电子基础知识开始,逐步掌握硬件接口和控制原理。进阶者则可以通过源码分析,深入理解AI算法在实际项目中的应用...
《单片机C语言程序设计实训100例——基于8051+Proteus仿真》是一个针对初学者和进阶者全面了解单片机编程的实践教程。本资源包含一系列基于8051系列单片机的C语言编程实例,通过与Proteus仿真软件的结合,为学习者...
6. **51黑论坛**:51黑论坛是一个聚集了众多电子爱好者和技术人员的在线社区,他们分享项目、教程和资源,对于初学者和进阶者都是很好的学习平台。 7. **学习资源**:对于想要深入了解STM32平衡车项目的人来说,...
单片机C语言程序设计实训100例基于8051+Proteus仿真是一个专注于8051单片机编程学习的资源集合,它涵盖了从基础到进阶的多个实践项目,旨在帮助初学者和进阶者提升单片机应用能力。8051单片机是微控制器领域广泛应用...