如何将连续PID(以s形式)转换为离散形式(以z形式)?让我们说我有PID的调整增益(以s形式):
Kp=2266.76751174231;
Ki=3461.10112077832;
Kd=360.96017761997;
现在,我想以z形式将相同的增益应用于PID。然而,与连续相比,我无法获得相同的离散响应。下面是z框图:
有什么建议我的错误是什么? 谢谢!
答案 0 :(得分:3)
我尝试使用您指定的PID参数连续运行模型,并使用默认N=100
导数增益滤波器系数。我使用ode45
求解器和默认参数,但我将最大时间步长限制为0.01。不幸的是,我发现系统不稳定。
我使用启发式手动方法调整了收益(我认为从回答问题的角度来看,收益的价值并不相关)。我决定采取以下措施:
Kp = 6
Ki = 12
Kd = 1
我使用的模型如下所示。从Simulink图中可以看出,我构建了两个模型。它们(几乎)是等价的。但是,第一个模型(最顶层模型)使用标准Simulink PID(s)块,第二个模型(最下面的模型)使用自定义传输功能块而不是Simulink PID(s)块。自定义传递函数应该产生相当于Simulink PID(s)块的输出,因为它们的实现方式不同。创建第二个模型是为了帮助解释我用于将模型从z域转换为s域的方法。我也用它作为"健全检查"确保Simulink PID的实现与我认为实现的方式没有区别。
连续时间模拟的PID参数。
与工厂关联的传递功能块的参数。
连续时间模拟的结果。
为了将植物模型从s域转换为z域,我使用了Tustin变换。我在MATLAB中使用了符号工具箱来执行转换。这是我的首选方法,因为与内置的控制系统工具箱相比,它可以提供更通用的解决方案。我还在s域中构造了PID函数,并使用相同的方法将其转换为z域。执行转换的脚本如下所示。请注意,我使用0.1
作为离散时间模拟的模拟时间步长。此值也应在Simulink中的求解器配置中设置。
从z-domain中Simulink模型的构建角度来看,以下变量很重要:
NPlantCoeffs
- 包含与z-domain中的植物相关的传递函数的分子的系数。作为参考,获得了以下值:[45 135 135 45]
。DPlantCoeffs
- 包含与z域中的植物相关的传递函数的分母的系数。作为参考,获得了以下值:[406502 -1104494 1035506 -333498]
。NPIDFiltCoeffs
- 包含与z域中的PID相关联的传递函数的分子的系数。作为参考,获得了以下值:[-349 515 -196]
。DPIDFiltCoeffs
- 包含与z域中的PID相关联的传递函数的分母的系数。作为参考,获得了以下值:[-15 5 10]
。Tval
- 时间步长的值。作为参考,使用了以下值:0.1
。用于定义离散时间模拟参数的脚本。
% Initialisation.
clear;
clc;
% Define the symbolic variables of interest.
% T is the time step for discrete simulation.
syms s z T;
% Define the controller parameters.
% The parameters should correspond to the parameters obtained from tuning
% the continuous system.
Kp = 6;
Ki = 12;
Kd = 1;
N = 100;
% Define the plant and the controller in the s-domain.
TFPlant = 0.09/(0.09*s^3 + 0.18*s^2 + s + 1.004);
TFPIDFilt = Kp + Ki/s + Kd*N/(1 + N/s);
% Obtain the numerator and the denominator of the transfer functions in the
% s-domain.
[NPIDCont, DPIDCont] = numden(collect(TFPIDFilt));
NPIDCont = sym2poly(NPIDCont);
DPIDCont = sym2poly(DPIDCont);
% Convert to z-domain using Tustin substitution (referred to as Trapezoidal
% method in Simulink block PID(s)).
TFPlant = collect(subs(TFPlant, s, (2/T)*(z - 1)/(z + 1)));
TFPIDFilt = collect(subs(TFPIDFilt, s, (2/T)*(z - 1)/(z + 1)));
% Define time step for discrete simulation.
Tval = 0.1;
% Perform substitution for the time step T.
TFPlant = subs(TFPlant, T, Tval);
TFPIDFilt = subs(TFPIDFilt, T, Tval);
% Decompose into the numerator and denominator.
[NPlant, DPlant] = numden(TFPlant);
[NPIDFilt, DPIDFilt] = numden(TFPIDFilt);
% Obtain the polynomial coefficients associated with the numerator and
% denominator.
NPlantCoeffs = sym2poly(NPlant);
DPlantCoeffs = sym2poly(DPlant);
NPIDFiltCoeffs = sym2poly(NPIDFilt);
DPIDFiltCoeffs = sym2poly(DPIDFilt);
对于离散时间模拟,重要的是选择固定时间步长求解器并将时间步长设置为等于用于将工厂模型从s域转换为z-的值的值。域。如下所示,我使用连续时间PID控制器块的z域版本进行离散时间仿真。给定离散时间模拟的计算工厂参数,模拟结果非常接近连续时间系统模拟的结果。
离散时间模拟的求解器配置。
离散时间模拟的模型。
离散时间工厂模型参数。
用于离散时间仿真的Simulink PID(s)块的参数化。
离散时间模拟的结果。
要回答您的原始问题,我不确定您的错误究竟在哪里。但是,我在下面提供了几个假设: