Bootstrap

MATLAB 控制系统快速入门

系列文章目录


前言

        Control System Toolbox™ 提供了用于系统地分析、设计和调节线性控制系统的算法和 App。您可以将系统指定为传递函数、状态空间、零极点增益或频率响应模型。借助 App 和函数(如阶跃响应图和波特图),您可以在时域和频域中分析和可视化系统行为。

        您可以使用交互式方法(如波特环路成形和根轨迹方法)来调节补偿器参数。该工具箱可用于自动调节 SISO 和 MIMO 补偿器,包括 PID 控制器。补偿器可以包括跨几个反馈环的多个可调模块。您可以调节增益调度控制器并指定多个调节目标,如参考跟踪、扰动抑制和稳定裕度。您还可以通过校验上升时间、超调、稳定时间、增益和相位裕度及其他要求来验证您的设计。


一、线性 (LTI) 模型

1.1 什么是被控对象?

        通常,控制工程师会先对他们要控制的动态系统进行数学描述。要控制的系统就称为被控对象。本节使用直流电机作为一个被控对象的示例。本节将建立微分方程来描述带惯性负载的直流电机的机电属性。然后,说明如何使用 Control System Toolbox™ 函数基于这些方程构建线性模型。

1.2 线性模型表示

        您可以使用 Control System Toolbox 函数来创建以下模型表示:

  • 以下形式的状态空间模型 (SS)

                {\dfrac{d x}{d t}}=A x+B u \\ y=C x+D u

        其中 ABC 和 是具有相应维数的矩阵,x 是状态向量,u 和 y 是输入和输出向量。

  • 例如,传递函数 (TF)

                $H(s)={\frac{s+2}{s^{2}+s+10}}$

  • 例如,零极点增益 (ZPK) 模型

        ​​​​​​​        $H(z)=3\frac{(z+1+j)(z+1-j)}{(z+0.2)(z+0.1)}$

  • 频率响应数据 (FRD) 模型,由系统的频率响应的采样测量值组成。例如,您可以将通过试验采集的频率响应数据存储在 FRD 模型中。

1.3 SISO 示例:直流电机

        驱动惯性负载的直流电机的简单模型显示负载的角速度 ω(t) 作为输出,施加的电压 $v_{a p p}(t)$ 作为输入。此示例的最终目的是通过改变施加的电压来控制角速度。下图显示了一个简单的直流电机模型。

1.3.1 驱动惯性负载的直流电机的简单模型

        在此模型中,电机本身的动态特性是理想化的;例如,假设磁场恒定。电路的电阻用 R 表示,电枢的自感用 L 表示。如果您不熟悉直流电机建模的基础知识,请查阅有关物理建模的基础文章。基于这一简单模型和基本物理定律,就可以建立描述此机电系统行为的微分方程。在此示例中,电势和机械力之间的关系遵循法拉第感应定律和安培关于磁场中导线所受作用力的定律。

1.3.2 数学推导

        电机轴上的转矩 τ 与所施加电压感应的电流 i 成正比,

$\tau (t)=K_{m}i(t)$

        其中,电枢常量 Km 与电机的物理属性有关,如磁场强度、导体线圈周围的线匝数等。反(感应)电动势 $v_{e m f}$ 是与轴上的角速度 ω 成比例的电压,

$v_{e m j}(t)=K_{b}\omega(t)$

        其中,电动势常量 Kb 也取决于电机的某些物理属性。

        电机方程的机械部分是使用牛顿定律得出的,牛顿定律指出,惯性负载 J 乘以角速度的导数等于电机轴的所有扭矩之和。得到的方程如下,

$J{\frac{d w}{d t}}=\sum\tau_{i}=-K_{f}\omega(t)+K_{m}i(t)$

        其中 $K_{f}\omega$ 是粘性摩擦的线性逼近。

        最后,电机方程的电气部分可以描述为

$v_{a p p}(t)-v_{e m f}(t)=L\frac{d i}{d t}+R i(t)$

        或者,求解施加的电压并代入反电动势,

