资讯动态

Simulink直流电机调速系统仿真与PID整定

发布时间:2026/10/28 3:53:56 来源:尧图企业网站定制
简介围绕 Simulink 展开的直流电机速度控制设计与仿真文档面向自动化专业学生、机器人研发工程师及希望掌握 Simulink 建模的读者服务于产线传送带驱动、医疗设备精密定位等需要恒速输出的场合。内容按系统建模、PID 控制器设计、速度传感器建模、仿真验证与性能优化五个阶段推进给出电机电磁与机械特性建模、带测量噪声的传感器模型以及 Simulink 模块搭建与参数整定思路并配有 MATLAB 函数与建模脚本示例。压缩包仅含 1 个 docx 文件约 24KB篇幅精炼便于按章节对照复现模型。已有 271 人学习适合作为课程设计或工程入门的实操参考帮助读者理解 PID 参数对稳定性与响应速度的影响并掌握从动力学方程到仿真验证的完整链路。1. 直流电机速度控制系统仿真先跑通再动手比先焊板子稳调试一台直流电机最浪费时间的做法通常是驱动板焊完、编码器装好、上电才发现转速环一给阶跃就抖或者直接发散。基于 Simulink 的直流电机速度控制系统设计与仿真解决的正是这个先后顺序问题把电枢电压方程、机械运动方程和控制器放到同一个可重复运行的模型里先在仿真里把参数整定出来再拿结果去指导实物调试。它适合刚接手电机控制任务、手上只有电机铭牌和万用表的工程师也适合想把经验值沉淀成可回归测试集的熟手。后面按建模、整定、物理建模、排查、批量化五步走参数和坑都摆出来。2. 电枢回路与机械方程把直流电机速度模型立成可算的三阶传递函数建模这一步最容易被跳过也最容易在后面整定时翻车。很多人直接拿一个「增益 积分」的一阶近似去配 PID仿真里调得很漂亮换成实际电机却怎么都不对。差别往往在电气时间常数上电枢电感带来的滞后被忽略了控制器就敢给一个过大的比例增益实物一上电就震荡。老老实实把两个方程联立出来花不到二十分钟后面能省掉几天的试错。2.1 从两个方程推出三阶传递函数直流电机的动态由两段耦合关系描述。电枢回路上外加电压一部分落在电阻和电感上一部分被反电动势抵消机械轴上电磁转矩推动转子加速同时被负载转矩和粘性阻尼拖住。写成时域方程就是下面两组$$ u R_a i L_a \frac{di}{dt} K_e \omega $$$$ J \frac{d\omega}{dt} B \omega K_t i - T_L $$把两式做拉普拉斯变换消去电流 $i$在空载 $T_L 0$ 的条件下电压到转速的传递函数为$$ G_v(s) \frac{K_t}{s\left[(L_a s R_a)(J s B) K_t K_e\right]} $$注意分母里那个独立的 $s$它来自机械方程的积分关系意味着这个对象天然带一个积分环节转速是电压的积分型响应。这一点决定了后面用 PI 而不是纯 P 就足够把稳态误差压到零。用一组具体数字体会一下量级。下面这段脚本把参数代入并做最小实现顺便打印极点位置% 直流电机速度环建模参数示例值必须按实际电机铭牌替换 Ra 2.0; % 电枢电阻单位 Ω La 0.02; % 电枢电感单位 H Ke 0.8; % 反电动势系数单位 V·s/rad Kt 0.8; % 电磁转矩系数单位 N·m/A J 0.02; % 转子及负载折算转动惯量单位 kg·m^2 B 0.002; % 粘性阻尼系数单位 N·m·s/rad s tf(s); Gv Kt / (s * ((La*s Ra)*(J*s B) Kt*Ke)); % 电压到转速 Gv minreal(Gv); % 约掉数值相近的零极点 disp(Gv); disp(pole(Gv)); % 看极点分布定带宽这段代码的关键在第 10 行分母里(La*s Ra)*(J*s B)是电气和机械两个一阶环节的乘积Kt*Ke是机电耦合项它把两个原本独立的极点往两边推开所以直流电机的极点位置不是简单的 $R_a/L_a$ 和 $B/J$。跑完会看到三个极点落在 0、约 -20、约 -80 三个位置电气极点比机械极点快四倍左右。这个比值直接决定后面控制器带宽能开到多少带宽逼近最快的那个极点相位裕度就开始快速掉。2.2 参数表哪些数必须查铭牌哪些可以估建模准确度取决于六个参数但它们的获取难度并不一样。下表是我一般在项目启动阶段填的一张表标注了每项的来源和误差影响参数符号典型来源误差对仿真的影响电枢电阻$R_a$万用表测两端多测几组取均值影响稳态增益和电气极点10% 误差可接受电枢电感$L_a$铭牌缺失时用 LCR 表测或按经验取 0.010.05 H影响相位滞后估小了控制器会偏激进反电动势系数$K_e$空载额定转速下用 $U/(\omega)$ 反推直接影响稳态转速必须准转矩系数$K_t$国际单位制下与 $K_e$ 数值相等与 $K_e$ 不一致会破坏耦合项转动惯量$J$阶跃响应曲线拟合或用减速扫频估算影响机械时间常数误差 30% 常见粘性阻尼$B$最难实测一般按 $J$ 的 1%10% 估影响低速段高速段几乎看不出来表里最容易被搞错的是 $K_e$ 和 $K_t$ 的关系。在国际单位制下两者数值相等但如果有人拿转速单位是 rpm 的铭牌直接算就会差出 9.55 倍这是血泪经验级别的坑。另一个是转动惯量它很难查到比较可靠的做法是给一个已知电压阶跃看转速上升的初始斜率反推 $J$。估出来的值和实测差个两三成很正常后面整定时留够裕度就行。2.3 在 Simulink 里搭出最小可跑闭环参数齐了就可以搭模型。手拖模块当然可以但要反复改结构、对比多组参数时脚本建模型更省事。下面这段脚本从空模型开始把阶跃输入、求和、PID、被控对象、示波器连成一个闭环mdl dc_speed_loop; if bdIsLoaded(mdl), close_system(mdl, 0); end new_system(mdl); open_system(mdl); load_system(simulink); % 输入阶跃0.1 s 时刻给定 150 rad/s add_block(simulink/Sources/Step, [mdl /SpeedRef], ... Time, 0.1, Before, 0, After, 150, Position, [30 100 60 130]); % 误差求和反馈端取负 add_block(simulink/Math Operations/Sum, [mdl /Err], ... Inputs, |-, Position, [110 93 130 137]); % 连续 PIDP/I 用工作区变量方便后面扫参 add_block(simulink/Continuous/PID Controller, [mdl /PID], ... P, Kp, I, Ki, D, 0, Position, [170 90 220 140]); % 被控对象直接用前面算出的传函 add_block(simulink/Continuous/Transfer Fcn, [mdl /Motor], ... Numerator, [0.8], ... Denominator, [0.0004 0.04004 0.644 0], ... Position, [270 85 350 145]); add_block(simulink/Sinks/Scope, [mdl /Scope], Position, [410 95 440 135]); % 连线 add_line(mdl, SpeedRef/1, Err/1, autorouting, on); add_line(mdl, Err/1, PID/1, autorouting, on); add_line(mdl, PID/1, Motor/1, autorouting, on); add_line(mdl, Motor/1, Scope/1, autorouting, on); add_line(mdl, Motor/1, Err/2, autorouting, on); % 求解器配置变步长、刚性容错 set_param(mdl, StopTime, 2, Solver, ode45, ... MaxStep, 0.001, RelTol, 1e-4);几个地方需要说明。Transfer Fcn的分母系数[0.0004 0.04004 0.644 0]是 $s^3, s^2, s^1, s^0$ 从高到低的系数最后一个 0 就代表那个独立积分环节少了它整个对象就变成有静差的二阶系统PID 调出来的结果会完全对不上。MaxStep设成 1 ms 是刻意的变步长求解器在阶跃瞬间会自动缩小步长但稳定段会放得很大如果不设上限采样点稀疏到看不清超调。P和I填的是变量名Kp、Ki不是具体数字这样后面写循环扫参时只需要改工作区变量模型不用重建。模型跑起来之后第一件事不是看波形好不好看而是确认开环对象本身对不对把 PID 的 P 设成一个极小的值看转速在 220 V 阶跃下能不能稳定到约 273 rad/s。对不上就回头查 $K_e$ 和 $R_a$这一步做扎实后面的整定才有意义。3. 转速环 PID 整定从临界振荡到 5% 超调的实操路径模型能跑接下来是最耗时间的环节。PID 参数不是玄学但确实存在一批「看起来能用、换台电机就崩」的参数组合根源在于整定时只盯了阶跃响应的超调没看相位裕度和对参数扰动的容忍度。这一节把整定拆成有明确判据的几步每一步都有可检验的指标不靠眼睛觉得「差不多」。3.1 先跑通单环再考虑要不要加电流环直流电机速度控制有单环和双环两种结构。双环是外环转速、内环电流好处是能直接限制电枢电流、加快抗扰响应代价是多一个需要整定的环而且内环带宽必须显著高于外环否则两个环互相打架波形上表现为转速响应出现高频小幅振荡调外环怎么都调不干净。判断标准很直接看应用对电流限制和动态响应有没有硬要求。如果只是风机、泵类负载启动时间长一点无所谓单环足够模型简单、参数少、排查容易。如果是需要频繁启停、堵转保护、或者负载转矩突变大的场合才值得上双环。我一般先用单环把模型和参数验证一遍确认对象传函没问题再决定是否加内环这样即使双环调不出来也能快速回退到单环版本不至于全部推倒。内环整定时有个硬约束内环带宽建议做到外环的 5 到 10 倍。假设外环穿越频率定在 30 rad/s内环就要做到 150 rad/s 以上。但内环带宽受 PWM 开关频率和电流采样频率限制一般不超过开关频率的十分之一。这两个约束一夹很多低速大惯量场景其实做不出真正解耦的双环这时候老老实实用单环加电流限幅效果反而更稳。3.2 手工试凑的三步法先 Kp、再 Ki、最后看裕度手工整定有一套流传很广的顺序但细节上有几处容易做错。下面这套是我常用的流程配合 Simulink 里现成的 PID Tuner 可以互相校验。第一步把 Ki 和 Kd 都置零只留比例。Kp 从 0.1 开始每次翻倍观察转速阶跃响应。判据是响应开始出现等幅振荡记下此时的 Kp 作为临界增益 $K_u$同时从示波器上量出振荡周期 $T_u$。这一步的关键是等幅不是发散也不是衰减如果一上来就发散说明步长太大回退一半重来。第二步按 Ziegler-Nichols 经验公式给初值PI 控制取 $K_p 0.45 K_u$$K_i K_p \cdot 1.2 / T_u$。这套公式偏保守超调通常在 20% 上下作为起点够用但不适合直接交付。第三步在初值基础上手动压超调。先把 $K_p$ 往下调 20%30%再看积分时间 $T_i K_p / K_i$把它往对象的主导时间常数上靠。对第 2 章那组参数主导机械极点大约在 20 rad/s 附近对应时间常数 0.05 s所以 $T_i$ 取 0.05 左右时积分零点正好抵消这个极点相位裕度会有明显改善。调完之后在模型里打开线性化分析看波特图上的相位裕度低于 45° 就继续降 $K_p$高于 70° 说明过于保守响应会偏慢。如果不想手工试Simulink 自带的 PID Tuner 可以直接做同样的事在 PID 块上点调参按钮界面里拖响应时间和超调两条滑杆它会自动算出参数。我一般用它拿初值再回手工微调因为自动整定不考虑电流限幅和采样延迟直接照搬容易在实际模型里失效。3.3 三个参数各改一档波形会怎么变调参时最怕改了一个数不知道会牵连什么。下面这张表是我在多次对比仿真后整理的以第 2 章那组示例参数为基准每次只动一个量记录转速阶跃响应的变化改动上升时间超调稳态误差抗负载扰动$K_p$ 增 50%明显缩短显著增大略减小恢复变快但振荡加剧$K_i$ 增 50%略缩短增大消除更快恢复变慢易过冲$K_p$ 减 30%变长明显减小略增大恢复变慢$K_i$ 减 30%略变长减小消除变慢恢复更平稳加一阶滤波 0.5 ms略变长减小无影响略变慢表里最后一行值得单独说。电机模型里的电气环节本身就是一个低通控制器输出如果直接打到电枢上高频噪声会被放大。加一个时间常数 0.5 ms 左右的一阶滤波在 PID 输出后面能明显压低超调代价是响应略慢。这个滤波时间常数不宜超过电气时间常数 $L_a/R_a$ 的三分之一否则相位滞后吃掉裕度控制器反而更容易振。还有一个常被忽略的参数是微分项。速度环一般不用 D因为转速信号来自编码器或测速机本身就带量化噪声微分会把噪声放大成剧烈抖动。如果确实需要微分作用必须先做速度滤波或者改用带滤波的 PID 实现形式把微分作用放在反馈通道上而不是误差通道上避免阶跃给定瞬间产生微分冲击。整定完成后别急着收工把给定值改成斜坡、把负载转矩加一个方波扰动各跑一遍。只验证阶跃响应的参数在斜坡输入下经常出现稳态跟踪误差在扰动下恢复时间也可能长得不能接受。这几组测试可以存成脚本后面每次改模型都重跑一遍相当于给自己留了后悔药。4. 用 Simscape 补上电气与机械耦合负载扰动和限幅怎么进模型传递函数模型跑通之后很多人的下一步是直接拿参数去调实物。中间少了一步传递函数把饱和、摩擦非线性、电感电流纹波这些都线性化掉了模型里控制器能输出 1000 A 的瞬时电流实物里驱动器早就过流保护了。Simscape 的电气和机械模块能把这一层补回来代价是模型更重、参数更多、求解更慢。要不要用取决于你要验证什么。4.1 传递函数块和 Simscape 物理模型怎么选两种建模方式的差别不只是精度还有调试成本。下面这张对比表是我在做方案选型时实际考虑的几个维度维度传递函数模型Simscape 物理模型建模时间半小时半天到一天参数需求六个集中参数需要磁链、摩擦曲线、驱动器死区等仿真速度秒级分钟级步长受开关频率约束能验证饱和与限幅只能外加限幅块电流、电压自然受限能验证负载扰动需要手动加扰动源直接挂转矩源即可适合阶段控制器结构选型和初调交付前的边界条件验证我的习惯是分两段走前期用传递函数模型快速试控制器结构和参数等参数收敛了再把同一套 PID 参数搬到 Simscape 模型里做边界验证。两段模型共用同一份参数初始化脚本避免改了一处忘了另一处。搭 Simscape 模型时电气侧用受控电压源加电枢电阻电感机械侧用转动惯量模块加转矩源中间通过电机模块里的机电转换接口连起来。这里有个关键点电机模块的转矩系数和反电动势系数必须和传递函数模型里保持一致否则两个模型对不上参数迁移就会失效。我一般在初始化脚本里统一定义Kt、Ke两个模型都引用这两个变量。4.2 突加负载实验波形上该看哪几个点光有模型不算验证得设计能暴露问题的实验。最有效的一组是「稳态运行中突加 50% 额定负载再突卸」整个过程看三个指标转速跌落深度、恢复时间、恢复过程有没有二次过冲。搭建这组实验的脚本思路如下用Step块产生转矩扰动在 0.6 s 时刻从 0 跳到额定转矩的一半% 负载扰动源0.6 s 突加 50% 额定转矩 add_block(simulink/Sources/Step, [mdl /LoadTorque], ... Time, 0.6, Before, 0, After, T_load, ... Position, [270 200 300 230]); % 用 Sum 块把负载转矩从电磁转矩里减掉 add_block(simulink/Math Operations/Sum, [mdl /TorqueSum], ... Inputs, |-, Position, [330 180 350 220]); % 关键把仿真步长上限压到开关周期的 1/20 以下 set_param(mdl, Solver, ode23t, MaxStep, 2e-5, ... RelTol, 1e-5, StopTime, 1.5);ode23t是适合刚性系统的求解器Simscape 模型里电气和机械时间常数差两三个数量级用ode45会跑得极慢甚至报错。MaxStep压到 20 微秒是为了让 PWM 开关过程不被跨过去否则电流波形会失真限幅逻辑也就验证不了。波形判读上转速跌落深度主要取决于控制器带宽和转动惯量带宽够高、惯量不大的话跌落能控制在 5% 以内。恢复时间看积分作用是否充足但恢复太快往往伴随二次过冲说明积分饱和没处理好。这时候要检查 PID 输出后的限幅块以及限幅是否带抗饱和反馈。很多模型里限幅块是孤立的PID 不知道输出已经饱和积分项继续累积等误差反向时就要花很长时间退饱和表现就是卸载后转速冲得老高。这一条在传递函数模型里不容易暴露在 Simscape 里加个转矩源立刻现形。5. 排查转速发散、波形毛刺、仿真卡死的五个具体坑仿真跑不通的时候报错信息经常只给一行「代数环」或者「求解器失败」看不出根因。下面五个坑是我在不同项目里反复遇到的按现象、原因、解决三段写清楚遇到了可以对照着排查。5.1 报代数环错误模型直接编译不过现象点运行之后弹窗提示检测到代数环仿真起不来或者强制用迭代求解后结果明显不对。原因反馈回路里存在同一时刻的输入输出直接依赖。最常见的是把 PID 输出直接连到某个模块中间没有状态环节而该模块又参与了反馈计算。另一种是用了Gain加Sum构成的纯代数回路Simulink 无法通过状态变量切断依赖。解决在回路中插入单位延迟或者一阶滤波把直接依赖变成状态依赖。速度环里更常见的做法是检查 PID 块的输出是否直接进了被控对象的分子系数通路如果是把对象拆成一个积分环节加一个严格真有理环节让积分环节承担状态。实在需要保留反馈直通时把求解器改成带迭代的类型但这会显著拖慢仿真速度一般不推荐。5.2 仿真跑到一半卡住不动进度条几乎不走现象前 0.2 秒很快跑完之后每推进一毫秒要几十秒甚至一直卡在同一时刻。原因系统刚性太强变步长求解器为了满足容差把步长压到极小。Simscape 模型里电气时间常数在毫秒级、机械时间常数在秒级两者差三四个数量级ode45这类非刚性求解器会陷入死循环。解决换成ode23t或ode15s并把MaxStep设为开关周期的二十分之一左右。同时检查模型里有没有不连续环节比如继电器的硬切换、摩擦的静动切换这些都会让求解器反复回退。能平滑的地方尽量用平滑函数替代硬切换比如把库仑摩擦换成一个斜率很大的 sigmoid仿真稳定性会明显改善。5.3 阶跃之后转速冲上去下不来超调大得离谱现象给定一个 150 rad/s 的阶跃转速冲到 250 以上才缓慢回落调节时间长达好几秒。原因积分饱和。PID 输出在启动瞬间远大于电枢能承受的电压但模型里的限幅块只是把输出截断PID 内部的积分项仍然按未限幅的误差在累积。等转速接近给定值时积分项已经积累了一个巨大的值需要很长时间反向消化。解决把限幅值实际反馈给 PID 块启用抗饱和功能。Simulink 的 PID 块自带这个选项在参数里勾上「限制输出」并把上下限填上与外部限幅一致的值内部就会做 back-calculation。如果没有用自带块可以在积分器前面加一个开关检测到输出饱和时切断积分通路这就是经典的积分分离写法。5.4 波形上全是毛刺看不出真实趋势现象转速曲线整体趋势对但上面叠了一层高频抖动放大看每个采样点都在跳。原因两个可能。一是控制器输出没有滤波直接把离散采样噪声放大到电枢电压上二是仿真步长和控制器采样周期不匹配控制器按 1 ms 采样求解器却按 0.1 ms 推进采样保持环节的行为就失真了。解决先确认控制器是不是离散实现如果是把采样时间明确写成Ts并在 PID 块里设置采样周期不要留成连续块让求解器自己决定。然后在控制器输出后加一阶低通时间常数取采样周期的 1 到 3 倍。如果毛刺依然存在检查是不是某个 Gain 块增益过大放大了数值噪声适当降低增益并提高求解器相对容差通常能压下去。5.5 参数都调好了换个工况就完全不对现象在额定转速下响应很好降到 10% 转速就出现明显振荡或者负载加重后稳态误差消不掉。原因模型是线性的参数整定也是在线性化工作点附近做的但实际系统在不同工作点的增益不一样。直流电机在低速段反电动势小同样的电压变化对应的转速变化更大等效增益升高负载加重时电枢电流增大电阻压降占比上升也会改变等效增益。解决不要只在一个工作点验证。把给定值分别设成额定转速的 100%、50%、10%把负载设成空载、半载、满载做一组 3×3 的工况矩阵每组都跑一遍阶跃。如果低速段振荡明显说明控制器增益对该工作点偏高可以引入增益调度按转速分段使用不同参数或者接受一定的低速性能下降换取全速域的稳定性。这一步做完参数才算真正可用。6. 让调参变成一次跑完的表格脚本批量扫参与结果归档手工改一个参数、跑一次、看一次波形调三组就到头了再多就记混。我后来的习惯是把整定过程脚本化给定参数网格循环修改工作区变量、跑仿真、把关键指标写进表格一次性出结果。这样不仅快更重要的是留下了一份可回溯的记录三个月后有人问「这组参数怎么来的」表格一翻就能答上。核心做法是把仿真输出接到SimulationOutput用sim命令在循环里跑每次从日志里提取超调量、调节时间、稳态误差Kp_list [8 12 16 20 24]; Ki_list [160 240 320 400]; results table(); for kp Kp_list for ki Ki_list Kp kp; Ki ki; % 写入工作区模型直接引用 out sim(mdl, ReturnWorkspaceOutputs, on); y out.get(yout); % 转速信号 t y.Time; v y.Data; % 从 0.1 s 阶跃之后开始算指标 idx t 0.1; v_post v(idx); t_post t(idx); overshoot (max(v_post) - 150) / 150 * 100; settle_idx find(abs(v_post - 150) 0.02*150, 1, last); settle_time t_post(settle_idx) - 0.1; steady_err abs(mean(v_post(end-100:end)) - 150); results [results; table(kp, ki, overshoot, settle_time, steady_err)]; end end disp(results);几个地方是踩过坑之后才加上的。ReturnWorkspaceOutputs必须开不然sim只返回时间向量拿不到信号数据指标从 0.1 s 之后开始算因为阶跃之前是零状态混进去会把超调算小稳态误差取最后 100 个点的均值单点取值容易受数值抖动影响。跑完这张表超调低于 5%、调节时间最短的那一行就是候选参数再拿去 Simscape 模型里复核一遍两边都对得上才算定稿。我现在做这类项目模型文件旁边一定放三个脚本参数初始化、批量化扫参、工况矩阵验证。前两个用来找参数第三个用来确认参数在全工况下不翻车。这个习惯是被一次返工逼出来的当时只在一个工作点验过就交付结果现场低速运行时抖得没法用回头重调又多花了两周。参数这东西能自动跑就别用手点能留记录就别靠记忆。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