第一次在实时软件中实现一个软件PID,我可以找到P,I和D呢?

信息处理 即时的
2022-02-23 10:19:31

这里我们有比例积分微分控制器的基本公式。这是维基百科页面上关于该主题的公式

我想在我的系统中实现这种类型的控制器。目前,系统(软件中的功能)被输入一个 psi 值,并被告知将模拟输出设置为一个值,以便达到该压力。该函数,让我们称之为它SetPressure(int psi),可以访问 psi 与模拟信号输出的表,它进行快速二进制搜索并找到最接近的匹配并将模拟输出设置为该匹配。

当机器/阀门“磨损”时,这还不够好。

所以现在我可以使用压力传感器来告诉我我试图控制的管路中的实际压力。它为我的功能提供了模拟输入。我想弄清楚,给定这些命令值和实际值,如何创建软件 PID。

所以,第一个值很容易;P. 这是通过确定值中的误差error = DesiredValue - ActualValue并将其乘以某个比例增益来发现的Kp所以P = Kp*error这很容易理解。经过一些调整,我应该找到一个合适的值,Kp这样我就可以更好地控制压力。

但是,如果我想找到 I 和 D 怎么办?

这个PID运行的软件是实时的。它每隔几毫秒被调用一次,读取输入并根据其状态确定输出。

我想首先,我从这里去哪里得到 I 和 D。我知道这些术语中的每一个都有收益,但我不确定我如何计算整个术语。

例如,我是否需要保存每个时间 t 的每个计算误差,以便我可以找到积分?这似乎会浪费内存,保存每个时刻的每个错误会在几秒钟内累积到一个巨大的列表中。

任何帮助表示赞赏。如果需要,请要求澄清,并注意这是我第一次使用这样的东西。

.

到目前为止的代码示例:

(anaOutput[PRESS_OUT_DAC] 已经在上面的模拟 vs psi 表的代码中确定)

float KpPressure = 1; // These gains are to be determined
float KiPressure = 1;
float KdPressure = 1;
float MVout = anaOutput[PRESS_OUT_DAC]; // Init to output 

if(anaInput[PRESS_IN_DAC] != anaOutput[PRESS_OUT_DAC])
{
    // error = SetPoint - ProcessValue
   float error = (float)anaOutput[PRESS_OUT_DAC] - (float)anaInput[PRESS_IN_DAC];

   // Pout = Kp * error
   float Pout = KpPRessure * error;
   // Iout = Ki * Int(0,t)[error(t)]
   float Iout = KiPressure * 1;              //// What should 1 be?
   // Dout = Kd * (d/dt)[error(t)]
   float Dout = KdPressure * 1;              //// What should 1 be?

   // Manipulated Output = Combination of PID
   MVout = P + I + D;   
}
if(MVout > MAX_SIGNAL) 
      MVout = MAX_SIGNAL;

 anaOutput[PRESS_OUT_DAC] = (UWORD)MVout + ANALOG_ZERO;
2个回答

一旦您掌握了基础知识(Jason 已经很好地涵盖了这一点),您还需要研究Integral Windup和过滤误差信号及其估计导数。如果您的控制点不连续地变化,前者非常重要(即您没有单独的控制器“斜坡”控制 PID 的控制信号)。后者在存在真实世界传感器噪声的情况下很重要,以避免不稳定。许多传感器会引入较大的噪声“尖峰”,在没有过滤的情况下会极大地扰乱控制系统。

许多物理系统也表现出共振效应,可能导致失控振荡(塔科马海峡大桥是一个典型的例子,说明这会变得多么糟糕。)反馈系统会加剧这些效应,因此“调整”你的 PID 的重要部分表征其在您将遇到的各种反馈和控制信号频率下的稳定性。这是另一个对反馈信号进行过滤很有帮助的领域。特别是 60Hz 的陷波滤波器在美国使用交流电源的系统中很常见。在实践中,谐振是特定于应用的,因此大多数控制器制造商都提供了一个通用的滤波器工具包,可以使用,然后由过程工程师为他们的应用进行适当的配置。

了解稳定性后的后续步骤:

  1. 通过对控制信号的变化率施加约束来“倾斜”控制信号。对于运动系统,这通常涉及限制速度和加速度。这使得 PID 的工作更容易,因为控制信号移动得更“平滑”。它通常还会为您的执行器带来更平滑的输出信号,这很重要,因为大多数执行器在响应其控制信号快速变化的能力方面存在实际限制。

  2. 调整 PID 外部的反馈/控制信号,以获得特定系统的最佳响应。例如,您想要校正的执行器或传感器中可能存在已知的滞后效应。

尽管如此,大多数集成商为他们正在集成的设备购买现成的控制器是有原因的。控制系统很复杂,供应商多年来开发了许多专有技巧,以从其特定组件中获得最佳性能。了解这些系统以从中获得最佳结果仍然很有价值,但是这里发生的事情比您可能意识到的要多。

听起来您在控制器的比例部分上是正确的;你似乎很清楚发生了什么。其他两个部分比您想象的要容易。您可能在基本控制理论中阅读的内容与您如何实现它之间的主要区别在于您的计算机是一个离散时间系统。由于您没有无限小的时间步长,因此您需要近似控制器中的其他两个分支。

  • 积分:您可以通过离散求和来近似积分:

    Iout=Ki0te(τ)dτKin=0Ne[n]Δt
    在哪里Δt是控制器输出更新之间的时间步长,并且e[n]是计算的误差n-第时间步。这不需要很多内存;您可以存储它们的累积总和,而不是存储每个错误样本。这类似于模拟积分器的运行方式。

  • 微分:您可以通过多种方式近似微分。最简单的是一阶差分:

    Iout=Kdddte(t)Kde[n]e[n1]Δt
    如果您的时间步长很大,那么这可能不是导数的一个很好的近似值。事实上,在任何情况下,在实践中都很难实现一个好的、稳健的微分器。您可以通过减少时间步长(有效地增加离散时间控制器的采样率)或使用更复杂的数字微分器设计来改进近似值。