我们将探索P, I和D增益如何影响系统性能,在这个过程中,我们将找到一个对我们的温度控制器工作良好的增益配置。
支持信息
- 本项目使用定制设计的PCB;请参考自定义PCB设计与EFM8微控制器参阅有关将EFM8设备集成到自定义硬件中的指导。
- 您可以找到热电偶的简要概述,以及关于MAX31855 in的一些一般信息制作一个基于efm8的热电偶测量分析监控系统.
- 控制系统概论:用MATLAB的SISO工具设计PID控制器
- 负面反馈,第1部分:一般结构和基本概念
- 这篇文章介绍了Scilab。
- 之前的两篇文章提供了将USB通信纳入EFM8项目的信息:通过USB与EFM8单片机通信和EFM8声音合成器:通过USB播放旋律.
本系列以前的文章
在我们开始之前,这里是之前展示的PID控制系统图:
这里是示意图中与pid相关的部分:
GUI升级
在本文中,我们的目标是对比例增益、积分增益和微分增益如何影响PID控制系统的性能有一个坚实的概念理解。如果我们有一个方便的方法来改变增益值,这将会容易得多。因此,我们需要在GUI中添加一些新功能:
如您所见,我们现在有用于P、I和D增益的文本输入框。这些值发送到EFM8的方式与设定值相同,即通过USB命令传输在每次控制运行的开始(“控制运行”开始时,你点击“激活PID控制”,结束时,你点击“停止PID控制”;显示测量温度和设定值线的图在新的控制运行开始时被清除)。增益值限制为0到255之间的整数。让我们快速看一下Scilab脚本中与这个新功能相关的两个部分。在这里,我们将文本输入框中的数字转换为可以发送到EFM8的纯二进制数字(而不是ASCII字符):
这就是我们将增益值发送到EFM8的方式。以前,我们这里只有两个传输——一个“S”命令发送设定值和一个“C”命令启动控制运行。现在我们有第三个,即“K”命令,用于发送所有三个增益值。
下面是下载新的GUI脚本的链接:
PID_Temperature_Control_GUI_v2.zip
固件升级
当然,如果EFM8固件不知道如何使用“K”命令,那么这个新的GUI特性将毫无用处,因此让我们简要地看看固件更改。首先,我们需要转换K_proportional,K_integral,K_derivative从main()函数中定义的局部变量到main()和VCPXpress_API_CALLBACK()都可用的全局变量。为此,我们在任何函数的外部定义变量,然后在Project_DefsVarsFuncs.h文件中将它们声明为“extern”。现在我们可以添加一些代码来处理“K”命令:
这里有一个链接,可以下载此阶段使用的固件的所有源文件和项目文件。
PIDTemperatureControl_Part5.zip
从P
为了将PID代码转换为实际控制变量的代码,您需要为P增益找到一个合理的值。这并不像人们想象的那样简单,因为在低电平、特定于应用程序的PID系统(例如我们的温度控制器)的上下文中,增益值实际上是翻译数字信息。我的意思是:我们的系统有两个独立的数字域—温度(摄氏度)和数字计数(依次对应DAC电压,DAC电压对应加热器驱动电流,后者对应电阻产生的热量)。这两个领域使用不同的语言;我们需要做的是设置比例增益这样它就可以从一个数值域转换到另一个数值域。
只要考虑一下系统是如何运行的,你就可以很好地完成这项工作:我们从MAX31855读取一个温度值,并计算误差。这个误差决定了电阻器产生的热量。我们在DAC值为200时获得最大热量(系统支持DAC值高达255,但我选择了200作为上限)。当误差很大时,即测量温度远离设定值时,我们需要最大热量。然而,在某一点上,当测量的温度接近设定值时,热输出应该开始减少。在这里,您只需选择一个有意义的值,然后运行几个控件后,您可以根据需要调整它。假设我们想要加热器保持在最大值,直到测量温度在设定值的5°C以内:200/5 = 40。所以我们开始时的收益比例是40。
请记住,PID控制输出是DAC值,并计算PID输出,我们将比例增益乘以“误差”,这意味着设定点温度减去测量的温度。因此,只要误差大于或等于5°C,加热器就会最大。当测量的温度接近设定值时,加热器驱动电流与误差 - 在4℃下比例成比例,DAC值为160,在3°C时,DAC值为120,等等。这是您的起点,如果需要,您可以根据系统的实际性能调整比例增益。一旦您对比例增益感到满意,您可以继续转移到积分和衍生增益。
p only系统
你真的需要积分和微分增益吗?这取决于您的操作需求(以及系统的特征)。让我们看一下带有K的P-only系统的控制运行P= 40。
正如预期的那样,系统存在显著的稳态误差。当误差很小时,P增益不足以抵消电阻向环境温度冷却的自然趋势。我们能简单地通过增加比例增益来解决这个问题吗?这里有四次P-only控制KP= 70, 100, 150, 200。
仔细思考一下这些图,我想你就会开始理解只使用p的系统的弱点。如果增益太低,就会有很大的稳态误差。当增益变得更高时,你只需用振荡来交换稳态误差。到K的时候P= 200时,输出几乎集中在设定值周围,换句话说,平均稳态误差非常小,但我们有相当显著的振幅持续振荡。如果你对这次演出满意,我想你可以停在这里。但我并不满意。
引入积分
积分项允许小的误差逐渐累积,从而对PID输出产生比仅在p系统中更大的影响。你必须小心,因为积分错误可以快速积累,和太多的积分增益系统开始像pendulum-error建立以下选点和驱动温度过高,然后上面错误构建选点和驱动器温度过低,然后错误在设定值以下建立,并导致错误过高,以此类推。
我们从K开始我= 10,看看会发生什么。
显然,这个值太高了,因为我们有主要的钟摆行为。(我们知道振荡是由积分增益引起的,而不是比例增益,因为只有p的系统有KP= 40没有振荡。)让我们尝试K我= 5。
这个积分增益还是太大了,但是我们越来越接近K了我= 10时,振荡约为11°C的峰-峰,与K我他们的峰与峰之间只有大约6°C。这里是用K控制运行的图我= 3和K我= 2。
这两种方法都很好。K我= 3运行有显著的振荡,但振幅明显下降,所以我们可以假设测量的温度最终会找到设定值并停留在那里。K我= 2运行没有振荡,但积分增益不足以克服纯p系统的稳态误差趋势。在这一点上,我喜欢KP= 40 / K我= 3系统,但如果输出收敛得更快就更好了。我们需要导数增益。
以导数结束
许多PID系统实际上是没有微分增益的。正如我们在前一节中看到的,PI控制器可以非常有效。此外,导数易受噪声影响,导致短期变化率与输出的整体行为不一致。但在一般情况下,如果没有一定的微分增益,PID控制器将无法实现其全部功能。而导数项则是根据该参数对PID输出进行修改,使系统响应更灵敏未来系统的行为。这样想:当测量的温度接近设定值时,误差就会变小。因此,误差的变化(计算为当前误差减去以前的误差)是负的。这个误差的变化然后乘以(正的)导数增益值,并添加到PID输出。乘法的结果是负的,因此它减少了PID输出——导数项减少了PID输出基于期望输出正在接近设定值,这将导致更少的超调。反之,当测量的温度朝着设定值下降时:导数项增加PID输出,因为它接近设定值,从而减少欠冲。
这里是K的控制运行D= 1, 2, 3:
假设当温度曲线保持在绿色设定值线附近(或直接在上面)时,输出已经收敛。与前面的配置(KP= 40 / K我= 3 / KD= 0),输出在约430秒后从未完全收敛。与KD= 1时,结果大致相同。与KD= 2时,我们在400秒内收敛,KD= 3系统似乎收敛得快一些。
结论
在这一点上,我对K很满意P= 40 / K我= 3 / KD= 3的配置。在下一篇文章中,我们将讨论一种更正式的调优增益值的技术。
奇怪,我认为KP = 40/KI = 2/KD = 0配置图看起来比你的KP = 40/KI = 3/KD = 3配置更理想,不是吗?
我很少使用PID控制器来控制温度,更多的是压力或电机速度。我从未使用过D这个术语,主要是因为我不知道如何正确地设置它,但也因为各种各样的噪音让它无法使用。任何包含变频器电机速度控制的系统在任何地方都是一个完全的噩梦,例如微妙的传感器信号,但也有物理的人工制品,如空气或液压螺线管“敲打”可能突然出现。只是在外面小心点。