简介:面向控制科学与工程课程实验教学,这份自动控制原理实验文档系统覆盖控制系统数学建模、时域与频域分析、典型环节动态性能、频率特性测量、系统串联校正及EF-Servo集成与滤波六大主题。每个实验均包含目的、步骤与思考题,适合具有基础控制理论知识的高年级本科生、研究生及工程技术人员对照操作,提升系统分析与动手能力。整个文档包为单个docx文件,大小1.43MB,结构清晰,从MWORKS与MATLAB建模出发,逐步深入到Simulink仿真和频率法校正设计,兼具理论推导与软件实操。已有676人学习,可作为控制类课程实验指导或自学参考,帮助读者在具体算例中掌握传递函数模型转换、状态空间表达、单位负反馈仿真及典型环节特性测量等关键技能。
1. 自动控制原理实验:MATLAB 之外为什么还要 MWORKS
这篇笔记聊的是自动控制原理实验里最常见的任务:用 MATLAB 与 MWORKS 完成建模,再做系统性能分析。很多学校和企业实验室正在把仿真平台从单一 MATLAB 切换到双平台对照,原因是 MWORKS 这类国产建模环境在接口、命令习惯上高度接近 MATLAB,但底层求解器、默认参数并不完全一致。于是出现了一个很有意思的现象:同一个传递函数,两边跑出来的阶跃响应曲线看起来一样,可一旦把超调量、调节时间这些数值精确提取出来,结果就对不齐了。这个问题不是玄学,而是求解器与步长设置造成的。本文把建模路线、最小可运行代码、性能指标提取方法和踩坑点一次性讲清楚,适合正在上控制实验课的学生、刚接触控制系统验证的工程师,以及想评估 MWORKS 能否切入现有仿真流程的团队。
2. 建模路线怎么选:MATLAB 与 MWORKS 的分工、互通与取舍
2.1 先定位:命令行脚本、图形化建模与分析函数的实际差异
自动控制原理实验的建模对象绝大多数是传递函数、零极点模型和状态空间模型。MATLAB 的 Control System Toolbox 提供了 tf、zpk、ss、feedback、step、bode 这一整套命令,生态成熟,资料最多。MWORKS 的建模入口分两条:一条是 m 语言脚本,命令风格与 MATLAB 高度相似;另一条是图形化框图建模,对标 Simulink 的操作习惯,适合搭闭环结构、观察信号走向。
| 工作流环节 | MATLAB 习惯 | MWORKS 习惯 |
|---|---|---|
| 定义传递函数 | tf(num, den) | 同样支持 tf(num, den),部分版本需先加载系统建模工具包 |
| 闭环连接 | feedback(sys, H) | feedback 命令可用,也可在框图中用连线实现 |
| 阶跃仿真 | step(sys) 或 step(sys, t) | 命令相似,但默认求解器可能不同 |
| 频域分析 | bode(sys)、margin(sys) | bode 返回数据格式略有差异,需要留意幅值单位 |
| 结果可视化 | 自动弹窗 | 脚本模式下建议手动 plot,避免图形不刷新 |
我做自动控制原理实验时,习惯把 MATLAB 当“基准答案”,MWORKS 当“交叉验证工具”。不是说 MATLAB 更准,而是两套独立实现的求解器若给出接近的结果,才能确认模型本身没有错误。反过来,如果两边结果差异明显,第一个要怀疑的不是模型,而是求解器设置。初学者容易犯的错是把两个平台当作完全等价的黑匣子,只抄命令不查配置,最终被默认参数坑了。
2.2 实验任务怎么拆:从物理对象到性能指标的固定流程
不管用什么软件,控制实验的完整链条是固定的:物理对象 → 传递函数 → 闭环结构 → 时域仿真 → 频域分析 → 参数整定。我一般先定义一个模拟项目X:某电机调速对象的开环传递函数为 G(s) = 2 / (s(0.1s + 1)),采用单位反馈比例控制,比例增益 K 可调。这个对象简单,却覆盖了稳定性、稳态误差、超调量、相位裕度等几乎所有本科自动控制原理考点。
拆成六步会让实验变得可控:第一步,写出被控对象开环传递函数;第二步,根据控制结构求闭环传递函数;第三步,用阶跃响应看时域指标;第四步,用伯德图看稳定裕度;第五步,调整 K 重复分析;第六步,把指标整理成表格,得出“K 增大后系统变快但稳定性下降”的结论。每一步都有明确产出,比如闭环传函表达式、超调量数值、相位裕度数值。这样建模就不是漫无目的地拖模块,而是每一步都服务于最后的性能结论。
我特别强调一点:先写传递函数再搭框图。原因在于性能分析需要开环传函、闭环传函、误差传函等多个视角,脚本建模可以随时派生表达式,框图上改一处连接往往牵一发动全身。对实验报告来说,脚本里保留传函系数,也更容易复现。
3. 从传递函数到可仿真模型:MWORKS 建模与求解器参数设置
3.1 MWORKS 的最小建模命令:tf 配合 step 跑通阶跃仿真
先给一个可以直接抄的最小例子。假设要分析一个典型欠阻尼二阶系统,自然频率 wn = 2 rad/s,阻尼比 zeta = 0.5。其闭环传递函数的标准形式为 wn^2 / (s^2 + 2zetawn*s + wn^2)。
% 欠阻尼二阶系统建模 wn = 2.0; % 自然频率,决定响应速度 zeta = 0.5; % 阻尼比,小于1时阶跃响应会产生超调 num = [wn^2]; % 分子系数 den = [1, 2*zeta*wn, wn^2]; % 分母系数:s^2 + 2*zeta*wn*s + wn^2 sys = tf(num, den); % 构造传递函数模型 step(sys); % 绘制单位阶跃响应 grid on;这段代码在 MATLAB 里可以直接运行。在 MWORKS 中,绝大多数版本同样支持 tf 和 step 命令,但如果命令行提示找不到 tf,说明当前工作区没有加载系统建模工具包,需要先通过工具包管理器加载,这一步经常被忽略。代码里的 wn 和 zeta 是仅有的两个物理参数,改它们就能观察阻尼比变化对超调量的影响。注意第 5 行的分母系数构造方式,2zetawn 是中间项系数,初学者最容易漏掉这个 2 倍关系,漏掉后得到的完全是另一个系统。
3.2 图形化建模:搭一个闭环二阶系统并设置求解器参数
脚本建模适合快速验证,图形化建模适合观察信号流向。MWORKS 的框图建模和 Simulink 操作逻辑一致:从模块库拖出两个积分器、两个增益模块、一个加法器、一个阶跃信号源和一个示波器。第一个积分器输入是误差信号,输出是速度信号;第二个积分器串联其后,输出是位置信号;位置信号通过反馈增益模块回到加法器的负输入端,与参考输入做差后形成误差。
| 模块/参数 | 推荐设置 | 作用 |
|---|---|---|
| 积分器1 初始值 | 0 | 对应初始速度为零 |
| 积分器2 初始值 | 0 | 对应初始位置为零 |
| 前向增益 | 10 | 对应开环增益中的比例系数 |
| 反馈增益 | 1 | 单位反馈,简化分析 |
| 求解器步长 | 0.01 或 auto | 固定步长更适合对比实验 |
| 相对容差 | 1e-6 | 越小越精确,但仿真耗时变长 |
图形化建模最大的优势是直观,但参数藏在模块属性里,容易改了一个增益却忘了改另一个。我一般会在模型文件的描述栏里写明“模拟项目X:电机调速对象”,把开环传函的推导过程放在注释里,这样一周后再打开模型还能迅速进入状态。求解器参数建议首次就固定为变步长加相对容差 1e-6,避免后续结果对比时引入变量。
3.3 求解器步长与容差:为什么同样模型两个平台结果不同
两个平台跑同一个传递函数模型,结果不完全一致是常态,根因在数值求解。MATLAB 的 step 默认使用变步长求解器,MWORKS 某些版本对传递函数模型的默认步长策略不同;当系统响应存在快速变化段时,步长差异会直接体现在峰值上。
| 仿真配置 | 超调量(示意值) | 峰值时间(示意值) |
|---|---|---|
| 固定步长 0.01s | 15.2% | 1.58s |
| 固定步长 0.001s | 16.1% | 1.57s |
| 变步长 + 相对容差 1e-6 | 16.3% | 1.56s |
上表数据说明,步长越粗,峰值附近越容易被“削平”,超调量看起来偏小,峰值时间偏大。所以做性能分析前,先明确数值环境比纠结模型本身更重要。我的习惯是:对比实验统一用固定步长 0.001s,或者统一变步长加相同容差,确保差异只来自系统和参数,而不是求解器。
4. 系统性能分析怎么做:时域指标、频域裕度与参数联动
4.1 从阶跃响应里读超调量、峰值时间与调节时间
阶跃响应是自动控制原理实验最核心的时域分析工具。用 step 获取响应数据后,手动提取指标比肉眼读图可靠得多。下面这段代码从响应数据中计算超调量、峰值时间和调节时间。
[y, t] = step(sys, 0:0.001:10); % 指定细采样时间向量,避免漏掉峰值 yss = y(end); % 稳态值取末点 peak = max(y); % 峰值 Mp = (peak - yss) / yss * 100; % 超调量百分比 [~, idx] = max(y); % 峰值索引 tp = t(idx); % 峰值时间 % 调节时间:响应进入稳态值 ±2% 误差带后不再超出 tol = 0.02 * yss; idx_settle = find(abs(y - yss) >= tol, 1, 'last'); ts = t(idx_settle);代码中时间向量步长取了 0.001s,这比固定步长 0.01s 密集一个数量级,峰值点不容易丢。稳态值直接取 y(end),对二阶系统是合理的,但前提是仿真时长足够长,否则系统还没真正稳态,取末点会偏小。调节时间的计算用 find 找最后一个超出误差带的点,如果 ts 为空,要么仿真时间不够长,要么系统本身不收敛,需要先检查 y(end) 与 yss 的偏差。
4.2 从伯德图看相位裕度与幅值裕度:margin 的细节
频域分析的工程落点是稳定裕度。相位裕度代表系统在临界失稳前还能承受多少相位滞后,幅值裕度代表增益还能放大多少倍而不失稳。工程经验是相位裕度在 45° 到 60° 之间、幅值裕度大于 6dB 时,系统兼顾稳定性和响应速度。
w = logspace(-2, 3, 500); % 频率范围 0.01~1000 rad/s,共500个点 [mag, phase, wout] = bode(sys, w); mag_dB = 20 * log10(mag(:)); % 幅值转为分贝 phase_deg = phase(:); % 相位转为列向量 figure; subplot(2, 1, 1); semilogx(wout, mag_dB); grid on; ylabel('幅值 (dB)'); subplot(2, 1, 2); semilogx(wout, phase_deg); grid on; ylabel('相位 (deg)'); xlabel('频率 (rad/s)');bode 返回的 mag 是线性幅值,不是分贝,这一点最容易翻车。很多同学直接 plot(mag),看到曲线形态怪怪的才想起单位问题。频率向量用 logspace 生成,覆盖 0.01 到 1000 rad/s,确保低频段、穿越频率附近和高频段都有足够的数据点。如果相位曲线在高频段乱跳,先把频率点数从 500 提高到 1000,再用 minreal 对模型做零极点对消,能去掉数值残差带来的噪声。
4.3 性能指标和控制器参数的联动:一次实验看透规律
把时域和频域指标放在一张表里看,自动控制原理的“系统性能分析”才算真正完成。下面的规律表适用于绝大多数单位反馈二阶系统,也是实验报告里最值得写的一段分析。
| 参数变化 | 超调量 | 峰值时间 | 稳态误差 | 相位裕度 |
|---|---|---|---|---|
| 比例增益 K 增大 | 增大 | 减小 | 减小 | 减小 |
| 阻尼比 zeta 增大 | 减小 | 增大 | 基本不变 | 增大 |
| 自然频率 wn 增大 | 基本不变 | 减小 | 基本不变 | 基本不变 |
这三行规律对应三个经典结论:比例增益能压稳态误差,但过度增大必然牺牲稳定性;阻尼比是超调量的直接控制旋钮;自然频率主要影响响应快慢。做实验时先跑一组 K=1、2、4、8 的阶跃响应,再用 margin 看相位裕度,就能直观看到 K 增大到某个值后相位裕度跌到 30° 以下,系统的振荡开始加剧。这个联动关系比单纯记公式有用得多。
5. 建模与仿真避坑指南:结果对不上的 5 个常见原因
5.1 命令行执行 step 后没有图形窗口弹出
现象:在 MWORKS 脚本里执行 step(sys),命令行没有报错,但不弹出响应曲线窗口。原因:部分版本的脚本模式下,绘图命令没有自动创建图形句柄,或者图形后端未初始化。解决:改成先执行 figure 再手动绘图,用 [y,t] = step(sys) 获取数据后用 plot(t,y) 绘制。
figure; [y, t] = step(sys, 0:0.001:10); plot(t, y); grid on;这个坑看起来小,实际卡住过不少人。尤其是初学者对照 MATLAB 教程敲代码时,以为支持 step 就支持自动弹窗,结果漏看平台差异。手动绘图还有一个额外好处:可以自由控制坐标范围、标注指标点,实验报告配图更清晰。
5.2 超调量数值明显低于理论值
现象:理论超调量按公式计算是 16.3%,仿真提取出来只有 14.8%。原因:仿真时间向量步长太粗,阶跃响应的真实峰值点落在两个采样点之间,被漏掉了。解决:把时间向量步长从 0.01 改成 0.001,或者直接使用变步长求解器并设置相对容差 1e-6。
我遇到过不少实验报告因为这个原因被扣分,结论是“系统超调量不达标”,实际上系统完全达标,只是采样太粗。数值分析里这叫峰值截断误差,控制仿真里同样存在。以后凡是提取超调量,先检查峰值附近的采样点数有没有超过 10 个点。
5.3 MATLAB 和 MWORKS 跑同一个 sys,阶跃响应不重合
现象:两个平台跑同一组传递函数系数,阶跃响应曲线整体趋势一样,但超调量差了零点几个百分点。原因:两边默认求解器不同,步长控制策略和误差容差不一样。解决:两边统一仿真配置,固定步长都设为 0.001s,或者都使用变步长并设置相同的相对容差。
做双平台对照实验时,统一数值环境是第一步。我见过有人花大量时间查模型是不是写错了,最后发现只是求解器设置不一致。这个坑提醒我们:仿真结果的差异不等于模型错误,先排除数值配置差异,再怀疑建模问题。
5.4 反馈回路出现代数环报错
现象:图形化建模中直接连接反馈信号到加法器,仿真时报代数环错误。原因:反馈路径上没有任何状态环节,信号在同一个仿真步内形成循环依赖,求解器无法确定计算顺序。解决:在反馈回路中插入一个 Memory 模块或延迟一个仿真步,或者把反馈关系直接折算进传递函数,绕开代数环。
脚本建模很少遇到代数环,因为传递函数表达式天然规定了计算顺序。图形化建模更容易踩中。如果实验任务本身不是研究纯延迟系统,我倾向于用脚本建模代替图形化,省掉这个麻烦。
5.5 伯德图高频段相位曲线抖动
现象:相位曲线在 100 rad/s 以后出现锯齿状抖动,与手绘渐近线差异明显。原因:频率响应数值计算在高频段遇到零极点对消后的残差,或者频率点数量不足。解决:用 minreal 化简模型后再画 bode,同时把频率向量点数提高到 1000。
sys_simp = minreal(sys); w = logspace(-2, 4, 1000); bode(sys_simp, w);minreal 会把分子分母中相同的因子约掉,消除数值残差。这个操作在理论分析里可有可无,但在数值计算里非常关键。频率范围选到 10^4 是为了覆盖比穿越频率高一到两个数量级的区域,确保高频渐近线看得完整。
6. 进阶技巧:批量扫参、理论对拍与一键生成实验报告
把单次仿真扩展成批量扫参,是性能分析从“看一条曲线”升级到“看一个规律”的关键一步。下面的脚本对比例增益 K 做循环,自动计算每个 K 下的超调量、峰值时间、稳态误差,最后生成结果表。
K_list = [1, 2, 4, 8]; wn = 2; zeta = 0.5; report = []; for K = K_list sys = tf(K * wn^2, [1, 2*zeta*wn, wn^2]); [y, t] = step(sys, 0:0.001:6); yss = y(end); Mp = (max(y) - yss) / yss * 100; [~, tp_idx] = max(y); tp = t(tp_idx); err = 1 - yss; report = [report; K, Mp, tp, err]; end disp(array2table(report, 'VariableNames', {'K', 'Mp_pct', 'Tp_s', 'Ess'}));跑完这段代码会得到一张四行五列的表格,K、超调量、峰值时间、稳态误差一眼看全。注意表格里的 Ess 是闭环稳态误差的近似值,前提是闭环系统收敛稳定。如果某个 K 下系统已经振荡发散,y(end) 没有意义,需要先判断 stability。
批量扫参之后,再加一道验证工序:把仿真结果和理论公式对拍。二阶系统超调量理论公式为 exp(-pi*zeta/sqrt(1-zeta^2))*100,可以用它检查仿真值是否在合理误差范围内。
Mp_theory = exp(-pi * zeta / sqrt(1 - zeta^2)) * 100;理论对拍的作用是防止“仿真跑通了但结果错了”。我习惯在实验报告里同时列出仿真值和理论值,两者偏差控制在 1% 以内说明模型和数值配置都可信,超过 3% 就要排查采样步长或模型结构。这个习惯帮我避免过一次大翻车:某次实验因为反馈回路接错位置,阶跃响应看起来很正常,但超调量比理论值大了近一倍,就是对拍公式时发现异常的。
再进一步,可以把结果表导出为 CSV,用外部脚本绘制趋势图,这样实验报告的核心数据自动生成,不用手动抄数。自动化之后,每次改参数只需重跑脚本,整个实验从半小时压缩到两分钟。我现在的习惯是:所有性能分析脚本都保留参数列表和结果表两个文件,参数列表记录这次实验的 K、wn、zeta,结果表记录对应指标,确保一周后、一个月后还能复现当时的结论。希望这个工作流能帮到你,至少能让你少走几次“结果对不上”的弯路。
本文还有配套的精品资源,点击获取