简介:面向测控技术与仪器本科生及自动化初学者的自动控制原理仿真实验与系统校正任务书,以MATLAB和Simulink为核心工具,围绕控制系统性能分析和自动控制系统校正两大实验展开,覆盖时域与频域分析、超前/滞后/PID校正等典型策略。文档源自课程教学配套,供课堂辅助、个人研究或综合实验参考。资源共1个PDF文件,压缩包约418KB,内容为完整实验指导与报告要求,包含实验目的、任务、步骤、报告规范,并附具体传递函数示例与参数设计实例。已有166人学习下载。读者可通过该资料快速掌握系统建模、Bode图与Nyquist图分析、阶跃响应与斜坡响应评估等方法,并在飞行控制、过程控制等场景中完成校正装置设计与仿真验证,提升将理论应用于工程实践的能力。
1. 从传递函数到仿真:为什么MATLAB/Simulink成了自动控制原理的默认实验台
自动控制原理这门课,学生最容易卡住的不是拉普拉斯变换,而是拿到一个实物对象之后不知道如何把课本上的二阶系统、相角裕量、校正网络这些概念落到可测量的响应曲线上。MATLAB的Control System Toolbox和Simulink恰好把这个过程压缩成了“写传递函数—画响应—读指标—调参数”的闭环。我帮学生调试过不少这类实验报告,发现多数问题不在理论,而在对MATLAB函数边界条件不熟:比如step返回的数据点默认不包含终值误差,margin对非最小相位系统的输出解读也容易出错。这篇内容以自动控制原理的经典实验任务为主线,覆盖时域性能分析、频域稳定性判断、超前/滞后/PID校正设计,以及Simulink建模验证,适合测控、自动化、电气专业本科生做课程实验时直接对照复现,也对需要快速搭建控制方案验证的工程师有参考价值。
2. 时域性能分析:用Control Toolbox与Simulink复现二阶系统阶跃响应
2.1 建立系统模型的三条路径:tf/zpk/ss与Simulink拖拽
实验一中要求“掌握在MATLAB命令窗口建立系统模型的方法”。常见做法是使用tf函数直接根据传递函数分子分母构建模型。以标准二阶系统为例,其闭环传递函数为:
wn = 1; % 自然频率 omega_n = 1 rad/s zeta = [0.1:0.1:1]; % 阻尼比从0.1到1,步长0.1 sys_cell = cell(1, length(zeta)); for i = 1:length(zeta) num = wn^2; % 分子部分 den = [1, 2*zeta(i)*wn, wn^2]; % 分母多项式系数 sys_cell{i} = tf(num, den); endden中三个系数分别对应s²、s一次项和常数项,顺序是从最高次到最低次。如果系统是以零极点形式给出的,可以用zpk([], [-p1 -p2], k);状态空间模型则用ss(A,B,C,D)。三者之间用ss(sys)或tf(sys)可以互相转换,这在实际工程中很关键,因为频域响应计算要求模型是传递函数形式,而仿真求解器内部更偏好状态空间形式。
Simulink里建模更直观:从Continuous库拖一个Transfer Fcn模块,把分子分母填进去即可。我一般会设置一个To Workspace模块获取仿真数据,并用sim()函数从脚本启动仿真,这样便于批量修改参数。
参数说明:zeta是阻尼比向量,如果系统要求从0.1到1逐个变化,步长通常取0.1;wn是自然频率,题目中给定1 rad/s。若将zeta改为对数分布,可以更细腻地观察欠阻尼到过阻尼的过渡,但同图绘制时需要特别注意图例顺序。
2.2 阻尼比从0.1到1:批量仿真与响应曲线标注
实验任务要求把不同阻尼比的阶跃响应画在同一张图上,并加标注。直接用step循环绘制即可,但要注意两点:一是为每条曲线设置DisplayName,二是用hold on保持图形叠加。
figure; hold on; for i = 1:length(zeta) step(sys_cell{i}, 30, 'DisplayName', ['\zeta = ', num2str(zeta(i))]); end legend('Location', 'east'); xlabel('Time (s)'); ylabel('Amplitude'); title('二阶系统单位阶跃响应 (\omega_n = 1)'); grid on;step(sys, t)的第二个参数t是仿真时间向量,这里用30秒保证zeta很小(0.1)时稳态也能达到。观察结果:zeta=0.1时超调量接近73%,峰值时间约3.1秒,振荡衰减非常慢;zeta增大到0.7左右时基本无超调,zeta=1时刚好进入临界阻尼。如果仿真结果发散,优先检查step默认时间是否太短,或者传递函数分母是否写成了s^2+2*zeta*s+wn^2(这一项必须完整,漏掉s系数会直接变成一阶系统)。
对于Simulink批处理,可以在脚本里用循环改变Transfer Fcn模块的参数:
for i = 1:length(zeta) set_param('model/Transfer Fcn', 'Numerator', '[1]', 'Denominator', ['[1 ', num2str(2*zeta(i)*wn), ' ', num2str(wn^2), ']']); sim('model'); plot(tout, yout, 'DisplayName', ['zeta=', num2str(zeta(i))]); endset_param中的系数必须用空格分隔的字符串,且不能有分号。这种批处理方式比step循环慢,但胜在可以验证Simulink模型本身是否正确。
2.3 动态性能指标提取:t_r、t_p、M_p、t_s的计算脚本
实验一第二个任务是评估单位反馈系统G(s)=(0.4s+1)/(s^2+s+1)的动态性能指标。教材上手工计算超调量和峰值时间很简单,但调节时间需要解对数方程,容易算错。用MATLAB的stepinfo一条命令搞定:
G = tf([0.4, 1], [1, 1, 1]); sys_cl = feedback(G, 1); % 单位负反馈闭环 info = stepinfo(sys_cl); fprintf('上升时间 tr=%.4f s\n', info.RiseTime); fprintf('峰值时间 tp=%.4f s\n', info.PeakTime); fprintf('超调量 Mp=%.2f %%\n', info.Overshoot); fprintf('调节时间 ts=%.4f s\n', info.SettlingTime);feedback(G,1)默认做负反馈,传回的是闭环传递函数。stepinfo默认按终值的2%误差带计算调节时间,可以通过'SettlingTimeThreshold', 0.05改成5%误差带。注意,RiseTime对欠阻尼系统定义为从10%到90%的时间,与教材常用定义略有差异,报告里需要说明这一点。
如果题目给的闭环传递函数已经包含零点(比如本系统零点在s=-2.5),零点的存在会加快上升时间但增大超调量,单靠stepinfo只能看到数值,要结合零极点图解释原因——零点相当于给系统输入一个脉冲分量,相当于提前“推动”响应,这是分析报告中值得写的点。
2.4 频域指标与Bode图:从快速估读到真值
实验一的第三、四题要求绘制Bode图,读增益裕量和相位裕量。MATLAB的margin函数能直接返回裕量数值:
G1 = tf(1, [1, 2, 3, 2]); % K=1时的开环传递函数 [Gm, Pm, Wcg, Wcp] = margin(G1); disp([Gm, Pm, Wcg, Wcp]);Gm是增益裕量(绝对值,不是dB值),Pm是相位裕量(度),Wcg是相角穿越频率,Wcp是截止频率。如果margin不加输出参数,会直接画出Bode图并在图上标注裕量位置。对K=1,3,5分别计算,会发现K越大,幅频曲线整体上移,相位裕量变小,系统越接近临界稳定。中频段斜率越陡(比如-60dB/dec穿过0dB),相位裕量越小,对应的时域超调量越大,这就是中频段特性与动态性能的关系。
注意margin函数对非最小相位系统的相位裕量计算有时会给出负值或错误提示。此时应改用bode自己画图、用find手动定位相角穿越点,而不是盲信margin。
3. 频域分析实战:Bode图、奈氏图与稳定裕度计算
3.1 用bode/margin绘制并解读稳定裕量
频域分析的核心是理解“裕量”的含义。增益裕量是相位穿越-180°时系统还能忍受的增益倍数,相位裕量是增益穿越0dB时系统距离-180°的余量。MATLAB中bode是基本绘图函数,但工程中我更推荐bodeplot,因为它的句柄可以精细调整曲线样式:
G = tf(1, [1, 2, 3, 2]); bodeplot(G, {0.01, 100}); grid on;频率范围用{0.01, 100}指定,单位是rad/s。读裕量时用margin(G)最省事,但建议同时画出网格线,以便肉眼验证margin是否选对了频率点——我遇到过Wcg因为数值近似误差出现跳动的情况,尤其是存在多个相角穿越点时。
对比不同K值的Bode图时,可以这样组织代码:
K = [1, 3, 5]; figure; hold on; for i = 1:3 G = tf(K(i), [1, 2, 3, 2]); bodeplot(G, {0.01, 100}); end但bodeplot默认每个对象会清空前一个图,需要先hold on且设置颜色。更稳妥的做法是用bode循环绘制,并以'--'等线型区分。
3.2 中频段特性与时域动态性能的对应关系
实验要求分析“中频段特性与时域动态性能的关系”。中频段一般指截止频率附近±1个十倍频程的区域。若中频段斜率是-20dB/dec,系统相位裕量通常较大(约45°以上),时域超调量小;若斜率是-40dB/dec,相位裕量约在0~30°之间,超调量显著增大;若是-60dB/dec,系统往往不稳定。我常用bode图叠加margin数据来验证这一点。
以K=1为例,开环传递函数G(s)=1/(s^3+2s^2+3s+2)的相角裕量约46°,对应阶跃响应超调量约20%左右。K增大到5时,相位裕量降到约20°,超调量超过50%。这个对应关系可以用一个经验换算公式粗略估计:(\zeta \approx Pm/100),当Pm为45°时,zeta≈0.45,超调量约为20%,和仿真结果接近。公式只对二阶主导极点系统适用,高阶系统会有偏差,但作为快速判断方向足够。
3.3 用奈氏图验证稳定性判断
奈氏图(Nyquist)是通过开环频率特性判断闭环稳定性的图形工具。MATLAB的nyquist函数自动绘制完整曲线,但对初学者来说最容易犯的错是忘记看包围(-1,j0)点的圈数。对于单位反馈系统,可以用nyquist绘制的数据自行判断:
G = tf(1, [1, 2, 3, 2]); [re, im] = nyquist(G, {0.01, 100}); N = -1; % 包围-1点的次数,通过人工数曲线穿越-180°的次数严格的做法是调用nyquist后检查实部小于-1的区间内虚部变号次数。MATLAB没有直接内置N的计算函数,但可以从re和im中提取。实验报告中不必写复杂脚本,只需在奈氏图右上角标注“绕(-1,0)逆时针一圈”或“不包围”即可。
奈氏图和Bode图的结论应该一致。如果Bode图显示增益裕量>1且相位裕量>0,奈氏图必然不包围(-1,j0)。我建议在报告中并列三张图(Bode、Nyquist、阶跃响应),形成“频域指标→时域表现”的证据链。
4. 控制系统校正:超前、滞后、滞后-超前与PID设计
4.1 校正设计的基本思路与MATLAB工具选择
实验二的核心是设计串联校正装置,常用的类型包括超前校正、滞后校正、滞后-超前校正和PID校正。设计前提是先确定期望指标:静态误差系数、相位裕量、截止频率。MATLAB里没有一键设计校正器的官方函数(Control System Toolbox的rltool是自动调参工具,但作业需要手算步骤),因此多数做法是用bode辅助人工试算。
设计超前校正的标准步骤:
- 根据静态误差系数要求确定系统开环增益K。
- 用
margin求出未校正系统在K下的相位裕量Pm0。 - 计算需要补偿的最大相角 (\phi_m = \gamma_{req} - Pm0 + \epsilon),其中ε为留量,一般加5°~12°。
- 由 (\alpha = (1-\sin\phi_m)/(1+\sin\phi_m)) 求分度系数α。
- 选择校正器零点时间常数T,使校正后截止频率处超前网络提供最大相角。
以题目给的 (G(s)H(s)=1/[s(0.1s+1)(0.02s+1)(0.01s+1)(0.005s+1)]) 为例,要求 (K_v=200),即开环增益K=200。先验证未校正时的相位裕量:
Kv = 200; G0 = tf(1, conv([1,0], conv([0.1,1], conv([0.02,1], conv([0.01,1], [0.005,1]))))); G = tf(Kv*1, G0.den{1}); % 直接构造含增益的传递函数 margin(G);注意conv是级联函数,用于多项式乘法。这里G0.den{1}提取分母系数,再用tf乘以Kv。运行后会发现未校正的相位裕量大约在17°左右,截止频率较高,直接加超前校正是合适的。
4.2 超前校正设计实例:从指标到参数落地
设计代码如下,先算出需要补偿的角度:
req_gamma = 45; % 设计相位裕量 [Gm0, Pm0] = margin(G); epsilon = 8; % 留量 phi_m = req_gamma - Pm0 + epsilon; alpha = (1 - sin(phi_m*pi/180)) / (1 + sin(phi_m*pi/180)); % 然后在未校正系统的截止频率位置附近调整下一步是选择新的截止频率,使校正后的幅频曲线在该频率处以-20dB/dec穿越0dB。常见做法是找未校正系统幅值等于-10*lg(1/alpha)的频率点,用bode数据插值得到:
[mag, phase, w] = bode(G, {0.1, 1000}); mag_db = 20*log10(squeeze(mag)); target_db = 10*log10(alpha); [~, idx] = min(abs(mag_db - target_db)); wc_new = w(idx); T = 1/(wc_new*sqrt(alpha)); Gc = tf([alpha*T, 1], [T, 1]); % 超前校正器参数说明:alpha是分度系数,小于1;T是校正器的分子时间常数。校正后系统为G*Gc,用margin(G*Gc)验证是否满足相位裕量≥45°。如果不足,增大ε或重新选择α迭代。这种设计方法本质上是“看图调参”,熟练后很快能收敛。
4.3 滞后-超前校正与PID参数整定
当系统同时需要提高稳态精度和相角裕量时,滞后-超前校正更合适。滞后部分降低低频增益,不影响中频段相角;超前部分提升中频段相位裕量。设计时可拆分为两步:先用滞后网络把中频段幅值压低,再用超前网络补相位。
PID校正的参数整定在MATLAB里常用pidtune或sisotool。以纯滞后过程控制为例(题目图中有延时τ),当τ=10时手动整定PID比较费时,可以先用临界比例度法(Ziegler-Nichols)得到初值:
% 假定被控对象为带延时的惯性系统,这里用一阶惯性+纯滞后近似 P = tf(1, [T1, 1], 'InputDelay', tau); % T1为对象时间常数 [Kp,Ki,Kd] = pidZeiglerNichols(P); % 自编函数但ZN法对纯滞后大的系统容易产生超调,我一般改用稳定边界法,先用pidtune自动寻优:
P = tf(1, [10, 1], 'InputDelay', 10); % 示例对象 C = pidtune(P, 'PID', 0.2); % 0.2为期望带宽pidtune返回校正器C,再通过feedback(P*C,1)做时域仿真检验。该函数对带延时的系统同样适用,但需要确保InputDelay设置正确,否则模型会强行忽略延时,导致整定结果不可用。
4.4 Simulink中搭建校正前后对比模型
Simulink里做校正对比实验比纯脚本更直观。搭建方式:拖入两个Transfer Fcn模块,一个填未校正开环传递函数,另一个填校正器与对象级联后的传递函数;加法器连接到负数反馈,Scope显示阶跃响应。
若校正器是PID,直接用PID Controller模块,双击填入Kp、Ki、Kd。要注意PID模块的初始条件和输出限幅会影响仿真结果,尤其对带有积分环节的对象,积分饱和会导致响应振荡。此时应在PID模块后加Saturation模块,并选择“反算限幅”抗饱和方式。
参数如何填入:Transfer Fcn模块的Numerator和Denominator用向量表示。级联对象(如(G=200/[s(0.1s+1)(0.02s+1)(0.01s+1)(0.005s+1)]))展开多项式的系数向量较长,可以直接在MATLAB里用get命令提取:
G_combined = G*Gc; [num, den] = tfdata(G_combined, 'v');然后写入Simulink模块。'v'参数使tfdata返回数值向量而不是元胞数组,直接用于set_param。
在报告中,我会把校正前后的Bode图、阶跃响应曲线上下排布,标注校正前相位裕量17°、校正后45°。这种对比图是实验报告得高分的关键。
5. 结合工程应用的进阶技巧与验证方法
5.1 用stepinfo批量评估阶跃响应性能
前面已经用过stepinfo单次调用,如果想对多种校正方案(超前、滞后-超前、PID)做批量对比,可以用表格函数汇总:
configs = {'未校正', '超前', '滞后-超前', 'PID'}; ts_all = zeros(4,1); Mp_all = zeros(4,1); for i = 1:4 sys_i = feedback(G_cl{i}, 1); info = stepinfo(sys_i); ts_all(i) = info.SettlingTime; Mp_all(i) = info.Overshoot; end T = table(configs', ts_all, Mp_all, 'VariableNames', {'方案', '调节时间', '超调量'});注意feedback(G_cl{i},1)要求G_cl是开环传递函数,若模型已是闭环,直接用stepinfo即可。表格输出到命令窗口时用disp(T),写报告时可以直接截图。
5.2 纯滞后系统的PID参数整定技巧
对含有纯滞后环节的PID整定,我惯用的方法是SMITH预估器的简化替代:先不管滞后,用pidtune调好PID,然后引入滞后并缩小比例增益10%~20%,因为纯滞后会降低相位裕量。例如前面示例中对象为(G(s)=e^{-10s}/(10s+1)),不带延时时PID参数可能是Kp=0.8, Ki=0.04, Kd=2,加入10秒延时后手动把Kp降到0.65,同时增大Ki以补偿稳态误差,再通过Simulink仿真微调。
验证时除了看阶跃响应,还可以观察输入扰动下的恢复时间。对延时大的系统,过大的Kd会放大高频噪声导致控制量抖振,此时应限制微分增益或改用低通滤波器。MATLAB中PID Controller模块的滤波系数N(滤波器时间常数倒数)默认100,实际工程建议降到20~50,曲线会更平滑。
5.3 从Bode图到模拟电路元件参数的换算
实验二第二题要求设计模拟电路校正器并确定元器件参数。一种常见的超前校正电路是运放加RC网络,其传递函数为:
[ G_c(s) = \frac{R_2}{R_1} \cdot \frac{1 + R_1 C s}{1 + R_2 C s} ]
如果上面设计出的超前校正器为(G_c(s) = \alpha(1+Ts)/(1+\alpha Ts)),可以令(R_1 C = T),(R_2 C = \alpha T),再取合理电容值(如10μF)反算电阻:
T_val = 0.25; % 示例数值 alpha_val = 0.1; C_val = 10e-6; R1 = T_val / C_val; R2 = alpha_val * T_val / C_val;这样算出的电阻可能不是标准系列值,工程中应选择一个接近于R1的标准值(比如E24系列),然后重新验算Bode图是否满足裕量要求。电阻值偏高时还要注意运放输入偏置电流的影响,但这在理论实验报告中通常不必仿真。
最后一个实用验证技巧:用bode同时画出校正器单独、校正前和校正后的三条曲线,使用不同颜色和线宽,并调用legend标注。如果校正后幅值曲线在截止频率附近斜率比校正前平缓(由-40变为-20dB/dec),说明相角裕量确实提升了,这与margin的计算结果一致。整个实验报告按这个顺序组织,既覆盖了理论推导,又保留了可复现的代码,遇到导师追问参数依据时也能直接拿出对应脚本说明。
本文还有配套的精品资源,点击获取