如何实现自调节类PID控制器


15

我正在尝试编写一个用于控制具有以下特征的系统中的温度的微控制器程序:

  • 输出只能是开或关,具有固定的循环频率(每小时约2-10)
  • 工厂的响应速度很慢(可测量的温度变化需要10分钟以上的长时间)。
  • 该工厂会根据环境条件降低温度。
  • 设定点可以根据用户需求大步变化。

我正在编写一个控制器,旨在最大程度地减少错误,并坚持提供作为输入的循环速率。

使用PI控制器可以轻松完成此操作,并将其输出转换为占空比。问题在于程序需要自动调整并选择正确的Kp,Ki常数,并适应变化的环境条件和加热能力的变化。因此,预先调整PI控制器不是很有用。

不需要使用实际的PI或PID。如果有帮助,我愿意使用Fuzzy-Logic,也可以在芯片上使用机器学习算法来对系统响应和热损耗(线性近似)建模,该算法可提供有关所测阶跃响应的信息。只是不知道该怎么办。

有几篇文章建议我可以使用建模数据来在线调整PI,还可以通过实验室查看手册来建议我可以使用Fuzzy-Logic来调整PI。

我的问题是,对于这种情况(例如PID,模糊PID,卷积等),最好的方法是什么?我将如何在软件/实践中实际实现它?

我不是EE,因此不胜感激。


1
我写了一个关于使用单纯形算法自动调整Robotics SE上的PID控制器的答案,这可能是您感兴趣的。
Embedded.kyle

@ embedded.kyle太好了,我了解simplex / greatest-acent。你能说出他对x1,x2的习惯吗?我在将它们与PID常数关联时遇到麻烦。
MandoMando 2012年

1
已经有一段时间了,但是我相信我们使用了x1 = P,x2 = I,x3 =D。x0是重心,对于您来说最重要的指标就是稳定性。在我的电机控制应用中,我们有两个循环。一个的x0是速度,另一个的x0是电流。看到这里更多。
Embedded.kyle

@ embedded.kyle您介意将您的评论变成答案吗?如果需要,添加任何其他信息。-thx
MandoMando 2012年

赏金吗 好家伙!做完了。
Embedded.kyle

Answers:


7

我不会说PID过期了。但是肯定还有改进的空间。自动调节PID控制回路的一种方法是使用Nelder-Mead方法,该方法爬山 单纯形算法的一种形式。它的好处是能够收敛和重新收敛随时间变化的目标参数。

Nelder-Mead方法爬山

本文

例如,在PID参数调整{K P,K I,K D }的情况下,单面是四面体。Nelder-Mead通过外推在以单形排列的每个测试点上测得的目标函数的行为来生成新的单形测试位置。然后,算法选择将这些测试点之一替换为新的测试点,从而使技术发展。

我的特殊应用是电机控制。我们有两个回路,一个PID电流控制回路和一个PI速度控制回路。我们分别将顶点设置为P,I和D,并对循环的输出进行统计。然后,我们反复进行反射,扩展,收缩和缩小,直到生成的电流或速度控制目标在几个标准偏差之内。

对于我们的产品,副总裁非常关心电机的“发声”。事实证明,当当前目标的弹跳比数学上的最佳反弹时,它的“听起来”更好。因此,我们的调整是“实时”完成的,因为我们让算法在电动机运行时进行搜索,从而也考虑了用户对电动机声音的感知。找到我们喜欢的参数后,它们将被硬编码并且不会更改。

您可能会不满意,因为您指出“用户即使不接受自动调谐,也要使其处于振荡状态”。我们的系统在自动调整时肯定会振荡并做其他可怕的事情。

但是,您可以运行PID控制器的两个副本。一种是“实时”的,实际上是控制过程的。一秒钟不断进行自动调谐,同时获得与“实时”控制器相同的输入。当自动调整的控制器的输出变得“更好”或更稳定时,您可以将系数交换到“实时”控制器中。然后,控制器将对过程进行校正,直到获得所需的性能为止。这将防止用户在自动调整期间可以察觉的振荡。但是,如果输入急剧变化并且PID控制器不再是最优的,则自动调整可以在新系数可用时交换新系数。


NM方法确实需要在目标函数(即用户的真实世界)上运行其野点。但是,我相信可以基于传感器的测量结果,在微控制器本身上建立一个粗略模型(空间状态?)。然后,它会在优化后运行您建议的“影子” PI控制器。我不确定这是一个过大的杀伤力,因为有可能将PI调整到已知设置,然后根据传感器读数和系统响应来缩放 Kp和Ki。不管怎样,先生。
MandoMando 2012年

@MandoMando非常感谢!我真的很喜欢“影子” PI控制器一词。
Embedded.kyle

3

PID控制器在被控制系统的行为可以合理地近似为控制激励,控制激励积分和该第一积分的总和的情况下很有用。如果存在受刺激均匀加热的物体,并且该物体以与它们之间的温差成比例的速率将热量均匀地传递到其他物体,则某些温度控制系统可能会满足此类标准。例如,如果有足够的空气循环以使空气被视为具有单一的均匀温度,则第一物体可能是加热元件,第二物体可能是室内的空气循环。对于比这更复杂的热模型(例如,可能涉及固体介质中的热梯度的模型),

我建议一种好的方法可能是让控制器在加热器打开时不断估计如果立即关闭输出,被调节的设备将变得多热,如果持续关闭,温度将最终冷却到的温度。之后,加热器应尽快打开。还要估计如果将加热器再打开一秒钟,两秒钟,三秒钟等,这些值将是什么。当这些值达到预定值时,请关闭加热器。然后,一旦加热器关闭,就开始执行类似的计算,但是交换开/关,热/冷等角色,以决定何时重新打开。根据系统的热性能,可能有必要使用“最小/最大”超前策略来向前看一两步。


1

每小时能够将控制状态更改为2到10次(打开或关闭),这并不适合占空比控制。PI回路的输出将是一个控制信号,该信号的大小将根据误差而变化,并且由于控制的“频率”,您的工厂只能(实际上)仅接受二进制输入(关闭或打开)。可以接受的占空比是几分之一赫兹。

您可能想简化事情,并采用滞后控制:

  • 当温度超过下限时系统启动
  • 当温度超过上限时系统关闭
  • 上下限之间有足够的距离,以防止控制输出跳动

想法是取PI输出说:60%并转换为导通时间=周期的60%-> 0.6 x 30分钟->在30分钟的周期内打开18分钟,关闭12分钟。您建议的bang-bang控制器不能保证保持所需的循环速率(例如,每小时打开不超过n次)并同时保持较低的误差。系统可能需要暂时超调一段时间,以平衡关闭时间内的损耗。
MandoMando 2012年

1

一种典型的方法(尽管这样做是很简单的方法)被称为增益调度。当您有一个随系统更改的可观察变量(或多个变量)(调度参数)时,这是非线性控制的经典方法。在您的系统中,该变量很可能是温度。这样做的想法是,在调度参数(温度)的不同值处创建一个控制器增益列表,并且随着调度参数的更改,您将在控制器中使用这些增益(PI,PID,状态反馈或其他)。如果听起来真的很简单,那是因为。但是,它确实可以工作,并且在某些非常复杂的系统中使用。

如果您想花哨的话,可以实施机器学习算法来生成增益矩阵。这将导致您似乎正在描述不断发展的学习控制器。但是,如果可以对系统进行充分的特性描述,则可能会显得过大。

编辑:对不起,我读错了一点。您正在尝试控制温度,因此您所说的“环境条件”将成为您的调度参数。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.