$v_{a p p}(t)=L\frac{d i}{d t}+R i(t)+K_{b}\omega(t)$

        基于此方程序列可得到描述电机行为的一组微分方程(包含两个微分方程),其中第一个方程用于感应电流,

$\frac{d i}{d t}=-\frac{R}{L}{\dot{\imath}}(t)-\frac{K b}{L}\omega(t)+\frac{1}{L}v_{a p p}(t)$

        第二个方程用于产生的角速度,

$\frac{d\omega}{d t}=-\frac{1}{J}K_{f}\omega(t)+\frac{1}{J}K_{m}i(t)$

1.3.3 直流电机的状态空间方程

        基于上一节中推导的两个微分方程,现在您可以建立直流电机作为动态系统的状态空间表示。电流 和角速度 ω 是该系统的两种状态。施加的电压 $v_{a p p}$ 是系统的输入,角速度 ω 是输出。

\dfrac{d}{dt} \begin{bmatrix} i \\ \omega \end{bmatrix}= \begin{bmatrix} -\dfrac{R}{L} & -\dfrac{K_b}{L} \\ \dfrac{K_m}{J} & -\dfrac{K_f}{J} \end{bmatrix}\cdot \begin{bmatrix} i \\ \omega \end{bmatrix}+ \begin{bmatrix} \dfrac{1}{L} \\ 0 \end{bmatrix}\cdot v_{app}(t)

直流电机的状态空间表示示例

y(t)=[0\quad1]\cdot \begin{bmatrix} i \\ \omega \end{bmatrix}+[0]\cdot v_{app}(t)

1.4 构建 SISO 模型

在建立描述被控对象的一组微分方程后,您可以使用简单的命令来构造 SISO 模型。以下各节讨论

  • 构造直流电机的状态空间模型

  • 在各模型表示之间转换

  • 创建传递函数和零点/极点/增益模型

1.4.1 构造直流电机的状态空间模型

为直流电机的各种参数输入以下标称值。

R= 2.0 % Ohms
L= 0.5 % Henrys
Km = .015 % torque constant
Kb = .015 % emf constant
Kf = 0.2 % Nms
J= 0.02 % kg.m^2

基于这些值,您可以使用 ss 函数构造数值状态空间表示。

A = [-R/L -Kb/L; Km/J -Kf/J]
B = [1/L; 0];
C = [0 1];
D = [0];
sys_dc = ss(A,B,C,D)

这些命令返回以下结果:

a = 
                        x1           x2
           x1           -4        -0.03
           x2         0.75          -10
 
 
b = 
                        u1
           x1            2
           x2            0
 
 
c = 
                        x1           x2
           y1            0            1
 
 
d = 
                        u1
           y1            0
1.4.2 在各模型表示之间转换

现在您已经有了直流电机的状态空间表示,您可以转换为其他模型表示了,包括传递函数 (TF) 和零点/极点/增益 (ZPK) 模型。

传递函数表示.  您可以使用 tf 从状态空间表示转换为传递函数。例如,使用以下代码转换为直流电机的传递函数表示。

sys_tf = tf(sys_dc)
Transfer function:
       1.5
------------------
s^2 + 14 s + 40.02

零点/极点/增益表示.  同样,zpk 函数可将状态空间或传递函数表示转换为零点/极点/增益形式。使用以下代码将直流电机的状态空间表示转换为零点/极点/增益形式。

sys_zpk = zpk(sys_dc)
 
Zero/pole/gain:
        1.5
-------------------
(s+4.004) (s+9.996)

注意

        状态空间表示最适合数值计算。要获得最高精度,请在合并模型之前转换为状态空间表示,并避免使用传递函数和零点/极点/增益表示,但模型设定和检查除外。

1.4.3 构造传递函数和零点/极点/增益模型

在直流电机示例中,状态空间方法会产生表示模型的一组矩阵。如果您选择不同的方法,则可以使用 tfzpkss 或 frd 构造对应的模型。

sys = tf(num,den)               % Transfer function
sys = zpk(z,p,k)                % Zero/pole/gain
sys = ss(a,b,c,d)               % State-space
sys = frd(response,frequencies) % Frequency response data

