在 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... :-/
我正在研究 Matlab simulink 模块:Mean(可变频率)。该块显示在 http://www.mathworks.com/help/physmod/sps/powersys/ref/meanvariablefrequency.html
该算法的第一步是对输入信号进行积分。但是,当输入信号为常数时,积分器会累加直至溢出。有谁知道如何在这样的块中解决这个问题。
我还在下面附上这个块的图:
您需要实施 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
.
如果我们查看具有 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... :-/