资讯动态

三环电机PID控制MATLAB仿真:从Simulink建模到参数整定避坑指南

发布时间:2026/10/13 14:28:08 来源:尧图企业网站定制
简介面向电机控制与电力电子方向的初学者、课程设计学生以及需要快速上手比例-积分-微分闭环仿真的工程师这份资料集中演示了速度环、电流环、位置环三环结构中PID控制器的搭建与参数整定思路。借助MATLAB脚本和Simulink模型读者能够理解比例、积分、微分各项对电机转速、电流和位置响应的影响掌握在PWM逆变器与电机模型环境下进行多闭环控制仿真实验的具体方法。压缩包内共3个文件包含2个.m脚本用于初始化系统参数、执行仿真运算并绘制结果曲线另有1个.mdl模型用于构建三环PID控制的图形化仿真模型整体大小仅8KB代码结构紧凑非常便于逐行阅读和参数修改。该资源已有2994人学习下载适用于电力电子技术、电机拖动或自动控制相关课程的教学与自学。通过运行配套的脚本和模型用户可以直接调整PID参数直观观察超调量、上升时间、稳态误差等动态指标的变化从而加深对电机闭环控制原理的理解并为实际电机控制系统的设计提供有益参考。1. 三环电机的PID控制MATLAB仿真为什么伺服调试要先在仿真里过一遍很多人第一次接触三环电机控制以为难点在PID参数本身真正碰过实机才发现最大的风险在调试过程电流环参数给大了驱动器过流报警速度环一抖整个机械结构跟着哐哐响位置环如果顺序调反了设备就在你面前振荡起来。三环电机的PID控制MATLAB仿真就是把这些风险先在电脑里排掉——把电流环、速度环、位置环按从内到外的顺序搭进Simulink逐个闭环、逐个给参数、看阶跃和跟随曲线确认没问题再把参数带进实物。这篇文章不讲空理论直接说清楚三个环各自控制什么、模型怎么搭、参数怎么估、最常见的几个坑在哪。适合正在做伺服驱动、转台、机器人关节或自动化设备的人也适合被课设和毕设逼着要把三环仿真跑通的学生。2. 三环结构先立住内环快、外环慢带宽分配决定成败2.1 电流环、速度环、位置环各管什么控制对象与反馈变量三环控制说白了就是三个PID控制器串在一起各管一段。最里面是电流环控制对象是电枢回路的电磁惯性反馈量是电流输出的是电压指令目标是让实际电流快速追上有功电流指令。中间是速度环控制对象是电流环闭环之后的机械转动惯量反馈量是转速输出的是电流指令负责让转速跟上速度给定。最外面是位置环控制对象是速度环闭环后再积出来的一段角度反馈量是角度输出的是速度指令负责让轴停在目标位置。三个环节的物理意义和控制目标差别很大不能互相替代。我们可以把它们的典型配置放在同一张表里看环路控制对象反馈量输出量典型控制器输出限幅含义电流环电枢回路 LsR相电流/电枢电流电压/占空比PI母线电压上限速度环电流环闭环 转动惯量 Js电机转速电流指令PI峰值电流上限位置环速度环闭环 积分 1/s机械角度速度指令P 或 PD最大转速上限从表里能看出来每个环路的输出就是外面一级环路的给定。电流环的输出是电压速度环的输出是电流指令位置环的输出是速度指令。这个层级关系是搭模型的地基后面所有参数整定和避坑都从这张表出发。为什么三个环都要PID控制器而不是一个大的PID直接怼上去因为被控对象跨度太大。电磁环节时间常数在毫秒级机械环节在几十毫秒到秒级单个PID无法同时兼顾两者的快速性和稳定性。分开三个环每个环面对的对象都足够简单整定就容易得多。2.2 带宽分配内环带宽与外环带宽的3到5倍关系三环整定有一个不成文的规矩内环响应一定要比外环快带宽从内到外依次至少拉开3到5倍。电流环带宽最高速度环次之位置环最低。原因不玄学就是每个外环都把内环闭环当成一个固定模块来用内环如果响应太慢外环看到的就是一个大滞后环节加增益就容易振荡。举个常见的设计起点电流环期望上升时间约1到3毫秒对应带宽大概300到1000 rad/s速度环带宽设计在电流环的1/3到1/5也就是60到200 rad/s位置环再往下取自然频率通常在速度环带宽的1/2到1/3大约10到30 rad/s。这个比例不是数学证明出来的是工程上稳定性与快速性折中的结果。我一般会在仿真里直接用这个比例做初值然后看阶跃响应曲线微调。如果位置环加增益后系统开始抖首先怀疑的不是位置环本身而是速度环带宽不够高回头把速度环调快再回来加位置环增益往往一步就通。反过来的情况也常见有人先把位置环调到很灵敏再回头看速度环整个系统处于不稳定边缘怎么调都别扭。2.3 建模顺序为什么先内后外仿真里的三环闭环步骤Simulink里搭三环模型顺序和现场调试一样从内往外。先把电流环单独闭环给它一个阶跃电流指令确认电流跟踪快、无超调然后把电流环闭环整个当作一个小模块往外挂速度环确认速度响应符合预期最后再挂位置环。每一步都建立在上一环已经稳定的前提下出问题只需要盯一个环不用猜。模型结构上最小可用模型包含这几块电机电枢传递函数、反电动势反馈、机械传递函数、位置积分、三个PID、三个限幅、几个示波器。把它们按位置误差到速度指令、速度环到电流指令、电流环到电压指令、电压到电流、电流到转矩、转矩到转速、转速积分到角度的顺序连起来就是完整的三环闭环。现在说一个容易犯的错有人一开始就在同一个模型里把三个环全连好然后同时试三组PID参数结果波形乱成一团根本分不清是哪一环的问题。建模顺序先内后外不只是为了仿真曲线好看更是为了让排查变量少到可控。这一步做得好后面整定能省一半时间。3. 搭一套能跑的三环Simulink模型初始化脚本与模块清单3.1 先把电机参数换算成仿真参数一份可直接改的初始化脚本建模之前先把电机参数写进工作区。很多电机铭牌给的是额定电压、额定电流、额定转速仿真需要的是电阻、电感、转矩常数、反电动势常数、转动惯量和阻尼。换算关系不复杂Si单位下转矩常数和反电动势常数数值近似相等这一点在选参数时可以直接用。下面这份初始化脚本是直流伺服电机模型的例子参数按工程常见量级给的读者换实际电机时只需要改数值% 三环电机仿真参数初始化 R 1.0; % 电枢电阻单位 Ohm L 0.005; % 电枢电感单位 H Kt 0.2; % 转矩常数单位 N*m/A Ke 0.2; % 反电动势常数单位 V/(rad/s) J 0.002; % 折算到电机轴的等效转动惯量单位 kg*m^2 B 0.0002; % 粘性阻尼系数单位 N*m*s/rad Udc 24; % 母线电压单位 V Imax 8; % 电流限幅单位 A Vmax 0.95 * Udc; % 电流环输出限幅留5%余量给PWM调制 Vref_max 600; % 速度环输出限幅单位 rad/s % 电流环、速度环PID初始参数先给一组保守值后面再整定 cur_kp 1.5; cur_ki 300; spd_kp 20; spd_ki 1200; pos_kp 12;逻辑说明这个脚本在运行模型之前执行Simulink里的Gain模块和PID模块直接引用这些工作区变量名。Kt和Ke在SI单位系下数值基本相等如果电机手册里一个给N·m/A一个给V/(rad/s)可以直接互用J这里要特别注意联轴器、负载、减速机折算到电机轴之后叠加进来不是只填转子惯量。Vmax留5%余量是给PWM调制用的仿真里直接当饱和限幅值。初始PID参数不需要准但要保守保证第一次仿真不炸。3.2 从空模型到三环闭环Simulink模块清单与连线顺序参数脚本建好之后新建一个Simulink空模型按下面的模块清单往里放模块。PID控制器在Simulink库里的路径是 Simulink/Continuous/PID Controller饱和是 Simulink/Discontinuities/Saturation传递函数是 Simulink/Continuous/Transfer Fcn。模块关键参数设置作用Step1Step time0.1Final value1位置阶跃指令单位radSum1加减符号设为 -算位置误差Gain1pos_kp位置环P控制器Saturation1上下限设为 ±Vref_max限制速度指令PID Controller1速度环PIPspd_kpIspd_ki速度环控制Saturation2上下限设为 ±Imax限制电流指令PID Controller2电流环PIPcur_kpIcur_ki电流环控制Saturation3上下限设为 ±Vmax限制电压输出Transfer Fcn1分子[1]分母[L R]电枢电磁环节 1/(LsR)Gain2Ke反电动势反馈Sum2加减符号设为 -电压减去反电动势Gain3Kt转矩常数电流转力矩Sum3加减符号设为 -力矩减负载力矩Transfer Fcn2分子[1]分母[J B]机械环节 1/(JsB)Gain41转速信号引出到速度反馈Transfer Fcn3分子[1]分母[1 0]位置积分 1/sScope1/2/3接线端子看位置、转速、电流波形连线顺序按控制流走Step1经过Sum1产生位置误差Gain1放大成速度指令过Saturation1进速度环PID速度环输出带限幅后作为电流指令进电流环PID电流环输出过Saturation3后在Sum2那里减去反电动势进Transfer Fcn1得到电流电流经Gain3变转矩在Sum3减去负载后进Transfer Fcn2得到转速转速经Transfer Fcn3积分得到位置反馈同时把转速反馈回速度环Sum电流反馈回电流环Sum。这里有一个关键点反电动势反馈必须在电压求和处而不是加在电流环输出之后。很多初搭模型的人把反电动势漏掉仿真照样能跑因为电流环PI会自动补上这个电压但参数整定结果会偏乐观上机后电流环响应比仿真慢。反电动势增益接在Gain2从Transfer Fcn2的输出端引出接到Sum2的负号端。速度反馈和位置反馈各自回到对应环路的Sum负号端不能串线。3.3 用add_block脚本搭模批量扫参前值得做的事如果只是验证一组参数GUI里拖模块够用。但后面做批量扫参每次手动改PID参数再点仿真很痛苦。我一般会把模型搭建本身也脚本化用add_block、set_param、add_line把整个模型在MATLAB命令里建出来。这样模型文件本身就是代码重跑、换电机、批量扫参都方便。% 用脚本生成三环模型骨架版 new_system(tri_loop_motor); open_system(tri_loop_motor); % 添加电流环PI、饱和、电磁环节 add_block(simulink/Continuous/PID Controller, tri_loop_motor/Cur_PID); add_block(simulink/Discontinuities/Saturation, tri_loop_motor/Cur_Sat); add_block(simulink/Continuous/Transfer Fcn, tri_loop_motor/EMF_TF); % 设置PID参数变量直接引用工作区 set_param(tri_loop_motor/Cur_PID, P, cur_kp, I, cur_ki); set_param(tri_loop_motor/Cur_Sat, UpperLimit, Vmax, LowerLimit, -Vmax); set_param(tri_loop_motor/EMF_TF, Numerator, [1], Denominator, [L R]); % 连线auto routing自动布线 add_line(tri_loop_motor, Cur_PID/1, Cur_Sat/1, autorouting, on); add_line(tri_loop_motor, Cur_Sat/1, EMF_TF/1, autorouting, on);逻辑说明这段代码和GUI操作完全等价运行后模型文件就出现在面前参数全部由工作区变量驱动。set_param里P和I的值直接填变量名不要填数字这样后面扫参时改工作区变量就能控制整个模型。add_line的autorouting参数让布线自动绕开已有模块省去手动拖动连线的麻烦。实际模型里模块较多脚本会写到上百行建议把模块命名用前缀区分环路比如Cur_、Spd_、Pos_不然回头查线都费劲。4. 三环PID参数整定先公式估算再仿真微调4.1 电流环PI用零点对消估算数值例子与验证电流环的被控对象是电枢回路传递函数可以写成1/(LsR)。最常见的整定做法是让PI控制器的零点去抵消对象的极点也就是让Ki/Kp等于R/L。这样一来前向通道就变成一个纯积分环节Kp/Ls闭环变成一阶系统电流环响应时间由Kp/L直接决定。数值例子R1ΩL5mH则R/L200零点对消要求Ki/Kp200。期望电流环带宽取300 rad/s即Kp/L300得到Kp1.5KiKp×200300。这一组参数就是上一章脚本里的初始值。PID模块里P填1.5I填300电流环闭环就是一阶惯性上升时间约3毫秒没有超调。仿真验证方式很简单给电流环单独一个阶跃电流指令看电流Scope波形。理想情况下电流平滑上升并稳定无超调无明显振荡。如果波形有振荡说明带宽取得太高或者零点没对消干净如果有静差要检查是不是反电动势反馈接错位置。电流环在三个环里最接近理想一阶通常一次就能调好。4.2 速度环按典型II型系统整定h5的参数公式速度环面对的是电流环闭环加机械惯量。电流环闭环带宽远高于速度环可以等效成一个小惯性环节1/(τs1)τ取电流环等效时间常数。机械环节是1/(JsB)通常阻尼B很小近似成1/Js。速度环对象就变成了K/(s(τs1))其中K1/J。对这个对象工程上常用典型II型系统整定控制器取PI按中频宽h5设计。速度环PI参数为Tvh×τKn(h1)/(2×h²×τ²×K)。代入例子τ约3.3毫秒K1/J500h5算出的Tv约16.7毫秒Kn约21。所以速度环P21IKn/Tv约1260。仿真里我一般先按这个公式给参数然后看阶跃速度响应微调。典型情况是超调略大因为仿真里没有考虑实际驱动器的延迟和电流环的延迟余量。做法是把P稍微降一点比如从21降到18超调就能压到5%以内。速度环的I参数决定消除静差的速度调大收敛快但太大会在速度阶跃时出现明显过冲一般只在P确定后微调。4.3 位置环从P控制起步要不要加D看曲线说话位置环的被控对象是速度环闭环加上一个积分环节。速度环带宽足够高时位置环对象近似1/s用P控制器就能做到无静差。位置环带宽取速度环的1/2到1/3所以P的初值就是期望位置环带宽的数值比如12 rad/s直接填pos_kp12。仿真看位置阶跃响应P控制下系统是一阶积分加小滞后通常有10%到20%的超调。如果想压低超调先降P不要急着加D。位置环加D在仿真里经常看起来很好因为仿真信号干净无噪声但实际系统中编码器量化噪声、机械抖动会被微分放大成高频指令电机嗡嗡响甚至发热。我的习惯是位置环只用P若超调大改用斜坡给定或速度前馈效果比加D干净得多。如果需要更好的跟踪性能可以在位置环之外加前馈速度前馈Gain模块直接跨过位置环P从位置指令的微分接到速度环给定和处。这样不增加环路增益又能显著减小跟随误差。仿真里验证前馈是否生效看斜坡位置输入下的跟踪误差有前馈时误差应明显减小。4.4 写一个单组参数评估脚本sim()跑一遍自动算指标手调参数看Scope波形没问题但要对比多组参数就很低效。我会写一个评估函数输入一组PID参数自动跑完仿真把超调量和调节时间打印出来。这个函数后面做扫参直接复用。function [OS, Tsettle] eval_pid(pos_kp, spd_kp, spd_ki, cur_kp, cur_ki) % 参数注入基工作区Simulink模块按变量名读取 assignin(base, pos_kp, pos_kp); assignin(base, spd_kp, spd_kp); assignin(base, spd_ki, spd_ki); assignin(base, cur_kp, cur_kp); assignin(base, cur_ki, cur_ki); % 仿真1秒StopTime用字符串方式传入 out sim(tri_loop_motor, StopTime, 1); % 取位置输出 t out.yout{1}.Values.Time; y out.yout{1}.Values.Data; % 超调量计算(峰值-稳态)/稳态 ss y(end); peak max(y); OS max(0, (peak - ss) / ss * 100); % 调节时间最后离开2%误差带的时刻 tol 0.02 * ss; idx find(abs(y - ss) tol, 1, last); if isempty(idx) Tsettle 0; else Tsettle t(idx); end end逻辑说明asignin把参数写进基工作区这是Simulink模块读变量的默认路径。sim命令运行模型时靠StopTime控制仿真时长不需要在模型里配置。位置输出要经To Workspace模块存成out.yout在模型里加一个To Workspace变量名设置成yout即可。调节时间用「最后离开误差带的时刻」定义比第一次进入误差带更可靠能处理振荡式衰减的情况。这个函数本身不画图只看数字适合在命令行里快速比较参数。5. 三环仿真避坑清单五个最常见的翻车现场5.1 大阶跃超调压不下去积分饱和惹的祸现象给一个大阶跃位置指令输出很快就顶到限幅上但最后超调很大而且回落到稳态要等很久波形像被什么东西拖住一样。原因限幅起作用时PID的输出被截断但积分项还在按误差累积等系统快到位时积分器还存着很大一笔账输出继续顶在限幅上导致明显超调。仿真里不接限幅时这个现象不出现所以很多人一加限幅就开始怀疑模型有问题。解决给PID模块本身设置Output Saturation并勾选反计算抗饱和。Simulink的PID Controller模块自带这个功能把上下限填成和外部限幅一致的值再在Anti-windup method里选back-calculation系数Kb默认1即可。外部的Saturation模块保留作第二道保险但抗饱和逻辑必须以PID模块内部设置为准。5.2 限幅放错层级波形和实物对不上单位与回路层级现象电流波形看着正常但速度环一做大阶跃就出现平台期平台高度和预期电流限幅对不上调限幅数值波形却不按比例变化。原因限幅放错了回路层级。速度环输出的是电流指令单位是安培它的限幅应该用Imax电流环输出的是电压指令单位是伏特限幅应该用Vmax。如果两个限幅都填成Imax电流环限幅就把电压砍在8V实际最大电流远达不到设定限幅速度响应被无形中限制住了。解决回到第2章那张环路输出表逐个检查三个Saturation的值。位置环输出限幅填最大转速速度环输出限幅填峰值电流电流环输出限幅填母线电压。检查时把单位写在注释里三个人称不上玄学但确实是最容易埋雷的地方。5.3 仿真加D效果完美、上机就抖反馈噪声放大现象速度环或位置环加微分项后仿真曲线光滑漂亮调到实机上却高频抖动电机温度升高声音刺耳。原因仿真里的反馈信号是理想数学量没有量化噪声和测量噪声实际编码器有分辨率限制电流采样有纹波微分项对这些噪声是放大作用高频增益直接顶上去。仿真越完美实际越危险。解决把微分项去掉用PI控制。如果确实需要阻尼优先在速度反馈通道加低通滤波器比如一阶滤波Gain模块再接Transfer Fcn 1/(Tf s1)Tf取0.5到1毫秒。仿真里验证滤波效果时特意在速度反馈上叠加一个正弦噪声源观察微分项的输出你就会理解为什么建议不加D。5.4 固定步长太大波形毛刺一片采样时间与离散化现象仿真切换到离散求解器后原来连贯的波形变成锯齿状电流波形出现明显毛刺调节时间指标也和连续仿真对不上。原因三环仿真里电流环时间常数只有几毫秒如果固定步长取10毫秒甚至更大电流环的动态根本没法解析。仿真里看似微小的时间步对电流环来说已经是几个开关周期波形自然失真。解决固定步长至少取电流环等效时间常数的1/20比如τ3.3毫秒步长取0.1到0.2毫秒。如果模型里还要模拟PWM调制步长进一步缩短到PWM周期的1/5左右。另一个选择是直接用连续求解器ode23tb或ode15s变步长自适应三环模型没有强非线性时跑得也很快。离散控制器和连续对象混合建模时控制器采样时间要明显低于被控对象时间常数不然一定会出现本例的锯齿。5.5 位置环越调越抖带宽顺序被整反了现象位置环增益加大后系统不是在位置处平滑停住而是出现持续的小幅振荡频率听起来像电机在轻微晃动降低位置环增益又变迟钝。原因位置环带宽已经超过了速度环能响应的范围。外环比内环快相当于内环是带延迟的执行器外环每次纠正过头内环还在追赶两者形成极限环振荡。很多人先调位置环再回头调速度环就是这个顺序出问题。解决把速度环带宽提上去或者把位置环带宽降下来重新保证3到5倍的带宽间距。仿真里验证方法很简单把速度环的阶跃响应和位置环的阶跃响应放到同一个图里看位置环的上升时间明显比速度环慢两到三倍以上才安全。我在实际项目里遇到这类振荡第一反应永远是查带宽间距而不是调位置环PID参数。6. 把试参变成网格扫参用MATLAB脚本批量选参数6.1 两层循环扫出来一张参数表位置环和速度环参数相关性最强常规做法是固定电流环参数然后网格扫位置环P和速度环P、I。写一层嵌套循环把4.4节的评估函数拿过来直接用。% 网格扫参位置环Kp x 速度环Kp kp_pos_list 8:2:20; % 位置环P扫描范围 kv_spd_list 12:4:36; % 速度环P扫描范围 res []; for kp kp_pos_list for kv kv_spd_list [os, ts] eval_pid(kp, kv, 1260, 1.5, 300); res [res; kp, kv, os, ts]; end end % 筛选超调小于5%且调节时间最短的一组 ok res(res(:,3) 5, :); [~, best_idx] min(ok(:,4)); best ok(best_idx, :); fprintf(最优参数: pos_kp%.1f, spd_kp%.1f, OS%.2f%%, Tsettle%.3fs\n, ... best(1), best(2), best(3), best(4));逻辑说明外层循环扫位置环P内层循环扫速度环P速度环I固定为1260不动减少维度避免组合爆炸。每组参数跑一次1秒仿真把超调和调节时间存进矩阵。筛选条件先用OS小于5%过滤掉超调不合格的参数再在剩余组合里找最小调节时间。速度环的I参数可以单独扫但通常扫P就能找到性能拐点。参数范围不要一次拉太大先粗扫找趋势再在小范围里细扫效率更高。6.2 从结果表里挑参数超调、调节时间两个指标先跑3×721组把那组最优参数拿去实机或做进一步验证。表格里每行都是一次完整仿真这比Scope点波形直观得多。pos_kpspd_kp超调量调节时间8121.2%0.42s8202.1%0.31s12204.5%0.25s12287.8%0.18s163612.3%0.15s规律很典型带宽拉高则响应快但超调增大你需要在超调不超过5%的约束内选最快的组。位置环P取12、速度环P取20时就落在不错的位置。如果超调量都超标说明速度环带宽不够或位置环行程太激进回4.2节把速度环P调高再重新扫。6.3 我现在的三环验收习惯参数扫完之后我不会直接接受数字而是再验证两个波形一个是大阶跃位置的响应曲线确认稳定无振荡另一个是斜坡位置跟随看稳态跟踪误差是否在一个可接受范围。这两个波形过关参数才算真合格。这个习惯来自一次惨痛教训——某转台Demo里位置阶跃看着很完美一跑斜坡指令就开始明显滞后后来才发现只看了阶跃超调没看斜坡跟随误差。所以现在我每次扫完参都固定跑这两个case确认后才写入驱动器。这个流程希望帮到你。本文还有配套的精品资源点击获取

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

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

免费获取报价 →
↑