例如,您可以用以下代码通过指定分子和分母来创建传递函数。

sys_tf = tf(1.5,[1 14 40.02])
 
Transfer function:
       1.5
------------------
s^2 + 14 s + 40.02

或者,如果您要直接创建直流电机的传递函数,请使用以下命令。

s = tf('s');
sys_tf = 1.5/(s^2+14*s+40.02)

这些命令生成以下传递函数。

Transfer function:
        1.5
--------------------
s^2 + 14 s + 40.02

要构建零点/极点/增益模型,请使用以下命令。

sys_zpk = zpk([],[-9.996 -4.004], 1.5)

此命令返回以下零点/极点/增益表示。

Zero/pole/gain:
        1.5
-------------------
(s+9.996) (s+4.004)

1.5 构造离散时间系统

Control System Toolbox 软件完全支持离散时间系统。您可以像创建模拟系统一样创建离散系统;唯一区别是,您必须为构建的任何模型指定采样时间周期。例如,

sys_disc = tf(1, [1 1], .01);

以传递函数形式创建 SISO 模型。

Transfer function:
  1
-----
z + 1
 
Sample time: 0.01
向离散时间模型添加时滞

通过在构建模型时指定输入延迟、输出延迟或 I/O 延迟,可以向离散时间模型添加时滞。时滞必须为表示采样时间倍数的非负整数。例如,

sys_delay = tf(1, [1 1], 0.01,'ioDelay',5)

返回 I/O 延迟为 5 秒的系统。

Transfer function:
           1
z^(-5) * -----
         z + 1
 
Sample time: 0.01

1.6 向线性模型添加延迟

通过在构建模型时指定输入延迟、输出延迟或 I/O 延迟,可以向线性模型添加时滞。例如,要向直流电机添加 I/O 延迟,请使用以下代码。

sys_tfdelay = tf(1.5,[1 14 40.02],'ioDelay',0.05)

以下命令将构造直流电机传递函数,但会增加 0.05 秒的延迟。

Transfer function:
                      1.5
exp(-0.05*s) * ------------------
               s^2 + 14 s + 40.02

1.7 LTI 对象

为方便起见,Control System Toolbox 软件使用名为 LTI 对象的自定义数据结构体来存储与模型相关的数据。例如,为直流电机示例创建的变量 sys_dc 称为 SS 对象。还有 TF、ZPK 和 FRD 对象,分别适用于传递函数、零点/极点/增益和频率数据响应模型。这四个 LTI 对象可用于封装模型数据,并允许您将线性系统作为单个实体来操作,而不是作为向量或矩阵的集合。

要查看 LTI 对象包含的内容,请使用 get 命令。以下代码描述了直流电机示例中 sys_dc 的内容。

get(sys_dc)
                A: [2×2 double]
                B: [2×1 double]
                C: [0 1]
                D: 0
                E: []
           Scaled: 0
        StateName: {2×1 cell}
        StateUnit: {2×1 cell}
    InternalDelay: [0×1 double]
       InputDelay: 0
      OutputDelay: 0
               Ts: 0
         TimeUnit: 'seconds'
        InputName: {''}
        InputUnit: {''}
       InputGroup: [1×1 struct]
       OutputName: {''}
       OutputUnit: {''}
      OutputGroup: [1×1 struct]
            Notes: [0×1 string]
         UserData: []
             Name: ''
     SamplingGrid: [1×1 struct]

您可以使用 set 命令操作 LTI 对象中包含的数据;有关 set 和 get 的描述,请参阅 Control System Toolbox 在线参考页。

设置或检索 LTI 模型属性的另一种便捷方式是使用圆点表示法直接访问它们。例如,如果您要访问 A 矩阵的值,您可以不使用 get,而是键入

sys_dc.A

(在 MATLAB® 提示符下键入。)此表示法将返回 A 矩阵。

ans =

   -4.0000   -0.0300
    0.7500  -10.0000

同样,如果您要更改 A 矩阵的值,您可以直接进行更改,如以下代码所示。

A_new = [-4.5 -0.05; 0.8 -12.0];
sys_dc.A = A_new;

 

;