旧乡故客
发表于: 2018-8-3 15:55:21 | 显示全部楼层

在本文中,我们将探索P、I和D如何影响系统性能,在此过程中,我们将找到适合我们温度控制器的增益配置。

该PID(比例 - 积分 - 微分)温度控制系统的主要组件包含EFM8微控制器、DAC和MAX31855热电偶数字转换器。该系列总共有6部分:

●    Part 1:电路原理设计

●    Part 2:板级集成

●    Part 3:实现与可视化

●    Part 4:Scilab GUI

●    Part 5:调节增益系数


GUI升级

我们在本文中的目标是获得对比例、积分和微分增益如何影响PID控制系统性能的可靠概念性理解。如果我们有一种方便的方法来改变增益值,这将会容易得多。因此,我们需要为GUI添加一些新功能:

PID5_blankGUI.jpg


如您所见,我们现在有P、I和D增益的文本输入框。这些值以与设定值相同的方式发送到EFM8,即通过在每次控制运行开始时发送的USB命令(当您单击“激活PID控制”时“控制运行”开始,并在您单击时结束“停止PID控制“;显示测量温度和设定点线的图表在新控制运行开始时被清除。增益值限制在0到255范围内的整数。让我们快速查看与此新功能相关的Scilab脚本的两个部分。在这里,我们将文本输入框中的数字转换为可以作为普通二进制数字(而不是ASCII字符)发送到EFM8的变量:

PID5_script1.jpg


这就是我们将增益值发送到EFM8的方式。以前我们这里只有两个传输 - 一个用于发送设定值的“S”命令和一个用于启动控制运行的“C”命令。现在我们有第三个,即用于发送所有三个增益值的“K”命令。

PID5_script2.jpg


固件升级

当然,如果EFM8固件不知道如何处理“K”命令,这个新的GUI功能将无法实现,所以让我们简要地看看固件更改。首先,我们需要将K_proportionalK_integralK_derivativemain()函数中定义的局部变量转换为可用于main()VCPXpress_API_CALLBACK()的全局变量。我们通过在任何函数之外定义变量来实现这一点,然后我们在Project_DefsVarsFuncs.h文件中将它们声明为“extern”。现在我们可以添加一些代码来处理“K”命令:

K-Command-Code.jpg


从比例(P)开始

要将PID代码转换为实际控制变量的值,需要为P增益找到合理的值。这并不像人们想象的那么简单,因为在低级别的特定于应用程序的PID系统(例如我们的温度控制器)的环境中,增益值实际上是在转换数字信息。我的意思是:我们的系统有两个独立的数字域 - 温度(摄氏度)和数字计数(反过来又对应于DAC电压,后者又对应于加热器驱动电流,后者又对应于电阻产生的热量)。这两个域说不同的语言;我们需要做的是设置比例增益,使其正确地从一个数字域转换到另一个数字域。


只要考虑系统的运行方式,您就可以做得很好:我们从MAX31855读取温度值并计算误差。然后,该误差决定了电阻器产生的热量。我们在DAC值为200时获得最大热量(系统支持最高255的DAC值,但我选择200作为上限)。当误差很大时,即当测量温度远离设定点时,我们需要最大热量。但是,在某些时候,当测量温度接近设定值时,热量输出应该开始减少。这是你选择一个有意义的值的地方,然后经过一些控制运行后你可以根据需要进行调整。假设我们希望加热器保持最大值,直到测量温度在设定值的5°C范围内:200/5 = 40.因此我们从比例增益40开始。


请记住,PID控制输出是DAC值,为了计算PID输出,我们将比例增益乘以“误差”,这意味着设定点温度减去测量温度。因此,只要误差大于或等于5°C,加热器就会消失。当测量温度接近设定点时,加热器驱动电流与误差成比例地减小 - 在4°C时DAC值为160,在3°C时DAC值为120,依此类推。这是您的起点,如有必要,您可以根据系统的实际性能调整比例增益。一旦您对比例增益感到满意,您就可以继续进行积分和微分增益。


P-Only系统

你真的需要积分和微分增益吗?那么,这取决于您的操作要求(以及系统的特性)。让我们看一下KP = 40的P-only系统的控制运行。

PID5_P-40__I-0__D-0.jpg


正如所料,该系统存在显着的稳态不准确性。当误差很小时,P增益不足以抵消电阻器向环境温度冷却的自然趋势。我们可以通过增加比例增益来解决这个问题吗?好吧,这里有四个P-only控制运行,KP = 70、100、150和200。

PID5_P-70__I-0__D-0.jpg


PID5_P-100__I-0__D-0.jpg


PID5_P-150__I-0__D-0.jpg


PID5_P-200__I-0__D-0.jpg


仔细考虑这些情节,我想你会开始理解P-only系统的弱点。如果增益太低,则会出现严重的稳态误差。随着增益的增加,您只需交换振荡的稳态误差。当我们达到KP = 200时,输出几乎以设定点为中心 - 换句话说,平均稳态误差非常小 - 但我们持续振幅相当大。如果您对此表现感到满意,我想您可以在这里停下来。但我不满意。


引入积分(I)

积分项允许小误差逐渐累积,从而对PID输出施加比在仅P系统中更大的影响。但是,你必须要小心,因为积分误差会很快累积,并且积分增益太大,系统开始表现为摆锤误差低于设定值并驱动温度过高,然后误差高于设定值并且将温度驱动得太低,然后误差会低于设定值并导致误差过高,等等。


让我们从KI = 10开始,看看会发生什么。

PID5_P-40__I-10__D-0__r2.jpg


显然,这个值太高了,因为我们有重大的摆锤行为。 (我们知道振荡是由积分增益引起的,而不是比例增益,因为KP = 40的P-only系统没有振荡。)让我们尝试KI = 5。

PID5_P-40__I-5__D-0.jpg


这仍然是太多的积分增益,但我们越来越接近 - KI = 10时振荡的峰峰值约为11°C,而KI = 5时它们的峰峰值只有6°C左右。以下是KI = 3和KI = 2的控制运行图。

PID5_P-40__I-3__D-0.jpg


PID5_P-40__I-2__D-0.jpg


这两个都很好。 KI = 3运行具有显着的振荡但振幅明显减小,因此我们可以假设测量的温度最终将找到设定点并保持在那里。 KI = 2运行没有振荡,但没有足够的积分增益来克服P-only系统的稳态误差趋势。此时,我喜欢KP = 40 / KI = 3系统,但如果输出收敛得更快就会很好。为此,我们需要衍生收益。


最后是积分

许多PID系统实际上没有积分增益。正如我们在上一节中看到的那样,PI控制器非常有效。此外,导数易受噪声影响,导致短期变化率与输出的整体行为不一致。但一般来说,如果没有一些微分增益,PID控制器将无法充分发挥其潜力。导数项使系统响应更快,因为它根据系统的未来行为修改PID输出。这样考虑:当测量温度接近设定点时,误差变小。因此,误差的变化(计算为当前误差减去先前的误差)是负的。然后将误差变化乘以(正)微分增益值并加到PID输出。乘法的结果是负的,因此它减少了PID输出 - 导数项根据输出接近设定值的预期减少了PID输出,这导致了较小的过冲。当测量温度朝设定值减小时,反向发生:微分项在接近设定值时增加PID输出,从而减少下冲。

以下是KD = 1、2和3的控制运行:

PID5_P-40__I-3__D-1.jpg


PID5_P-40__I-3__D-2.jpg


PID5_P-40__I-3__D-3.jpg


假设温度曲线紧靠绿色设定点线(或直接位于绿色设定点线的顶部)时,输出已收敛。使用先前的配置(KP = 40 / KI = 3 / KD = 0),输出在约430秒后从未完全收敛。 KD = 1时,结果大致相同。在KD = 2的情况下,我们在400秒时收敛,而KD = 3系统似乎收敛得更快一点。


总结

此时我对KP = 40 / KI = 3 / KD = 3配置感到满意。在下一篇文章中,我们将介绍一种更正式的调整增益值的技术。

跳转到指定楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 29 | 回复: 32



手机版|

GMT+8, 2024-11-21 17:04 , Processed in 0.041208 second(s), 6 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表