上一篇文章是一份pid的指南,目的是为pid建立一个整体的概念,这一篇简单介绍了pid建立模型的三种方法

根据元件性质直接得到模型

适用于简单的系统,需要关注整个系统的具体组成

通过欧姆定律等电路定律,为元件建模,最终得到系统模型

这种方式很麻烦,不在这里讨论

系统识别的方法

这种方法不需要关注系统的具体实现,将系统当做一个双端口的加工器,给定输入可以得到想要的输出

就好像图中所示的一个加热器,面包经过加热器后上升了10度,就可以给加热器建立相关的方程了,并不需要知道加热器是电阻加热还是红外光热

还需要注意的是,给定输入是否在系统输入范围,避免对系统造成损伤

MATLAB仿真

这里使用到了MATLAB的system identification的工具库

本次仿真是对一个电机建立模型

电机模型在这里提供

首先需要在matlab命令行初始化模型相关的以下变量

1
2
3
4
5
J = 0.01;
b = 0.1;
K = 0.01;
R = 1;
L = 0.5;

在simulink中运行一遍模型,回到matlab,这时候会发现工作区多了step_input/img/matlab/motor_speed这两个变量

在matlab的工具箱中找到system identification这个工具,打开

import data下选择time domain data,在弹出的窗口填入下图中的信息,点击import

接下来在estimate的下拉框中选择transfer function model,点击estimate,运行完后,如图所示把结果tf1拖入to workspace

此时在MATLAB的工作区中应该能看见tf1这个变量,在命令行输入tf1,就能看见传递函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
>> tf1

tf1 =

From input "u1" to output "y1":
-1.042e-08 s + 2
------------------
s^2 + 12 s + 20.02

Name: tf1
Continuous-time identified transfer function.

Parameterization:
Number of poles: 2 Number of zeros: 1
Number of free coefficients: 4
Use "tfdata", "getpvec", "getcov" for parameters and their uncertainties.

Status:
Estimated using TFEST on time domain data "mydata".
Fit to estimation data: 100% (stability enforced)
FPE: 4.857e-33, MSE: 4.851e-33

回到simulink,修改DC Motor Transfer Fcn为对应的传递函数,开始仿真。

仿真结束后打开scope查看,结果如下图

从结果可以看出这个传递函数是正确的

对现有非线性模型线性化

这个方法和前面系统辨识的方法很类似,不过上一个方法使用的是模型的输入输出结果建立模型,这个是通过对系统线性化得到模型

MATLAB仿真

最终效果的模型在这里提供

如下图所示,先添加linear analysis points

在菜单栏打开Analysis->Control Design->Linear Analysis..

如下图所示,设置t=2,点击Step Plot 1,双击点开linsys1,显示线性化的选项选择Transfer Function

如下图所示,验证这个传输函数的正确性

可以看出这个传递函数是正确的