如何实现自整定的类 PID 控制器

电器工程 微控制器 控制系统 pid控制器 卷积
2022-01-06 14:47:23

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

  • 输出只能是开或关,具有固定的循环频率(每小时约 2-10 个)
  • 植物反应缓慢(可测量的温度变化需要很长时间 > 10 分钟)。
  • 植物会根据环境条件失去温度。
  • 设定点可以根据用户需求大幅度变化。

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

这可以通过 PI 控制器轻松完成,并将其输出转换为占空比。问题是程序需要自动调整并选择正确的 Kp、Ki 常数并适应不同的环境条件和加热容量的变化。因此,提前调整 PI 控制器并没有太大用处。

不需要使用实际的 PI 或 PID。如果有帮助,我愿意使用模糊逻辑,芯片上还有一个机器学习算法,可以模拟系统响应和热损失(线性近似值),它建议有关测量的阶跃响应的信息。只是不知道如何处理这些信息。

一些帖子建议我可以使用建模数据在线调整 PI,以及建议我可以使用 Fuzzy-Logic 调整 PI的实验室视图手册。

我的问题是,这种场景的最佳方法是什么(例如 PID、模糊 pid、卷积等),我将如何在软件/实践中实际实现它。

我不是 EE,所以任何输入将不胜感激。

4个回答

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

Nelder-Mead 方法爬山

这篇论文

例如,在我们调整 PID 参数 {K P , K I , K D } 的情况下,单纯形是四面体。Nelder-Mead 通过外推在排列为单纯形的每个测试点处测量的目标函数的行为来生成一个新的单纯形测试位置。算法然后选择用新的测试点替换这些测试点之一,因此技术进步。

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

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

这对您来说可能并不理想,因为您声明“即使作为自动调整的一部分,用户也不接受将系统置于振荡状态”。我们的系统在自动调整时肯定会振荡并做其他可怕的事情。

但是,您可以运行 PID 控制器的两个副本。一个是“活的”并实际控制过程的。第二个是不断自动调整的,同时提供与“实时”控制器相同的输入。当自动调谐控制器的输出变得“更好”或更稳定时,您可以将系数交换到“实时”控制器中。然后控制器将对过程进行修正,直到达到所需的性能。这将防止用户在自动调谐期间感知到的振荡。但是,如果输入发生剧烈变化并且 PID 控制器不再是最佳的,则自动调整可以在新系数可用时交换它们。

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

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

每小时能够改变控制状态(开或关)2-10 次并不适合占空比控制。PI 回路的输出将是一个控制信号,其幅度随误差而变化,并且您的设备(实际上)只能接受二进制输入(关闭或打开),因为控制的“频率”可以接受的占空比是赫兹的一小部分。

您可能想要简化事情并使用滞后控制:

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

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

如果你想变得花哨,你可以实现一个机器学习算法来生成你的增益矩阵。这将导致您似乎正在描述的不断发展和学习的控制器。但是,如果系统可以完全表征,则可能是矫枉过正。

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