简介:这份文档面向具备基础控制理论与编程能力的高年级本科生、研究生及工程技术人员,围绕自动控制原理实验教学,系统讲解控制系统的建模、分析与校正方法。内容涵盖控制系统数学模型建立、时域与频域分析、典型环节动态性能分析、频率特性测量、系统串联校正以及EF-Servo集成与滤波六大实验模块,每个实验均配有明确目的、内容、步骤与思考题,帮助读者熟悉MATLAB与MWORKS工具在控制系统设计中的实际应用。资源包为1个docx文档,压缩后约1.43MB,结构完整、条理清晰,便于按实验顺序逐步学习。目前已有676人学习下载。读者可借助该文档动手完成传递函数与状态空间模型转换、Simulink仿真、二阶系统时域频域特性分析、频率法串联校正等任务,并通过思考题加深对控制系统工作原理的理解,切实提升系统分析与工程实践能力。
1. 从一次“仿真跑通但板子不听话”说起
带过控制理论实验的人都遇到过这种场面:Simulink 里阶跃响应曲线漂亮得能直接贴进报告,可一接到实际电路上,输出要么纹波大得离谱,要么干脆发散。问题往往不在理论,而在建模时把“理想环节”当成了“实际环节”——微分环节的纯微分在物理上根本不存在,PID 的积分电容有漏电流,这些在仿真里全被抹平了。这份《自动控制原理实验:MATLAB 与 MWORKS 建模及系统性能分析》资源,就是冲着这个落差来的。它把六个实验串成一条线:从传递函数建模、时域频域分析,到典型环节电路模拟、频率特性测量,再到串联校正和 EF-Servo 集成滤波。适合正在上控制理论实验课的高年级本科生、研究生,也适合需要快速把 MATLAB 和 MWORKS 两套工具跑通的工程技术人员。下面我按“能跑起来、能改参数、能对上电路”的顺序拆一遍。
2. 环境与工具链:MATLAB 和 MWORKS 怎么分工
2.1 两套工具在实验里的角色划分
这份资源最实在的地方,是没有硬把 MATLAB 和 MWORKS 对立起来,而是按实验类型分工。MATLAB 侧主要承担 Simulink 建模、时域响应求解(step、lsim、initial)和频域绘图(nyquist、bode、margin);MWORKS 侧则用 Julia 语法的TyControlSystems包完成 LTI 模型的建立与转换,包括tf、zpk、ss以及串联、并联、反馈连接。实验一和实验五明确要求两边都做,实验三、四以 MWORKS 为主,实验六回到 MATLAB 做 EF-Servo 集成和滤波。这种安排的好处是:你可以在 MWORKS 里快速验证模型结构,再在 Simulink 里搭出带非线性环节的完整系统。
常见做法是先用 MWORKS 把传递函数、零极点、状态空间三种模型互转一遍,确认系数没抄错,再进 Simulink 拖模块。我一般会建议学生把 MWORKS 当“计算器”用,把 Simulink 当“实验台”用,分工清楚后返工率会低很多。
2.2 MWORKS 侧 LTI 建模的代码骨架
实验一的核心是三种模型互转。下面这段代码把传递函数转成零极点增益模型和状态空间模型,再转回传递函数,用来检查数值精度:
# ex1_3.jl 模型转换与精度检查 using TyControlSystems using TyBase clear; clc() num = 5 den = [1 4 5 2] Gtf = tf(num, den) # 建立传递函数模型 Gzpk = zpk(Gtf) # 转为零极点增益模型 print(Gzpk) Gss = ss(Gtf) # 转为状态空间模型 print(Gss) Gtf1 = tf(Gss) # 再转回传递函数 print(Gtf1)逻辑说明:tf(num, den)里num是分子系数行向量,den是分母系数行向量,按 s 的降幂排列。zpk(Gtf)自动提取零点和极点,无零点时零点向量为空。ss(Gtf)得到的状态空间模型不唯一,不同实现会给出不同的 A、B、C、D 矩阵,但输入输出关系一致。最后tf(Gss)转回来时,你会看到分子分母出现8.88e-16这种量级的系数,这是浮点误差,不是模型错了。
参数说明:num=5表示增益为 5;den=[1 4 5 2]对应 s³+4s²+5s+2。如果换成实验一里的4/(s(s+1)²(s+3)),分母要展开成[1 5 7 3 0],注意常数项为 0 不能漏。
2.3 Simulink 建模的模块选择与连线
实验一第三题要求建立开环传递函数G(s)=2/(s(s+4))的单位负反馈 Simulink 模型。模块清单如下:
| 模块 | 来源库 | 参数设置 |
|---|---|---|
| Step | Sources | Step time=0, Final value=1 |
| Transfer Fcn | Continuous | Numerator=[2], Denominator=[1 4 0] |
| Sum | Math Operations | Signs=+- |
| Scope | Sink | 默认 |
连线顺序:Step → Sum 正端,Sum 输出 → Transfer Fcn 输入,Transfer Fcn 输出 → Sum 负端(构成单位负反馈),同时 Transfer Fcn 输出 → Scope。这里容易翻车的是分母[1 4 0]写成[1 4],少了一个零,系统变成一阶,响应曲线完全不对。仿真时间建议设 10s,步长用默认变步长即可。
3. 时域与频域分析:从阶跃响应到奈奎斯特判据
3.1 二阶系统时域指标的代码化提取
实验二要求改变阻尼比 ζ 和无阻尼振荡频率 ωn,记录上升时间、峰值时间、超调量和调节时间。手工在图上点太慢,用代码批量算更靠谱:
% 二阶系统时域指标批量计算 zita_list = [0, 0.5, 0.707, 1, 1.5]; w = 5; for i = 1:length(zita_list) zita = zita_list(i); num = w^2; den = [1, 2*zita*w, w^2]; G = tf(num, den); [y, t] = step(G); % 超调量 Mp = (max(y) - 1) * 100; % 峰值时间 [~, idx] = max(y); tp = t(idx); % 调节时间(2% 误差带) ts = t(find(abs(y - 1) > 0.02, 1, 'last')); fprintf('zita=%.3f Mp=%.2f%% tp=%.3fs ts=%.3fs\n', ... zita, Mp, tp, ts); end逻辑说明:step(G)返回输出向量y和时间向量t。超调量取最大值减 1 再乘 100。峰值时间取最大值对应的时间点。调节时间用最后一个超出 2% 误差带的时间点近似,严格定义是从该时刻起不再超出,这里取的是保守值。参数说明:zita_list是阻尼比序列,w=5是无阻尼振荡频率。运行后你会看到 ζ=0 时超调量 100%,ζ=1 时超调量接近 0,ζ=1.5 时无超调但响应变慢。
3.2 频域稳定性判断的两种路径
实验二第三题要求用奈奎斯特图和闭环极点两种方法判断稳定性。开环传递函数G(s)=2/(s³+9s²+14s),代码如下:
% 奈奎斯特判据与极点判据对比 num = 2; den = [1 9 14 0]; G = tf(num, den); figure; nyquist(G); % 绘制奈奎斯特图 grid on; % 闭环极点判断 Gcl = feedback(G, 1); p = pole(Gcl); disp('闭环极点:'); disp(p); if all(real(p) < 0) disp('系统稳定'); else disp('系统不稳定'); end逻辑说明:nyquist(G)绘制开环奈奎斯特曲线,判据是看曲线是否包围 (-1, j0) 点。feedback(G,1)得到闭环传递函数,pole返回闭环极点。两种方法结论应一致。参数说明:den=[1 9 14 0]对应 s³+9s²+14s,常数项为 0 表示有一个积分环节。如果奈奎斯特曲线正好穿过 (-1, j0),系统临界稳定,实际中要避免。
3.3 状态空间模型的响应求解
实验二还要求用step和lsim求解状态响应和输出响应。以A=[0 1; -2 -3]、B=[0;1]、C=[1 1]、D=0为例:
% 状态空间模型响应求解 A = [0 1; -2 -3]; B = [0; 1]; C = [1 1]; D = 0; G = ss(A, B, C, D); t = 0:0.5:10; % 零输入响应 x0 = [1; -1]; [yo, t, xo] = initial(G, x0, t); figure; plot(t, xo, ':', t, yo, '-'); legend('状态响应', '输出响应'); % 零状态响应(单位阶跃) u = ones(size(t)); [yu, t, xu] = lsim(G, u, t); figure; plot(t, xu, ':', t, yu, '-'); % 总响应 y = yo + yu; x = xo + xu; figure; plot(t, x, ':', t, y, '-');逻辑说明:initial(G, x0, t)求零输入响应,x0是初始状态向量。lsim(G, u, t)求任意输入下的响应,u必须与t同长度。总响应等于零输入响应加零状态响应,这是线性系统的叠加原理。参数说明:t=0:0.5:10表示从 0 到 10 秒、步长 0.5 秒。如果步长太大,曲线会失真;太小则计算慢,一般取 0.01 到 0.1 之间。
4. 典型环节电路模拟与频率特性测量:仿真和实物怎么对上
4.1 六个典型环节的传递函数与电路参数
实验三和实验四的核心是“电路模拟 + 软件仿真”对照。资源里给了六个环节的电路和传递函数,我整理成表:
| 环节 | 传递函数 | 关键参数 | 注意事项 |
|---|---|---|---|
| 比例 P | K | K=R1/R0 | 纯比例,无动态 |
| 积分 I | 1/(Ts) | T=R0C | 阶跃响应线性上升 |
| 比例积分 PI | K(1+1/(Ts)) | K=R1/R0, T=R0C | 有零点 |
| 比例微分 PD | K(1+Ts) | 近似实现 | 纯微分不可物理实现 |
| 惯性 | K/(Ts+1) | K=R1/R0, T=R1C | 一阶滞后 |
| PID | K(1+1/(Ts)+Td s) | 近似实现 | 积分电容漏电影响大 |
这里最容易被忽略的是 PD 和 PID 的“近似实现”。理想 PD 的传递函数是 K(1+Ts),但电路里用 R1、R2、R3、C 搭出来的是带惯性的近似微分,高频段增益不会无限增大。仿真时如果用理想 PD,阶跃响应在 t=0 处会有一个冲激,实际电路根本测不到。我一般会提醒学生:仿真模型里给 PD 串一个小惯性环节,时间常数取 R3C 的量级,这样曲线才和示波器对得上。
4.2 频率特性测量的代码实现
实验四要求测一阶惯性环节和二阶开环系统的频率特性。用 MWORKS 或 MATLAB 画伯德图:
% 一阶惯性环节频率特性 K = 1; T = 0.2; num = K; den = [T 1]; G = tf(num, den); figure; bode(G); grid on; margin(G); % 显示幅值裕度和相位裕度 % 二阶开环系统频率特性 num2 = 2; den2 = [1 9 14 0]; G2 = tf(num2, den2); figure; bode(G2); grid on; margin(G2);逻辑说明:bode(G)绘制幅频和相频曲线,margin(G)在图上标出幅值裕度、相位裕度和对应的频率。一阶惯性环节的幅频曲线在转折频率 1/T 处下降 3dB,相频从 0° 渐近到 -90°。二阶开环系统因为有一个积分环节,低频段斜率为 -20dB/dec,转折频率处斜率变化。参数说明:T=0.2对应转折频率 5 rad/s。如果实验测得的曲线和仿真对不上,先检查信号发生器输出幅值是否在电路线性范围内,再看示波器探头衰减比是否设对。
4.3 从频率特性曲线反求传递函数
实验四还要求根据测得的频率特性求传递函数。一阶惯性环节的奈奎斯特图是一个半圆,从半圆直径 r(0) 得到 K,从某点频率 ωk 和相角 φ(ωk) 得到 T = tan(φ(ωk))/ωk。实际操作时,取半圆上几个点求平均,比单点更稳。二阶系统则看低频渐近线斜率确定积分环节个数,看谐振峰值和谐振频率估算阻尼比。这部分没有唯一答案,报告里写清楚取点依据就行。
5. 避坑与排查:仿真跑不通时先看这几条
5.1 传递函数系数顺序写反
现象:阶跃响应完全不对,比如应该单调上升却出现振荡。原因:MATLAB 的tf(num, den)要求系数按 s 的降幂排列,有人习惯按升幂写。解决:检查den第一个元素是不是最高次项系数,常数项在最后。比如 s²+3s+2 应写[1 3 2],不是[2 3 1]。
5.2 Simulink 反馈极性接错
现象:输出发散到无穷大。原因:Sum 模块的符号设成了++,变成了正反馈。解决:双击 Sum 模块,把 Signs 改成+-,负端接反馈信号。如果系统本身是正反馈,才用++,但控制实验里绝大多数是负反馈。
5.3 MWORKS 包未加载或函数名冲突
现象:运行tf报错“未定义的函数”。原因:没有using TyControlSystems,或者 Julia 环境里装了同名包。解决:在脚本开头加using TyControlSystems和using TyBase。如果还报错,检查 MWORKS 版本是否包含该包,必要时在包管理器里重新安装。
5.4 仿真步长过大导致曲线失真
现象:响应曲线看起来像折线,峰值被削平。原因:变步长求解器在快速变化段步长太大,或者固定步长设成了 1s。解决:在 Simulink 的 Model Configuration Parameters 里,把 Max step size 改成 0.01 或更小,求解器选 ode45 或 ode23。MATLAB 脚本里t=0:0.5:10的步长 0.5 对快速系统也偏大,改成 0.01。
5.5 实际电路与仿真对不上
现象:仿真超调量 20%,实际电路超调量 50% 且带振铃。原因:运算放大器的带宽限制、压摆率、电容漏电流,以及面包板寄生电容。解决:先确认运放供电电压充足,再在反馈电阻上并联小电容(几 pF 到几十 pF)补偿相位,最后检查接线是否过长。仿真里可以给理想模型串一个小惯性环节模拟运放带宽,时间常数取 1/(2π×GBW) 量级。
6. 二次开发:把实验代码改成自己的分析工具
这份资源的实验代码是很好的起点,但直接拿来交报告有点浪费。我一般会做三件事:参数化、批量化、可视化。
参数化是把硬编码的num、den改成函数入参。比如把二阶系统分析写成一个函数:
function [Mp, tp, ts] = analyze_second_order(zita, w) num = w^2; den = [1, 2*zita*w, w^2]; G = tf(num, den); [y, t] = step(G); Mp = (max(y) - 1) * 100; [~, idx] = max(y); tp = t(idx); ts = t(find(abs(y - 1) > 0.02, 1, 'last')); end批量化是用循环扫参数空间,把结果存成表格。比如 ζ 从 0 到 2、ωn 从 1 到 10,各取 20 个点,算 400 组指标,用heatmap画出超调量随两个参数的变化。这样一眼就能看出哪些区域超调小、响应快,比逐条曲线对比高效得多。
可视化方面,我习惯把奈奎斯特图和伯德图叠在一起看。nyquist判断绝对稳定性,bode看裕度,两者结合能判断系统“离不稳定还有多远”。如果幅值裕度小于 6dB 或相位裕度小于 30°,实际电路大概率会振铃,这时候就要在仿真里加校正环节。
还有一个技巧:把实验五的串联校正和实验六的 EF-Servo 滤波连起来做。先用频率法设计超前校正网络,把相位裕度提到 45° 以上,再在 EF-Servo 模型里加低通滤波抑制高频噪声。校正前后的阶跃响应和伯德图放一起对比,报告的说服力会强很多。
从那以后我每次带实验,都强制学生先跑一遍参数扫描,确认仿真模型在参数边界上不发散,再进实验室接电路。这样至少能排除一半的“玄学”问题。希望帮到你。
本文还有配套的精品资源,点击获取