尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

直流他励电动机单闭环调速系统MATLAB仿真实验指南

直流他励电动机单闭环调速系统MATLAB仿真实验指南 简介这份PDF手册面向电气工程、自动化及相关专业学生围绕直流他励电动机与单闭环调速系统提供两个Simulink仿真实验指导适合课程作业或项目实践。实验一聚焦电枢串联电阻启动要求搭建仿真模型、观测并分析转速与转矩特性并对比不同电阻参数实验二涵盖有静差/无静差转速负反馈调速系统重点分析负载突变时转速、电压、电流的变化并调节Kp、Ki参数进行对比帮助读者深入理解电机启动特性与调速控制原理。资源包共1个文件为230KB的PDF文档含详细的仿真要求、参考模型示意图及实验提交规范可直接按步骤完成实验并整理报告。已有64人学习下载适合具备MATLAB/Simulink基础操作、希望提升控制理论应用能力的学生参考使用。1. 2024年MATLAB仿真实验从哪里下手直流他励电动机与单闭环调速系统2024年MATLAB仿真实验里直流他励电动机与单闭环调速系统是电力拖动与控制类课程最常见的一道综合题。很多人拿到指导手册后第一反应是打开 Simulink 拖模块结果调了半天转速不收敛、超调对不上教材数据最后只能把波形截图交上去。这个问题通常不在 MATLAB 本身而在建模和闭环设计之间缺了一步没有先把电机方程写成足够清晰的传递函数和状态方程就直接搭了反馈回路。这篇写的是我一般替学生梳理的完整路径先列电机方程、再写出可复现的 MATLAB 脚本和 Simulink 结构最后用阶跃响应、负载扰动和线性化工具把单闭环调速系统的行为验证到位。适合正在做课程实验、或者想把手写直流调速系统搬进仿真平台验证一遍的人。整个过程不依赖特定 MATLAB 版本R2021b 之后的常规安装都能直接跑通。2. 直流他励电动机建模电枢回路方程、机械方程与传递函数2.1 先写方程再写代码他励直流电机的数学模型直流他励电动机的建模并不复杂但容易在单位上翻车。取电枢电流i和转子转速ω为状态变量电枢回路方程为Ua Ra*i La*(di/dt) Ke*ω其中Ra是电枢电阻La是电枢电感Ke*ω是反电动势。机械运动方程为Ke*i J*(dω/dt) TL这里的Ke在 SI 单位制下同时是反电动势系数V·s/rad和转矩系数N·m/A数值相同。很多教材用 r/min 表示转速此时反电动势公式写作E Ce*φ*n转矩写作T CT*φ*iCe和CT之间差了60/(2π)的关系。写 MATLAB 脚本时混用这两套单位得到的开环增益会差一个常数这是仿真结果对不上的第一类原因。把上面两个方程整理成传递函数忽略负载扰动TL时从电枢电压Ua到转速ω的传递函数是G(s) (1/Ke) / (τm*τa*s² τm*s 1)其中τa La/Ra是电磁时间常数τm J*Ra/Ke²是机电时间常数。这个二阶传递函数是后面所有闭环设计的基础单闭环调速系统的 PI 参数就是针对它整定的。注意这个模型没有积分环节所以开环稳态时电压给定和转速输出只差一个1/Ke的比例关系负载一变转速就会掉下去这正是要加闭环的理由。2.2 用 MATLAB 脚本把电机参数转成传递函数以下是我在仿真实验里常用的电机参数组对应一台额定电压 220V、额定转速 1500r/min 左右的直流他励电动机模型参数符号取值单位电枢电阻Ra2Ω电枢电感La0.05H反电动势/转矩系数Ke1.5V·s/rad转动惯量J0.5kg·m²额定负载转矩TL20N·m把参数写进脚本时我习惯先用一个独立的模型文件保存再统一转成传递函数Ra 2; % 电枢电阻Ω La 0.05; % 电枢电感H Ke 1.5; % 反电动势系数V·s/rad J 0.5; % 转动惯量kg·m^2 TL 20; % 负载转矩N·m ta La / Ra; % 电磁时间常数0.025 s tm J * Ra / Ke^2; % 机电时间常数约 0.444 s s tf(s); G (1/Ke) / (tm*ta*s^2 tm*s 1); G.InputName Ua; G.OutputName w; step(G, 3); grid on;这里tf(s)声明拉普拉斯算子之后搭建 PI、闭环反馈都直接对这个G做运算比手动展开多项式系数更不容易写错。ta和tm分开计算是为了后面分析带宽时能看出哪个时间常数主导动态特性。InputName和OutputName不是必须的但加上后配合 Simulink 线性化工具会更直观。2.3 验证开环模型阶跃响应到底该长什么样用step(G, 3)看开环阶跃响应给 1V 电压时转速最终稳定在约1/Ke 0.667rad/s。这个数值很关键它说明单靠电枢电压开环控制想稳在 100 rad/s 就要给到 150V 以上如果此时加上 20 N·m 负载稳态转速还会进一步跌落。所以开环响应验证的目的不是看波形多好看而是确认直流增益和两个时间常数数量级合理。正常情况下这个二阶系统是过阻尼的因为τm明显大于τa转速缓慢爬升到稳态没有超调。如果仿出的波形出现高频振荡优先检查La和Ra的数量级特别是把 0.05H 和 0.5Ω 这类值搞混之后τa会变成 0.1s整个模型会变得和实际电机行为完全不符。这一步对了后面单闭环调速系统才有意义。3. 单闭环调速系统的 Simulink 实现结构、限幅与 PI 初设3.1 单闭环的结构转速反馈加 PI 调节器先别想电流环所谓单闭环调速系统指的是只把转速作为被控量、转速反馈构成外环的闭环结构。它和双闭环直流调速系统的区别在于双闭环在转速环里面还套了一个电流环用来限制起动电流和改善动态响应单闭环则直接用 PI 调节器的输出作为电枢电压指令结构上少一层调参也直观得多。单闭环的给定是目标转速ω*反馈信号来自测速环节。仿真里一般取反馈系数H 1也就是反馈量直接等于转速如果实验台上测速机输出电压是 010V 对应 01500r/min那H就要换算成V/(rad/s)。PI 调节器的输出经过限幅后送给电机模型限幅值通常取电源允许的最大电压比如 ±220V。这个限幅不是可有可无的它直接影响后面积分饱和的表现。从控制理论角度看单闭环调速系统的核心想法很简单转速偏差e ω* - ω输入 PIKp负责快速消除偏差Ki负责把稳态误差压到零。因为电机对象本身含有一个惯性环节加一个机电时间常数PI 相当于给系统增加了一个开环极点同时用零点去抵消掉其中一个慢极点让闭环主导极点变成一对共轭复根。3.2 用 MATLAB 脚本先做线性闭环验证在直接搭 Simulink 之前我先用第 2 章的传递函数做一次线性闭环验证这样能快速判断 PI 初值方向对不对Kp 10; % 比例系数初值 Ki 50; % 积分系数初值 C Kp Ki/s; % PI 调节器 H 1; % 单位转速反馈 G_cl feedback(C*G, H); step(G_cl, 2); grid on;feedback(C*G, H)计算的是前向通道C*G、反馈H的单位反馈闭环传递函数第二条参数-1是默认的负反馈。这里把 PI 写在位置比例形式而不是写成Ki*(1 1/(Ti*s))是因为实验指导手册里给的往往就是Kp和Ki两个数直接用这两个符号能避免换算误差。在这个线性模型里PI 输出没有限幅所以不管Kp取多大仿真都能跑出结果。但实际实验里Ua最多到 220V所以线性闭环只能用来初调最终要回到带饱和的 Simulink 模型里验证。3.3 Simulink 里的具体拼法从模块表到参数表Simulink 模型的骨架可以按下面这张表搭模型名我建议取motor_speed_loop后面线性化和sim()都要用模块库路径参数设置StepSimulink/SourcesStep time 0, Final value 100Sum eSimulink/Math Operations输入为-即给定减反馈Gain KpSimulink/Math OperationsGain KpGain KiSimulink/Math OperationsGain KiIntegratorSimulink/ContinuousInitial condition 0Sum USimulink/Math Operations输入为 Kp 支路与积分支路相加SaturationSimulink/DiscontinuitiesUpper limit 220, Lower limit -220Motor 子系统自建内部结构见下PI 调节器在 Simulink 里我一般拆成两条并联支路误差e直接走 Gain Kp另一路经过 Gain Ki 再进 Integrator最后两条支路相加得到电压指令。这样做的好处是Kp、Ki可以直接写成变量名脚本里assignin(base, ...)后不用打开模型就能批量改参数。3.3.1 电机子系统的内部接线电机子系统我通常按状态方程搭而不是直接拖一个 Transfer Fcn 模块。原因是实验里要在 1.5s 时突加负载TL用传递函数模块不好加扰动输入。子系统内部从电压Ua到电流i的回路是Sum1计算Ua - Ke*w - Ra*i乘上增益1/La后进Integrator1得到i从电流到转速的回路是Sum2计算Ke*i - TL乘上增益1/J后进Integrator2得到w。两个积分器初值都设 0Ke作为反馈增益同时接到Sum1的负输入端和Sum2的正输入端。TL用一个内部 Step 模块产生Step time 1.5Final value 20。这样整个仿真过程就能看到转速在负载突变后的动态恢复过程单闭环能不能顶住负载扰动一眼就能判断。4. 仿真实验参数调试与结果分析阶跃、负载扰动和积分饱和4.1 把仿真跑起来的完整实验脚本模型搭好后我用一组脚本控制仿真而不是每次手点 Run。这样参数扫描和后续线性化都比较顺畅Kp 20; Ki 80; assignin(base, Kp, Kp); assignin(base, Ki, Ki); set_param(motor_speed_loop, StopTime, 3); out sim(motor_speed_loop); figure; plot(out.w.Time, out.w.Data, LineWidth, 1.5); grid on; xlabel(时间 (s)); ylabel(转速 (rad/s));assignin把Kp、Ki写进基础工作区Simulink 里 Gain 模块填写的变量名会自动读取新值。sim()返回的out.w是电机子系统输出端口的仿真数据结构里包含Time和Data两个字段。如果模型中信号线的变量名不是w要在 Signal Properties 里把它设为输出并命名或者在子系统 Output 端口直接接一个 To Workspace 模块。这一步跑通之后观察点在 100 rad/s 给定的稳态值如果不带负载PI 积分作用会把稳态误差收敛到零1.5s 后负载加到 20 N·m转速会先跌落再恢复到接近 100 rad/s。恢复时间就是单闭环调速系统的抗扰性能指标比单纯看给定阶跃更能说明 PI 参数的合理性。4.2 PI 参数扫描表Kp 和 Ki 各负责什么单闭环调速系统的调试顺序我一般遵循先比例后积分。先把Ki设很小只调Kp让系统不振荡再逐步加大Ki消除稳态误差。用脚本批量跑会比手点快得多KpList [5, 10, 20, 40]; KiList [20, 50, 80]; res zeros(numel(KpList)*numel(KiList), 4); row 0; for Kp KpList for Ki KiList row row 1; assignin(base, Kp, Kp); assignin(base, Ki, Ki); out sim(motor_speed_loop, StopTime, 3); y out.w.Data; t out.w.Time; info stepinfo(y, t, 100); res(row, :) [Kp, Ki, info.Overshoot, info.SettlingTime]; end end resultTable array2table(res, ... VariableNames, {Kp, Ki, Overshoot_pct, SettlingTime_s})这里stepinfo(y, t, 100)把最终值标定为 100 rad/s 来计算超调量和调节时间。SettlingTime默认按 2% 误差带计算如果关心的精度是 5%要手动调整阈值。批量跑完后直接看表会比在 Scope 里一条条数曲线省很多时间。下面是一组在第 2 章电机参数下、给定 100 rad/s、1.5s 加 20 N·m 负载的典型仿真结果KpKi超调量 %调节时间 s现象5200.51.1响应偏慢负载恢复时间长10503.20.9比较均衡适合做基线208014.00.8超调变大动态变快4015027.50.9接近饱和波形易振荡从这张表能看出一个常见误区加大Kp并不一定能缩短调节时间因为输出限幅到 220V 之后控制量被截断继续加大Kp只会增加超调甚至让系统在饱和区停留更久。Ki过大会在负载突变时产生明显转速波动因为积分器把过去一段时间的偏差都累积了进去。4.3 限幅与积分饱和单闭环调速最容易忽视的坑很多实验做到这里就结束了但单闭环调速系统的仿真里还有一个特别影响波形真实性的问题积分饱和。当 PI 输出超过 220V 限幅时Saturation 模块把输出截断但积分器内部状态还在继续累积结果就是给定转速阶跃瞬间电压指令长时间停留在限幅值转速第一次冲过头之后积分器需要很长时间才能把多余的量退回来表现为大超调和长时间振荡。最简单的验证方法是把 Saturation 输出端与 PI 内部积分器输出同时打进 Scope观察限幅前后那段时间积分值是否还在单调上升。标准的解决方法是抗积分饱和把限幅后的实际输出与限幅前的指令之差乘上1/Tt反馈回积分器输入端Tt取 0.10.5s。在 Simulink 里实现时在 Saturation 后面引一条支路经 Sum 和 Gain 接到 Integrator 的输入端即可。不接这一步单闭环调速系统看起来调好了换一组负载或给定值就可能重新振荡。5. 用 pidtune 和线性化给单闭环调速仿真做交叉验证5.1 用 pidtune 交叉验证 PI 参数手动调参得到一组看起来不错的Kp、Ki后我习惯再用pidtune做一次交叉验证确认这组参数没有偏离理论最优太远wc 12; % 期望的穿越频率rad/s [Ctuned, info] pidtune(G, PI, wc); Ctuned G_cl_tuned feedback(Ctuned*G, 1); stepinfo(G_cl_tuned)pidtune的第二个参数指定控制器类型第三个参数是期望穿越频率wc。穿越频率越高响应越快但需要的控制量也越大超出 220V 限幅后会出现饱和。info结构里可以看到相位裕度一般单闭环调速系统留 45 度以上比较稳妥。如果pidtune给出的Kp、Ki和你手调的结果差一个数量级那基本是电机模型参数写错了而不是调参方法的问题。5.2 线性化模型与饱和模型的分叉点最后一步是把 pidtune 结果代回 Simulink对比线性闭环和带饱和的非线性模型assignin(base, Kp, Ctuned.Kp); assignin(base, Ki, Ctuned.Ki); out_lin sim(motor_speed_loop, StopTime, 2); step(G_cl_tuned, 2); hold on; plot(out_lin.w.Time, out_lin.w.Data);step(G_cl_tuned, 2)画的是线性闭环阶跃响应sim()跑的是带限幅的实际模型。两条曲线在起始阶段重合到控制量触及 220V 限幅的时间点开始分叉线性模型转速继续快速上升饱和模型则按电压限幅下的最大加速度爬升超调量也因此变大。这个分叉点的位置就是你需要为积分器加抗饱和处理的边界。看到这两条曲线重合P 参数可信看到明显分叉下一步不是继续加Kp而是处理限幅和积分饱和再做一次阶跃响应核对超调量和调节时间是否回到预期范围内。本文还有配套的精品资源点击获取
返回列表