matlab simulink将PID连续转换为离散

时间:2016-06-04 08:49:00

标签: matlab simulink

如何将连续PID(以s形式)转换为离散形式(以z形式)?让我们说我有PID的调整增益(以s形式):

Kp=2266.76751174231;
Ki=3461.10112077832;
Kd=360.96017761997;

现在,我想以z形式将相同的增益应用于PID。然而,与连续相比,我无法获得相同的离散响应。下面是z框图:

enter image description here

这是z形式的回复: enter image description here

s形式的方框图: enter image description here

这是连续形式的回复: enter image description here

有什么建议我的错误是什么? 谢谢!

1 个答案:

答案 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的实现与我认为实现的方式没有区别。

Continuous time model

连续时间模拟的PID参数。

Continuous time PID parameters

与工厂关联的传递功能块的参数。

enter image description here

连续时间模拟的结果。

Result of the continuous time simulation

为了将植物模型从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域版本进行离散时间仿真。给定离散时间模拟的计算工厂参数,模拟结果非常接近连续时间系统模拟的结果。

离散时间模拟的求解器配置。

Solver configuration for the discrete time simulation.

离散时间模拟的模型。

Models for the discrete time simulation.

离散时间工厂模型参数。

Discrete time plant model parameters.

用于离散时间仿真的Simulink PID(s)块的参数化。

Parametrisation of the Simulink PID(s) block for discrete time simulation

离散时间模拟的结果。

enter image description here

要回答您的原始问题,我不确定您的错误究竟在哪里。但是,我在下面提供了几个假设:

  1. 您在连续时间模拟中获得的PID增益有些奇怪。使用这些增益时,屏幕截图中指定的系统不稳定,除非我误读了屏幕截图中的工厂参数。
  2. 我不确定您将工厂模型从s域转换为z域所遵循的流程。我在答案中提出的转换过程应该为转换提供有效的方法。使用固定时间步长求解器进行离散时域仿真也很重要。此外,重要的是使用等于用于将工厂模型从s域转换为z域的时间步长的时间步。