在 Simulink 中阻止积分器溢出

Block integrator overflow in Simulink

我正在研究 Matlab simulink 模块:Mean(可变频率)。该块显示在 http://www.mathworks.com/help/physmod/sps/powersys/ref/meanvariablefrequency.html

该算法的第一步是对输入信号进行积分。但是,当输入信号为常数时,积分器会累加直至溢出。有谁知道如何在这样的块中解决这个问题。

我还在下面附上这个块的图: 稍后,我会将其更改为离散时间模型,并在我的 DSP 中实现这样的算法。如果您有任何建议,我是一个很好的倾听者。

您需要实施 Anti-Windup 控制。最简单的方法是使用 PID 控制器 并将常数和微分增益设置为零。对于 Anti-Windup,您通常有两个选择:反算和钳位。有关差异和参考,请查看本文:Anti-windup control using a PID-Controller

您正在实现的功能是

y(t) = Integrate_{x=0->t} u(x) dx  -  Integrate_{y=0->t-T} u(y) dy          (1)

其中 T 是传输延迟。这可以通过替换 z = y + T 来重新排序,并且由于积分的线性度为

y(t) = Integrate_{x=0->t} u(x) dx  -  Integrate_{z=T->t} u(z - T) dz
     = Integrate_{x=0->t} [ u(x) - u(x - T) ] dx + C                        (2)

其中

C = Integrate_{z=0->T} u(z) dz

是一个取决于初始条件的有限常数,如果您的信号 u 在初始时间 t = 0 ... T.

中为零,则可以假定为 0

如果我们查看具有 DC-offset 的输入信号,例如

u(t) = DC + sin(w*t)

然后实现 (1) 将首先积分然后减去,正如您所指出的那样,这将饱和或导致精度损失。但是 (2) 将首先减去并因此删除任何 DC

u(x) - u(x - T) = DC - DC + sin(w*t) - sin(w*t - w*T)
                = 0         sin(w*t) - sin(w*t - w*T)

然后整合,不要冒饱和的风险。因此,我建议按如下方式更改实现:

或者,您可以将理想积分器 1/s 更改为 low-pass 滤波器,在直流时具有有限增益,例如1/(1+s) 尽管与理想行为相比,这(以及@thewaywewalk 建议的 anti-windup 控制器)会使您的信号失真。

PS:感谢 Whosebug 不支持正确的 math-notation... :-/