永磁同步电机无感控制:高速滑模观测器抖振优化与Matlab/Simulink复现

发布时间:2026/10/20 7:07:35
永磁同步电机无感控制:高速滑模观测器抖振优化与Matlab/Simulink复现
最近一段时间我把大部分精力都花在一个电机控制方向的复现项目上基于高速滑模观测器优化抖振问题的永磁同步电机无位置传感器控制算法要用Matlab代码实现。目前整个Simulink闭环仿真已经跑通从最初的符号函数滑模到最后的超螺旋优化中间走的弯路、踩的坑都记得很清楚。这篇就把整个复现过程、抖振优化的几种做法、参数整定经验一次说透给正在做无位置传感器控制或者准备复现类似算法的朋友一个参考。先说清适用人群如果你是做电机控制的研究生、工程师或者正在做永磁同步电机无感控制相关的毕业设计拿不到真实的电机台架想先在仿真层面把算法跑通、理解滑模观测器的工程细节那么这篇内容基本能覆盖你的需求。我尽量把每个关键选择背后的为什么也讲清楚不光是给一堆能跑的代码。另外关于标题里的“高速滑模观测器”我先给出我的理解这里的“高速”一方面指观测器的趋近律设计比较激进电流估计误差能很快收敛到滑模面属于“收敛速度快”的观测器另一方面整个方案也确实面向电机中高速段运行工况也就是反电动势法适用的速度区间。网上有些复现版本直接把它当普通滑模观测器处理我个人认为这样会丢掉一个关键信息观测器收敛速度快必然意味着滑模增益和切换项不能太小而这两个因素恰恰是抖振的决定性条件。所以“优化抖振问题”不是锦上添花而是这套方案能否工程落地的核心。1. 复现之前先把算法的定位搞清楚1.1 无位置传感器控制到底在解决什么永磁同步电机PMSM在工业伺服、电动汽车、压缩机这些场景下用得非常多因为它功率密度高、效率高、动态响应快。传统控制方案里转子位置和速度都靠编码器或旋转变压器测出来再交给矢量控制的坐标变换和速度环。但机械传感器有几个绕不开的缺点增加成本和安装空间同轴安装精度要求高在高温、震动、油污环境下可靠性会下降而且传感器故障通常会直接导致整台机器停机。无位置传感器控制的思路就是只利用定子电压和电流信息把转子位置和速度估计出来替代机械传感器。在成本敏感或者环境恶劣的场合这个优势非常明显。这也是为什么最近几年做电机控制的人几乎人手一个无位置传感器项目。1.2 为什么选滑模观测器而不是高频注入或龙伯格观测器无位置传感器控制按速度段大致分两类零低速用高频信号注入利用电机的凸极性来辨识位置中高速用反电动势法通过观测电机模型中的反电动势来估算转子位置。反电动势法里面又有很多细分方案比如滑模观测器、龙伯格观测器、模型参考自适应、扩展卡尔曼滤波等。我复现时选择滑模观测器主要看重三点结构简单、鲁棒性强、计算量小。滑模观测器对电机参数误差和测量噪声的容忍度比较高不需要非常精确的模型这在中高速段非常好用。它的缺点也很明确就是抖振。因为符号函数切换是不连续的直接拿它来提取反电动势会得到一串高频锯齿波形必须想办法平滑处理。这次的方案就是在这个矛盾点上做文章既要保留滑模观测器收敛快、鲁棒性强的优点又要抑制抖振对位置估计精度和电流波形质量的影响。1.3 高速工况的“甜蜜”和“麻烦”为什么这个方案要强调高速或者快速收敛因为反电动势法和电角速度直接相关转速越高反电动势幅值越大信噪比越好转子位置估计越容易做准。从这个角度看中高速段是无位置传感器控制的“舒适区”。但麻烦在于转速高了以后基频也高观测器需要更大的带宽才能跟上位置和速度的变化。带宽一旦提高符号函数切换的高频分量更容易穿透滤波器污染反电动势提取结果。如果你用低通滤波器强行压抖振又会引入相位滞后导致估计位置落后于实际位置影响电流环解耦。所以高速段对观测器的动态性能和滤波能力要求是同时往高处抬的这也是“快速收敛抖振抑制”必须被同时考虑的根本原因。2. 数学上的起点反电动势模型是整个估计器的地基2.1 静止坐标系下的电压方程复现任何无位置传感器控制第一步都是把电机方程写清楚。这里我采用的是表贴式永磁同步电机模型也就是直轴和交轴电感近似相等记 Ld Lq Ls。在三相静止坐标系变换到两相静止坐标系αβ轴后定子电压方程可以写成vα Rs·iα Ls·diα/dt eαvβ Rs·iβ Ls·diβ/dt eβ其中 Rs 是定子电阻Ls 是定子电感eα 和 eβ 就是反电动势分量。在实际仿真里这三个方程完全足够搭建观测器。注意这里我忽略了磁饱和、温度变化对参数的影响工程上后面再考虑。2.2 反电动势如何“换”出转子位置对表贴式永磁同步电机反电动势分量可以写成eα -ψf·ωe·sinθeeβ ψf·ωe·cosθe其中 ψf 是永磁体磁链ωe 是电角速度θe 是转子电角度。关键在于反电动势的幅值和角度里同时包含转速和转子位置信息。如果能把 eα 和 eβ 估计出来转子位置就可以直接用反正切得到θe atan2(-eα, eβ)这也是最直观的提取方式。但在实际工程里反正切对噪声非常敏感后面我会专门讲为什么最终建议用锁相环代替反正切。2.3 为什么反电动势法只在“中高速”成立反电动势幅值正比于转速。低速时比如转速只有额定值的百分之几反电动势可能只有零点几伏早被逆变器死区、电流采样噪声、AD量化误差淹没。这个时候你想用反电动势法去估计位置基本等于大海捞针。我一开始仿真时也试过直接从零转速就用滑模观测器结果位置估计完全发散后来才老老实实加了开环起动策略。这个事很关键也是很多初学者第一次复现无感控制最容易受挫的地方你拿着一个中高速工况的算法非要在零低速去验证结论当然一塌糊涂。正确的做法是低速用I/f或者闭环开环拖动转速抬起来以后再切换成滑模观测器闭环。3. 滑模观测器的设计过程与抖振生成机理3.1 以电流误差为滑模面的观测器结构滑模观测器设计思路其实很朴素我们不知道反电动势的具体值但知道它能被看作一个扰动项。于是先构造一个电流观测器让它的输出逼近实际电流再用控制量去消除模型误差最后从控制量里把反电动势“钓”出来。我采用的电流观测器形式是d(îα)/dt -Rs/Ls·îα (vα - uα)/Lsd(îβ)/dt -Rs/Ls·îβ (vβ - uβ)/Ls其中 uα 和 uβ 是滑模控制量。定义电流估计误差为滑模面sα îα - iαsβ îβ - iβ当状态进入滑模面 s 0 后也就是电流估计误差等于零时观测器模型与实际电机的差别完全由滑模控制量补偿。此时控制量的等效值就等于反电动势估计值。选择李雅普诺夫函数 V 0.5·(sα² sβ²)只要保证 V 的导数小于零电流估计误差就能被强制收敛到零。3.2 等效控制如何从离散符号中“榨出”反电动势传统的滑模控制量取符号函数形式uα k·sign(sα)uβ k·sign(sβ)这里有三个问题。第一符号函数要求开关频率无限高这在连续仿真里可以用变步长求解器凑合但实际系统里做不到第二等效控制是发生在无限高频切换下的平均效果你只能通过低通滤波器把这个平均值提取出来而这个低通滤波器会带来相位延迟第三k 的值必须大于反电动势峰值否则无法保证到达滑模面但 k 太大又会让抖振更严重。我在仿真中先按 k 比反电动势峰值大 1.5 到 2 倍来取后面在参数整定部分再详细展开。这一步跑出来之后电流误差确实能收敛但反电动势波形非常毛糙位置估计角度附近全是毛刺速度环也跟着抖。3.3 抖振到底是怎么来的抖振不是数字仿真造出来的假象它是滑模控制结构决定的固有现象。理想滑模要求系统在滑模面两侧以无穷大频率切换现实中受限于离散采样步长、逆变器开关频率、控制信号延迟切换只能在一个有限频率下完成。结果就是状态永远不会真正停在滑模面上而是在它附近做高频小幅震荡这就是抖振的来源。抖振的直接后果有几个。电流估计值带着高频分量电流环反馈明显变脏反电动势经过低通滤波后依然有毛刺角度估计波动加大在严重情况下估计速度会出现周期性脉冲速度环输出抖动甚至引发系统震荡。我实测过符号函数版本位置估计的角度在 5 到 8 度范围乱跳这个精度对矢量控制来说是完全不可接受的。所以优化抖振不是为了让波形好看而是为了让无位置传感器控制的系统有实际的稳定裕度和控制品质。4. 抖振优化边界层、超螺旋与提取端的联合改进4.1 方案一把符号函数换成边界层饱和函数最简单、也最容易理解的做法是引入边界层厚度 φ用饱和函数代替符号函数sat(s/φ) s/φ当 |s| φsat(s/φ) sign(s)当 |s| ≥ φ这个做法的物理含义很直观在滑模面附近开一个线性区间误差落在区间内的时候不切换而是做一个比例控制误差跑出去之后再拉回来。它直接把抖振的源头——高频切换给软化掉了。我用边界层厚度 φ 从 0.01 往上试位置估计毛刺明显减少。但这里有个取舍φ 太小抑制抖振作用有限φ 太大边界层内部变成一个低增益线性反馈对扰动不敏感稳态误差反而变大位置估计会出现明显的滞后或偏置。我最后取了 φ 0.05 左右在抖振和稳态精度之间找了个平衡点。这个参数对电流噪声水平很敏感不同电机、不同采样频率下要重新调。4.2 方案二超螺旋算法替代一阶滑模如果你追求更彻底的抖振抑制边界层饱和函数还是不够因为它本质上仍然是一阶滑模只是把切换频率人为降低。我做对比时发现负载突变瞬间边界层饱和函数还是会出现一段明显的抖振恢复过程。这时候超螺旋算法就值得试一下。它属于二阶滑模控制量由两部分组成u k1·|s|^(1/2)·sign(s) u_intdu_int/dt k2·sign(s)与一阶滑模相比超螺旋的控制量是连续的高频切换被压制在积分项里输出端反而看不到大幅度毛刺。更重要的是它保留了滑模的鲁棒性和有限时间收敛特性不是用牺牲响应速度换平滑。超螺旋有两个增益 k1 和 k2需要满足一定的不等式条件才能保证收敛但实际调试时我从经验出发k1 先按滑模增益 k 的 0.4 倍取再给积分增益 k2 一个较大的值确保扰动抑制能力足够。调对之后反电动势估计值基本不用低通滤波都非常平滑位置估计的角度误差可以控制在很小范围内。这里要提一句超螺旋里的积分项不会无限积分下去因为符号函数的方向由误差决定误差为零时符号项在零附近震荡积分项会自动稳定在一个有限值不会出现积分饱和问题。4.3 方案三指数趋近律和自适应滑模增益第三种优化方向是改趋近律本质上是换一种思路看抖振。抖振的出现是因为到达滑模面的过程中切换项一直在发挥作用。传统的常数切换项 ε 只要稍微取大一点切换频率就飙上去。指数趋近律的形式是ṡ -ε·sign(s) - q·s当 |s| 比较大的时候q·s 这一项占主导电流误差以指数速度快速收敛到滑模面附近这就是“高速”二字的一种落地方式当 |s| 很小的时候q·s 趋近于零只剩下小增益 ε 在维持切换。由于 ε 可以比传统取值小一个数量级抖振自然就小很多。我在代码里也试过在指数趋近律的基础上把滑模增益 k 做成自适应根据反电动势幅值在线调整。核心逻辑很简单反电动势峰值变大就适当提高 k反电动势小就降低 k保证 k 始终略大于当前工况所需的下界而不是永远取一个最大保守值。这个方案对转速大范围变化很有帮助不会出现那些转速一高就抖得停不下来的情况。4.4 位置提取端的改进用PLL代替反正切优化了观测器反电动势质量已经好很多但如果你还在用 atan2 直接提取角度会发现还是有一点毛刺并且反正切函数在角度靠近 ±π 附近时会出现跳变速度估计会甩出很明显的小尖峰。我后来把角度提取改成锁相环。锁相环本身是一个闭环系统天然带有低通滤波特性能够把角度误差平滑掉同时直接给出估计转速。基本结构是θ_err atan2(-eα, eβ) - θ_hatω_hat ω_hat ki_pll·θ_err·Tsθ_hat θ_hat (ω_hat kp_pll·θ_err)·Ts这里 kp_pll 和 ki_pll 分别是锁相环的比例和积分增益。调这两个参数时要注意带宽太低会让估计位置滞后带宽太高又会引入高频噪声。我一般会把锁相环带宽取在电流环带宽的十分之一左右具体值根据电机额定转速和采样频率微调。5. Matlab/Simulink复现全程核心代码与关键参数5.1 仿真系统整体架构我用 Simulink 搭了一套完整的闭环仿真模块大致包括永磁同步电机模型、三相逆变器模型、SVPWM调制、电流环PI、速度环PI、滑模观测器、锁相环位置提取以及坐标变换模块。电流采样用离散化模块采样周期取 1e-5 秒逆变器开关频率取 10kHz和实际控制器尽可能接近。这里多说一句如果你只是为了验证算法逻辑逆变器部分可以简化直接用平均模型输出 αβ 电压给电机和观测器。但如果你后面要做和实测更接近的验证逆变器最好还是用带SVPWM的离散模型因为 PWM 引入的延迟和高频分量对抖振影响非常大简化模型会高估算法性能。电机基本参数我按一个小功率表贴式永磁同步电机来设置参数数值说明额定功率500W小功率验证平台极对数4默认电机极对数为4定子电阻 Rs0.958Ω常温典型值定子电感 Ls5.25mH表贴式 Ld≈Lq永磁体磁链 ψf0.1827Wb额定工作点附近转动惯量 J0.003kg·m²仿真负载配置直流母线电压311V三相整流典型值开关频率10kHz逆变器载波频率采样频率100kHz观测器离散步长5.2 滑模观测器核心代码这是整个复现过程中最核心的部分。我用 MATLAB Function 模块写了观测器方便在标准滑模、边界层饱和函数、超螺旋三种方案之间切换。下面给出边界层饱和函数的完整代码可以直接放在 Simulink 的 MATLAB Function 里function [ialpha_hat, ibeta_hat, ealpha_hat, ebeta_hat] smo_boundary(ialpha, ibeta, valpha, vbeta, Ts) % 滑模观测器边界层饱和函数方式抑制抖振 persistent ialpha_h ibeta_h ealpha_h ebeta_h if isempty(ialpha_h) ialpha_h 0; ibeta_h 0; ealpha_h 0; ebeta_h 0; end % 电机参数 Rs 0.958; Ls 5.25e-3; % 滑模参数 k 50; % 滑模增益需大于反电动势峰值 phi 0.05; % 边界层厚度 wc 2*pi*500; % 反电动势低通滤波器截止角频率 % 电流估计误差 salpha ialpha_h - ialpha; sbeta ibeta_h - ibeta; % 饱和函数 sat(s/phi) sats_alpha max(min(salpha/phi, 1), -1); sats_beta max(min(sbeta/phi, 1), -1); % 电流观测器更新 ialpha_h ialpha_h Ts * (-Rs/Ls*ialpha_h (valpha - k*sats_alpha)/Ls); ibeta_h ibeta_h Ts * (-Rs/Ls*ibeta_h (vbeta - k*sats_beta)/Ls); % 对滑模控制量做低通滤波提取反电动势估计值 ealpha_h ealpha_h Ts * wc * (k*sats_alpha - ealpha_h); ebeta_h ebeta_h Ts * wc * (k*sats_beta - ebeta_h); ialpha_hat ialpha_h; ibeta_hat ibeta_h; ealpha_hat ealpha_h; ebeta_hat ebeta_h; end这个代码里有两个容易忽略的点。一是电流观测器方程里并没有显式出现反电动势它全被滑模控制量 k·sat(s) 包住了这也是为什么后面能从控制量里把反电动势提出来。二是低通滤波器的截止角频率 wc 不能取太高否则抖振滤不干净也不能太低否则反电动势相位滞后太大。500Hz 这个值是我对这台电机和 3000rpm 额定转速调试下来的折中值仅供参考。再给一个超螺旋版本的代码它不需要额外的低通滤波器就能得到较平滑的反电动势估计function [ialpha_hat, ibeta_hat, ealpha_hat, ebeta_hat] smo_super_twisting(ialpha, ibeta, valpha, vbeta, Ts) persistent ialpha_h ibeta_h u1a u1b if isempty(ialpha_h) ialpha_h 0; ibeta_h 0; u1a 0; u1b 0; end % 电机参数 Rs 0.958; Ls 5.25e-3; % 超螺旋增益 k1 20; % 比例项增益 k2 200; % 积分项增益 salpha ialpha_h - ialpha; sbeta ibeta_h - ibeta; % 积分项更新 u1a u1a Ts * k2 * sign(salpha); u1b u1b Ts * k2 * sign(sbeta); % 超螺旋控制律 u2a u1a k1 * abs(salpha)^0.5 * sign(salpha); u2b u1b k1 * abs(sbeta)^0.5 * sign(sbeta); % 电流观测器更新 ialpha_h ialpha_h Ts * (-Rs/Ls*ialpha_h (valpha - u2a)/Ls); ibeta_h ibeta_h Ts * (-Rs/Ls*ibeta_h (vbeta - u2b)/Ls); % 直接取连续部分作为反电动势估计 ealpha_hat u1a k1 * abs(salpha)^0.5 * sign(salpha); ebeta_hat u1b k1 * abs(sbeta)^0.5 * sign(sbeta); ialpha_hat ialpha_h; ibeta_hat ibeta_h; end超螺旋的 k1 和 k2 调起来比边界层稍微抽象一点。我的经验是先把 k2 取得大一些保证扰动抑制能力然后再调 k1 去控制收敛速度和抖振幅值。两个增益如果都偏大系统会变硬电流误差收敛很快但估计速度有高频噪声如果都偏小负载突变时估计位置会短暂丢失。建议用阶跃负载来做鲁棒性测试。5.3 锁相环位置提取代码观测器输出的反电动势交给锁相环处理避免直接反正切带来的角度跳变。下面是我在另一个 MATLAB Function 里写的锁相环代码function [omega_hat, theta_hat] pll_position(ealpha, ebeta, Ts) persistent theta_pll omega_pll if isempty(theta_pll) theta_pll 0; omega_pll 0; end % 锁相环PI参数 kp_pll 400; ki_pll 8000; % 误差角反正切结果与当前估计角之差 theta_err atan2(-ealpha, ebeta) - theta_pll; % 角度误差规整到[-pi, pi)防止角度突变 theta_err atan2(sin(theta_err), cos(theta_err)); % PI调节 omega_pll omega_pll ki_pll * theta_err * Ts; theta_pll theta_pll (omega_pll kp_pll * theta_err) * Ts; omega_hat omega_pll; theta_hat theta_pll; end锁相环和速度环的关系要注意如果锁相环带宽太高它会和速度环形成串联的滤波叠加相位裕量会被吃掉如果太低位置估计滞后过大会影响坐标变换解耦。我调试时先固定速度环带宽再在仿真里看估计位置与实际角度之间的跟随程度反复调 kp_pll 和 ki_pll直到阶跃转速下没有明显超调位置误差为止。5.4 仿真工况与典型结果对比为了验证抖振优化效果我设计了统一工况前 0.05 秒用 I/f 开环拖动电机0.05 秒后切换为滑模观测器闭环转速给定斜坡上升到 1500rpm稳定后 0.2 秒突加 3N·m 负载总仿真时长 0.4 秒。对三种方案做了相同条件下的对比以下是我复现参数的一组典型结果方案转速估计波动位置估计误差电流波形毛刺负载突变恢复符号函数滑模±8rpm以上5-8度毛刺明显严重明显震荡边界层饱和函数±3rpm左右1-2度较小小幅度波动超螺旋二阶滑模±1rpm左右0.5度以内很小恢复快且平滑这里要说明这些数据是在我上面给的参数和工况下的一次仿真结果不同增益组合下绝对值会变但趋势是确定的符号函数版本虽然结构最简单但抖振对位置估计的污染非常严重边界层饱和函数已经能拉到可用水平超螺旋则把位置估计质量提升到了接近有传感器时的精度。6. 参数调节经验与避坑记录6.1 滑模增益k怎么定才合适k 的取值是整个观测器调参的第一步。它的下限是反电动势峰值在上面的电机参数下1500rpm 时反电动势峰值大概是 ψf·ωe 0.1827 × (2π×1500/60×4) 约 22.9V。如果 k 取到 20 左右转速一高或者负载一重反电动势超过 k 的下界滑模就保持不住电流误差开始发散。我实际取 50差不多是反电动势峰值的两倍多一点。但这个值不是越大越好k 太大会让切换项幅值变大抖振能量随之增加。所以更合理的做法是让 k 跟反电动势幅值走也就是前面说的自适应增益。如果你不想做自适应就直接把一个工况范围的上限作为固定值保证最恶劣情况下也够用。6.2 边界层厚度和滤波器截止频率的配合边界层厚度 φ 和低通滤波器的截止频率 wc 是一对联动参数。φ 越大等效控制里被线性化的区间越宽反电动势里的高频分量越少但跟踪误差也越大。wc 越高反电动势提取越灵敏但抖振残留越多wc 越低相位滞后越明显。我自己调整的顺序是先锁定 φ 让观测器稳定再降 wc 压低剩余毛刺最后检查估计角度是否存在相位滞后。如果发现滞后优先考虑把锁相环带宽调高一点而不是盲目提高 wc。这样配合下来整体比较稳。6.3 锁相环带宽和速度环带宽的匹配这个坑比较隐蔽但影响特别大。锁相环输出的估计位置如果滞后矢量控制的 Park 变换角就偏差交直轴电流会出现耦合项电流环性能直接变差。速度环看到的速度信号也是锁相环提供的所以锁相环带宽必须比速度环带宽高出数倍否则会在速度环内再引入一个一级低通惯性环节相位裕量被吃掉。我通常先把锁相环带宽拉到速度环带宽的 5 到 10 倍然后看估计速度噪声大小。如果噪声大优先降低 k2 而不是把锁相环带宽降下来因为带宽一降系统的动态响应就垮了。6.4 低速启动和无感控制的全速度段覆盖问题最后一个必须提醒的坑是不要妄想一个滑模观测器通吃零到额定转速全范围。反电动势法在中高速段很香到了低速就无能为力。我跑仿真时验证过在低于 300rpm 左右时位置估计误差开始明显恶化如果再往下压失步风险非常高。工程上成熟的方案是低速用 I/f 开环拖动或者高频注入法专门处理零低速中高速再用滑模观测器无缝切换。我这次复现也只在 0.05 秒之后切到滑模闭环启动段完全是开环方式带上去的。你要是也想做全速度段的无感控制建议把启动策略单独做一个模块别指望抖振优化能顺带解决低速问题。低速段反电动势太小是物理上信噪比不足不是控制算法方面修一修就能绕过的问题。我自己的经验总结下来滑模观测器的工程价值集中在中高速段的鲁棒性和易实现性而抖振优化是让它从“论文里能算出来”变成“电控里能稳跑”的关键一步。超螺旋和边界层两种方案我都跑过如果你追求简单稳定边界层饱和函数是性价比最好的选择如果位置精度要求高、负载变化频繁超螺旋值得多花一点调参时间。另外跑仿真时一定要加逆变器和离散采样环节纯连续模型里看到的那种光滑波形离实际控制器差得远。