
简介自抗扰控制的电机Simulink仿真资源面向电机控制方向学生、科研人员与建模工程师以自抗扰控制ADRC为上层策略位置环负责角度精确跟踪速度环与电流环采用PI控制器用于解决传统PID在电机系统抗扰能力不足与参数整定困难的问题。压缩包共84个文件以mat数据文件、m脚本和slx模型为主分别用于保存仿真数据、实现控制算法与搭建系统模型并附带l、xml、slxc、mdl等配套文件整体仅706KB目录清晰便于二次开发。已有563人学习下载。内容包含不同版本的Simulink模型及辅助计算脚本可直接用于研究ADRC对电机位置、速度、电流三环控制的效果也可学习PI参数的整定方法观察系统对不确定性和扰动的在线估计与补偿过程熟悉三环级联结构以及不同工况下的响应特性对将自抗扰控制落地到电机仿真实践有直接帮助。1. 位置环自抗扰控制在 Simulink 里的正确打开方式位置环用自抗扰控制ADRC电流环和速度环继续沿用 PI这个组合不是炫技而是针对伺服电机负载突变、惯量变化和摩擦扰动最务实的做法。ADRC 的核心扩张状态观测器ESO能在扰动影响输出的同一拍里把它估计出来并补偿掉这是位置环 PI 做不到的。对做伺服驱动、机器人关节和转台控制的人来说这个方案的实际收益是少调一级位置环 PI代价是理解 ESO、b0 和观测器带宽这几个概念并接受一套和传统 PID 不太一样的整定逻辑。下面按三环结构把 ADRC 放进位置环在 MATLAB/Simulink 里完整搭一遍给出可复现的初始化代码和从内到外的整定顺序。2. ADRC 位置环的原理拆解ESO 估计的是“总扰动”2.1 为什么位置环用 ADRC电流环和速度环却保留 PI电机控制里电流环和速度环的对象相对“干净”。电流环面对的是电机的电磁时间常数模型可以写成 1/(LsRs)参数随温度变化但幅度有限PI 配上足够的带宽就能把电流跟踪做到毫秒级。速度环面对的是 1/(JsB)转动惯量 J 在大部分工况下保持稳定PI 也够用。这两个环的带宽高、采样周期短留给算法的时间很少PI 是计算开销和鲁棒性之间的最优解。位置环的问题不一样。位置环外面是纯积分环节 1/s而且负载变化会直接改变等效惯量摩擦、反向间隙和机械谐振也会以力矩形式作用在位置环上。传统位置环 PI 只能靠积分项慢慢消除稳态误差遇到突变负载会出现明显的动态速降。ADRC 的思路则是把模型偏差、外部负载和未建模动态合并成一个“总扰动”用 ESO 实时估计出来再在前向通道里直接补偿。换句话说位置环保留 PI 是默认工况下够用换 ADRC 是希望在工况变化时不用重新调参。2.2 一阶线性 ADRC 的数学形式与参数含义速度环闭环之后位置环看到的被控对象可以近似成一个一阶积分器转速指令 v_ref 到位置 θ 的关系是dθ/dt ≈ b0 * v_ref f(t)其中 f(t) 就是总扰动涵盖负载力矩变化、速度环跟踪误差、摩擦等b0 是控制增益的估计值理想情况下等于 1因为速度环会尽量让实际速度等于指令速度。对这个一阶对象设计一阶 ESO表达式如下e z1 - θdz1/dt z2 b0 * v_ref - β1 * edz2/dt -β2 * ez1 跟踪真实位置 θz2 跟踪总扰动 f。β1 和 β2 用带宽法取β1 2ωo、β2 ωo²ωo 就是观测器带宽单位 rad/s。控制律写为v_ref (u0 - z2) / b0u0 kp * (θ_ref - z1)u0 是比例控制器的输出kp 决定了位置环的响应带宽之后用 z2 做前馈补偿再把总增益折算回 b0。下表整理了这几个参数的物理含义调参时先搞清楚量纲是很有用的。参数含义量纲/典型值b0速度指令到位置变化率的增益理想约为 1(rad/s)/(rad/s)ωo观测器带宽越高估计越快但放大噪声rad/skp位置环比例增益近似决定闭环带宽1/sβ1观测器误差增益β1 2ωo1/sβ2观测器误差积分增益β2 ωo²1/s²2.3 用 MATLAB Function 写一个可直接运行的一阶 ADRC在 Simulink 里实现 ESO 有两种常见做法。一种是直接用 Sum、Gain、Integrator 模块搭出上面的微分方程优点是能直观看到观测器内部信号流动适合教学。另一种是把整个 ADRC 封装在一个 MATLAB Function 里代码紧凑后续做 C 代码生成也更干净。这里给出后者的离散实现控制周期 Ts 由位置环采样时间决定function [v_ref, z1, z2] adrc_pos(y, r, b0, wo, kp, Ts) % y: 实际位置, r: 位置指令 % z1: 位置估计, z2: 总扰动估计 persistent z1_p z2_p v_ref_p if isempty(z1_p) z1_p 0; z2_p 0; v_ref_p 0; end % 观测误差 e z1_p - y; % 扩张状态观测器离散更新一阶欧拉法 z1_next z1_p (z2_p b0 * v_ref_p 2 * wo * e) * Ts; z2_next z2_p (wo^2 * e) * Ts; % 控制律 u0 kp * (r - z1_p); v_ref (u0 - z2_p) / b0; % 更新持久变量 z1_p z1_next; z2_p z2_next; v_ref_p v_ref; end这段代码里有两个关键点。一是 ESO 更新用的控制量是上一拍的 v_ref_p而不是当前拍算出来的 v_ref这是离散实现的常规处理避免在同一个采样周期里出现代数环也让观测器对控制延迟更鲁棒。二是 z2 的更新只依赖观测误差 e 的积分没有直接使用位置微分因此不会放大编码器测速噪声。如果观测器带宽 wo 取得太高z2 曲线会出现高频毛刺现场调试时要能分辨这是真实扰动还是噪声放大。在 Simulink 里把这个函数放进 MATLAB Function 模块输入端接实际位置 y、位置指令 r以及一组常量 b0、wo、kp、Ts输出端 v_ref 接给速度环的指令。为了观察观测器行为可以把 z1 和 z2 引出来接到 Scope 或 To Workspace调参阶段这两路信号是判断 ESO 是否收敛的直接依据。3. 三环 Simulink 模型搭建ADRC 位置环与 PI 电流/速度环3.1 三环信号流与电机模型的两种选择整个模型的控制结构从外到内依次是位置环ADRC输出速度指令速度环PI输出 q 轴电流指令电流环PI输出 q 轴电压。d 轴电流通常控制为零用另一个 PI 单独闭环。位置反馈来自电机输出端的编码器或旋变速度反馈可以取自速度环自带的速度测量信号。被控对象有两种建模方式。第一种是用 Simulink 自带的永磁同步电机模型配合三相逆变器、坐标变换和 SVPWM完整模拟电流环的动态细节。这种方式适合验证算法最终能不能在这个电机硬件上跑缺点是模型复杂、仿真速度慢而且电流环的 PI 参数需要结合电机电感电阻值仔细算。第二种是等效传递函数模型把电流环闭环后的滞后近似成一阶惯性环节速度环被控对象直接用 1/(JsB)位置环就是纯积分器。这种方式能快速验证 ADRC 本身的收敛性和抗扰性参数调整也直观适合先把算法跑通。建模方式优点缺点适用场景PMSM SVPWM 完整模型逼近真实硬件能验证电流环极限仿真慢、模型参数多最终方案验证、硬件参数匹配等效传递函数模型仿真快、参数直观忽略电流纹波和反电动势动态ADRC 算法学习、控制参数预整定3.2 电流环 PI 和速度环 PI 的 Simulink 实现这里给出等效模型下的实现方式电流内环的等效时间常数取逆变器开关周期的一半典型值为 50 微秒。速度环的模型是电机转子部分的等效传递函数参数和常见小型伺服电机匹配但不需要依赖具体的电机型号也能复现整个仿真%% 电机与控制参数 J 0.0005; % 转动惯量 kg·m^2 B 0.0001; % 粘性摩擦系数 N·m·s/rad Kt 0.5; % 转矩常数 N·m/A Tinv 50e-6; % 逆变器等效时间常数 %% 电流环 PI按对象 1/(LsRs) 设计 L 0.005; % 定子电感 H Rs 1.5; % 定子电阻 ohm bw_cc 2000 * 2 * pi; % 电流环带宽 rad/s Kp_cc bw_cc * L; Ki_cc bw_cc * Rs; %% 速度环 PI按对象 1/(JsB) 设计 bw_sc 200 * 2 * pi; % 速度环带宽 rad/s Kp_sc J * bw_sc; Ki_sc B * bw_sc;电流环的 PI 参数来自开环零极点对消。电流对象是 1/(LsRs)PI 的零点放 s Rs/L 处剩下的开环增益由 Kp_cc/L 决定因此 Kp_cc bw_cc × LKi_cc bw_cc × Rs。速度环同理Kp_sc J × bw_scKi_sc B × bw_sc。这套公式算出的参数通常可以直接运行不需要反复试凑。电流环带宽取 2000 Hz 级别的角频率速度环取电流环的约 1/10这样内环比外环快一个数量级各环之间才能解耦。3.3 完整模型结构和初始化脚本模型内部的信号连接顺序是位置指令 θ_ref 与反馈 θ 一起进入 ADRC 位置环模块输出 v_refv_ref 与速度反馈做差进入速度环 PI含限幅输出 iq_refiq_ref 与反馈电流做差进入电流环 PI含限幅输出 vqvq 经过逆变器惯性环节和电机模型位置输出回到位置环。d 轴电流环用相同的参数和结构输入为 0用来维持磁场方向。初始化脚本里还要把 ADRC 的参数补充完整。在 MATLAB 的脚本文件中追加以下字段%% 位置环 ADRC 参数 Ts_pos 1e-3; % 位置环采样时间 s kp_pos 50; % 位置环比例增益 1/s wo_adrc 500; % 观测器带宽 rad/s b0_adrc 1.0; % 控制增益估计值 %% 饱和限幅 v_ref_max 20; % 速度指令限幅 rad/s iq_max 6; % q 轴电流限幅 A位置环采样时间 Ts_pos 比速度环和电流环慢 10 倍左右这样符合数字控制器里外环慢、内环快的常识。限制幅值的目的有两个一是防止速度指令过大导致速度环饱和二是防止 ADRC 在启动阶段 z2 初始误差较大时输出过大的速度指令。限幅是 ADRC 工程落地时最容易忽视的环节没有限幅的 ADRC 在仿真里可能会跑出看似很好的曲线但一上硬件就会因为输出超限而失控。在 Simulink 里把 PI 模块的积分器开启限幅并让积分限幅略大于输出限幅就能同时起到抗积分饱和的作用。ADRC 的输出端同样接一个 Saturation 模块限幅值取 v_ref_max。此时整个仿真模型已经可以运行下一步是确定所有参数的数值并用波形验证。4. 参数整定从电流环到位置环的带宽递进4.1 电流环 PI 整定的三条经验边界电流环的带宽不能无限提高它受限于逆变器开关频率和采样延迟。工程上常用的经验值是电流环带宽不超过开关频率的 1/10例如 10 kHz 开关频率对应约 1000 Hz 闭环带宽角频率约 6283 rad/s。带宽取太高时相位裕度下降电流会出现振荡取太低则速度环的带宽被压低整个系统的动态响应变慢。具体操作上先按前面给出的公式把 Kp_cc、Ki_cc 算出来然后跑一个电流阶跃响应观察电流跟踪指令的时间常数是否在预期范围内。如果电流曲线出现超调说明带宽偏高适当降低 bw_cc如果响应过慢则按比例升高。电流环的积分项不会导致太大的超调因为积分增益和 Kp_cc 同时增大零点位置保持不变。4.2 速度环 PI 的带宽法整定步骤速度环的整定比电流环多一个干扰源负载转矩。实际电机带上负载后J 会变大速度环带宽会相应变低。因此在整定速度环时Kp_sc 和 Ki_sc 要考虑最重的负载工况来取值。方法是在初始化脚本中把 J 换成最大负载时的等效惯量这样即使负载变化速度环也有足够的稳定裕度。整定过程分成两步。第一步去掉 ADRC直接把位置环的输出改成一个阶跃速度指令观察速度环的阶跃响应调节 bw_sc 让速度环超调小于 10%、无静态误差。第二步接上位置环但暂时把 ADRC 的 z2 补偿关掉也就是让 z2 强制为 0此时整个位置环等效成一个带速度内环的 P 控制器先确认位置环不会振荡再打开 ESO 补偿。这个顺序能区分位置环问题究竟是 ADRC 造成的还是速度环本身就有问题。4.3 ADRC 参数b0、观测器带宽与控制带宽的配合ADRC 参数整定的核心是理解三个量之间的关系。kp_pos 决定位置环闭环带宽它越大响应越快但会放大测量噪声。wo_adrc 必须大于 kp_pos观测器才能看见比闭环更快的动态经验上取 kp_pos 的 5 到 20 倍。b0 则是最容易让人迷惑的参数它表示控制输入到位置变化率的增益。在理想情况下速度环能无差跟踪速度指令所以 b0 约等于 1但如果速度环带宽不足速度指令与实际速度之间存在滞后等效 b0 会小于 1。实际操作中推荐这样调先把 b0 设为 1kp_pos 设为速度环带宽除以 5wo_adrc 设为 kp_pos 的 10 倍然后让系统跑一个阶跃位置指令。如果位置响应缓慢且有大的稳态误差说明 b0 偏大补偿过强降低 b0 到 0.5 左右如果位置出现振荡说明 kp_pos 过高或 wo_adrc 不足优先降低 kp_pos。下面给出一组经过多次调整可用的参考值参数参考值调参方向bw_cc12566 rad/s (2 kHz)升高直到电流出现振荡再回退bw_sc1256 rad/s (200 Hz)约为电流环 1/10kp_pos50 1/s升高直到位置环出现振荡wo_adrc500 rad/s跟踪噪声变大时降低b0_adrc0.8~1.2响应慢时减小振荡时增大一句话概括整定顺序电流环定带宽速度环定惯量位置环只管 kp_pos 和 wo_adrc 的比值最后用 b0 修正内环滞后带来的增益偏差。这套方法比盲调 PID 要快得多因为每一步只有一个主变量。5. 波形读法、抗扰验证与工程落地5.1 阶跃、正弦跟踪和突加负载的三种测试波形位置环调好后第一件事不是看定位误差而是观察 ESO 的输出 z2。给系统一个 1 rad 的位置阶跃在 Scope 里同时看实际位置 θ、位置估计 z1 和扰动估计 z2。z1 应当在几毫秒内追平 θz2 则保持在一个很小的常数附近反映的是速度环死区补偿后的残余摩擦。如果 z2 出现缓慢漂移通常是位置环采样时间过大或观测器带宽不足。抗扰验证用一个突加负载的测试在模型运行到 2 秒时给电机轴上加上额定负载 50% 的阶跃力矩。此时位置曲线会出现一个短暂的偏差传统位置环靠积分器慢慢拉回而 ADRC 位置环中 z2 会立即上升并补偿掉大部分负载影响位置偏差的恢复时间由 ESO 带宽决定。判断补偿效果好的标准是位置偏差峰值小、恢复时间短、z2 的估计值接近真实负载折算值。正弦轨迹跟踪则用来考察系统带宽。给一个 5 Hz、幅值 1 rad 的正弦位置指令记录位置跟踪误差的幅值和相位滞后。这个指标可以帮助决定是否需要提高 kp_pos但要注意跟踪误差的减小会让 z2 出现周期性的波动那是正常现象因为正弦跟踪时加速度本身就需要控制力来平衡。5.2 参数扫描脚本和 Simulink 外部模式验证批量扫描参数时不需要手动改模型用 sim 函数直接跑%% 批量扫描 b0观察位置阶跃响应 b0_list [0.5, 0.8, 1.0, 1.2]; figure; for i 1:length(b0_list) set_param(adrc_motor/b0_value, Value, num2str(b0_list(i))); sim(adrc_motor); plot(out.theta.Time, out.theta.Data, LineWidth, 1.2); hold on; end legend(b00.5, b00.8, b01.0, b01.2);这段脚本每次把模型里的常量块 b0_value 改成列表中的值然后运行仿真并叠加绘制位置曲线。通过对比响应速度、超调量和稳态误差能够快速确定 b0 的有效范围。注意 set_param 时逗号与点号的书写习惯这里 b0_value 是一个 Constant 块的名称。硬件联调阶段如果目标控制器支持 Simulink 外部模式可以让模型的一部分直接运行在控制器上另一部分保持与上位机通信。此时建议把 z2 单独映射到一个模拟量输出或调试变量上用示波器观察负载切换时 z2 的变化这样就能直接判断 ESO 是否真实估计出了负载力矩比看位置误差曲线更直观。另一个可行的办法是在 Simulink 里导出 FMU 模型提供给非 MATLAB 环境下的联合仿真工具调用作为算法验证的手段之一但前提是 ADRC 代码已经通过 MATLAB Function 封装并能生成标准 C 代码这要求位置环模块中不能有无法生成代码的库模块。综上这个三环架构实际调通的关键在于内环 PI 参数用对象模型直接计算位置环先用 P 控制验证内环再打开 ESO 的扰动补偿最后用 z2 波形来验收整个 ADRC 是否工作正常它的核心优势是让位置环在多工况下依然能保持稳定。本文还有配套的精品资源点击获取