原文地址:http://brettbeauregard.com/blog/2011/04/improving-the-beginner%e2%80%99s-pid-tuning-changes/
问题The Problem
在系统运行时调参是一个优秀PID算法必须具备的。
最初的PID当你在系统运行时调整时显得有点懒惰。让我们看看这是什么原因。这里是最初的PID调整前后的状态:
因此我们立即认为这个问题出在积分项(或者I项)。唯一的参数变化引起急剧变化。为什会这样?这不得不解释初步的积分:
这个公式正常工作知道Ki改变。突然的,你新的Ki被乘以错误之和的累积。这不是我们想要的!我们只想把事情向前推进。
解决方案The Solution
我知道几种方法来解决这个问题。在最后的库里面我用的方法是从新调整误差和errSum。双倍Ki?errSum减半。这样避免了I项的跳动,并且工作良好。这个看起来有点粗糙,我想出一些更好的办法。
解决方案需要一些基础代数
和让Ki外部积分相反,我们把它放进去。看上去我们没做什么,但是我们将看到实际情况是有很大不同的。
现在误差乘以Ki。我们保存乘积的和。当Ki变化是,这里不会有抖动,因为旧的Ki已经保存了。我们得到一个平滑的过渡而不用一个附加的数学操作。这让我成为一个极客,但我认为这很性感。
The Code
/*working variables*/ unsigned long lastTime; double Input, Output, Setpoint; double ITerm, 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; ITerm += (ki * error); double dInput = (Input - lastInput); /*Compute PID Output*/ Output = kp * error + ITerm - 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
那么这是如何解决问题的呢。在ki改变之前,重新调整了整个误差和;每个误差值我们都已经看到。这段代码中,前面的误差保持不变,只有新的Ki会影响变化,这正是我们想要的。
相关推荐
《单片机C语言程序设计实训100例——基于8051+Proteus仿真》是一个针对初学者和进阶者全面了解单片机编程的实践教程。本资源包含一系列基于8051系列单片机的C语言编程实例,通过与Proteus仿真软件的结合,为学习者...
### PID学习资料知识点详解 #### 一、自动调节系统的发展历程 ...以上是关于PID学习资料的一些关键知识点总结,希望通过这些内容能够帮助初学者更好地理解和掌握PID控制的基本原理及其在实际应用中的运用。
单片机C语言程序设计实训100例——基于8051+Proteus仿真是一个非常实用的学习资源,旨在帮助初学者和进阶者深入理解8051单片机的C语言编程和仿真过程。8051单片机是微控制器领域中的经典型号,广泛应用于各种嵌入式...
MATLAB是一种广泛应用于科学...总结,MATLAB语言工具箱——TOOLBOX是解决复杂问题的强大武器,无论是初学者还是资深用户,都能从中找到适合自己需求的功能。掌握TOOLBOX的使用,无疑将极大地提升科研和工程工作的效率。
【基于西门子PLC例程---缩微机】是一个非常适合初学者和进阶学习者探索的项目,它涵盖了工业自动化领域中的核心控制技术——西门子PLC(可编程逻辑控制器)的应用。PLC是现代工业自动化系统的核心组件,用于处理逻辑...
PID控制器是自动控制理论中的一个重要工具,用于精确地调整系统参数。在这个实验中,读者将学习如何应用PID算法来控制电机速度,确保小车直线行驶。 5. **2011给力板!Arduino duemilanove2009 Atmega328P开发板轼...
这部分源码主要关注PID(比例-积分-微分)控制器的实现,这是大多数控制系统的基础,通过调节PID参数来达到稳定控制。 接下来,DMP(数字微镜处理器)是InvenSense公司的一种专有技术,常用于处理惯性测量单元(IMU...
3. "MATLAB 学习指导教程":这可能是一本全面的MATLAB入门教程,包含基本语法、函数使用、编程实践等内容,适合初学者。 4. 《Matlab 宝典》:这通常是一本综合性的MATLAB参考书,可能包含了MATLAB的各个方面,包括...
2. **接线指南**:对于初学者来说,正确连接PLC与外部设备至关重要。手册将提供详细的接线图和接线步骤,指导用户正确安装和配置硬件。 3. **指令系统**:永宏PLC支持一套完整的指令集,包括基本逻辑运算、定时/...
《TrueTime1.5用户手册》是一份详尽...总之,《TrueTime1.5用户手册》是一本全面、细致、实用的指南,不仅适合初学者快速入门,也为进阶用户提供深度解析和高级应用技巧,是学习和掌握TrueTime1.5不可或缺的重要资源。
本资料大全涵盖了Arduino开发板的各个方面,包括硬件结构、编程环境、开发流程以及常见应用实例,旨在为初学者提供全面的学习资源,同时也为有经验的开发者提供参考。 1. **Arduino硬件基础** Arduino开发板的核心...
这篇学习笔记主要关注的是在嵌入式领域中初学者应该掌握的基础知识,尤其是与Linux环境和C语言相关的技能。 首先,从Linux环境和命令开始。Linux是嵌入式系统常用的操作系统,常见的发行版有Debian、Ubuntu和Redhat...
"经验.txt" 文件可能是作者在制作智能小车过程中积累的心得体会,可能包含了一些常见问题的解决方法、调试技巧以及优化建议,对于初学者来说,这些实战经验尤为宝贵。 智能小车的构建通常会涉及以下知识点: 1. ...
5. **学习路径**:对于初学者,可以先从基础的输入/输出控制开始,理解如何通过梯形图编程实现设备的开关控制。然后逐渐深入到模拟量处理,学习如何处理连续变化的信号。最后,可以尝试进行网络通信实验,了解如何...
### 理解Linux进程——关键知识点概览 #### 一、引言 《理解Linux进程》是一本专为Linux程序员编写的书籍,旨在通过深入浅出的方式介绍...无论是对于初学者还是有一定经验的开发者来说,都是一本非常有价值的参考书。
本教程——“清华版LabVIEW教程”是针对初学者设计的一套详尽的学习资料,旨在帮助学习者快速掌握LabVIEW的基础知识和实际应用技巧。 一、LabVIEW基础知识 1. 图形化编程:LabVIEW的核心特性是其G语言(Graphical ...