基于高速滑模观测器优化的永磁同步电机无位置传感器控制
做永磁同步电机无位置传感器控制的同学应该都跟滑模观测器打过交道。这东西结构不复杂、对参数误差和外部扰动都有不错的鲁棒性所以在工业传动、电动汽车驱动这些场景里被广泛使用。但真正跑过仿真甚至上过台架的人都知道传统滑模观测器有个非常头疼的毛病——抖振。反电动势估算波形上叠加着明显的高频毛刺转速估算有波动严重的时候还会影响转子位置观测精度导致闭环控制失败。我这次复现的“基于高速滑模观测器优化抖振问题的永磁同步电机无位置传感器控制算法”就是从这个问题切入。项目不是简单的跑通一个电机矢量控制仿真而是把传统滑模观测器换成高速滑模结构配合合适的趋近律和观测增益在保留滑模鲁棒性的前提下把抖振压下去。整套算法用Matlab/Simulink实现从电机模型、观测器模块到SVPWM闭环控制都有完整链路。这篇文章我把项目整体思路、核心原理、仿真搭建步骤、波形对比和调参经验都整理出来给正在做PMSM无位置传感器控制复现的同学一份能直接跟着做的参考。1. 项目整体思路与算法选型解析1.1 为什么要做无位置传感器控制永磁同步电机矢量控制的前提是知道转子磁极的位置和转速。常规做法是在电机轴上装编码器或旋转变压器但这样一来成本上去了二来在振动大、温度高的环境里机械传感器反而是最容易出故障的环节。无位置传感器控制的目的就是通过电机的电压、电流信息把转子位置和转速实时算出来省掉物理传感器。这个思路在空调压缩机、电动助力转向、无人机电机调速这些场景里特别有吸引力。一台压缩机可能就两三百块钱装一个几千线的编码器成本占比太高而且压缩机内部是密闭制冷系统根本没法装传感器。所以工业界对无位置传感器控制的需求非常刚性。目前常用的无位置传感器方案有好几种高频注入法适合零速和低速但依赖电机的凸极性实现时要加滤波器参数还不好调模型参考自适应系统MRAS结构简单但对电机参数敏感滑模观测器工作在中高速段结构直观、抗扰动能力强是工程应用里最常见的一类方案。这次复现的项目选的就是滑模观测器路线并针对它的固有缺陷做优化。1.2 滑模观测器的基本原理滑模观测器的核心思想是构造一个电机电流观测模型利用电流估计值与实际值的误差构造滑模面再通过滑模控制律迫使这个误差收敛到零从而在滑模等效控制中提取反电动势信息进而估计转子位置和速度。我尽量用不绕弯的话解释。永磁同步电机在αβ静止坐标系下的电流方程可以写成[ \frac{di_\alpha}{dt} -\frac{R_s}{L_s}i_\alpha \frac{1}{L_s}u_\alpha - \frac{1}{L_s}e_\alpha ] [ \frac{di_\beta}{dt} -\frac{R_s}{L_s}i_\beta \frac{1}{L_s}u_\beta - \frac{1}{L_s}e_\beta ]其中 (e_\alpha)、(e_\beta) 是反电动势分量它们里面包含了转子位置信息[ e_\alpha -\psi_f \omega_e \sin\theta_e ] [ e_\beta \psi_f \omega_e \cos\theta_e ]所以只要估计出反电动势就能算位置角和转速。滑模观测器一般设计成[ \frac{d\hat{i}\alpha}{dt} -\frac{R_s}{L_s}\hat{i}\alpha \frac{1}{L_s}u_\alpha - \frac{k}{L_s}\mathrm{sgn}(\hat{i}\alpha - i\alpha) ] [ \frac{d\hat{i}\beta}{dt} -\frac{R_s}{L_s}\hat{i}\beta \frac{1}{L_s}u_\beta - \frac{k}{L_s}\mathrm{sgn}(\hat{i}\beta - i\beta) ]当电流估计误差进入滑模面后滑模控制项的高频切换分量经过等效控制原理其等效值就等于反电动势。然后通过低通滤波器把高频分量滤掉就能拿到平滑的反电动势估算值。这里要特别注意传统做法里那个符号函数 (\mathrm{sgn}(x)) 是抖振的直接来源。控制器在滑模面两侧来回切换切换频率理论上无穷大实际系统里由于离散化和延迟就会形成高频振荡。这就是抖振。1.3 抖振问题根源与高速滑模的改进方向抖振的本质是理想滑模控制的不连续切换在实际系统中无法真正实现。只要用了 (\mathrm{sgn}) 函数开关增益再配合电机模型的离散化误差反电动势观测值上就必然出现高频毛刺。这些毛刺经过反正切计算位置角后会直接造成角度波动转速环也跟着抖。针对这个问题的改进思路大致有几类第一类把符号函数换成连续函数比如饱和函数、Sigmoid函数或其他连续化近似。这样滑模控制项不再是硬切换高频分量被显著削弱但代价是观测器的鲁棒性有所下降因为连续函数在滑模面附近的等效增益不是无穷大。第二类设计更高阶的滑模面或使用超螺旋算法。超螺旋滑模属于二阶滑模它在保持一阶滑模鲁棒性的同时把不连续项放到滑模变量的导数里让实际施加到被控对象上的控制量是连续的从而大幅削弱抖振。现在很多高水平的PMSM无位置控制论文都是这个路子。第三类用高增益观测器、龙贝格观测器代替滑模观测器这类方案没有抖振但参数鲁棒性差一些需要依赖准确的电机模型。第四类也是这个项目标题里提到的“高速滑模观测器”。这里的“高速”并不是指电机转速高而是指观测器本身以高速切换或高增益方式运行。它通常结合了连续趋近律、扰动观测补偿和自适应增益调整让观测器既能快速收敛又不会因为过大的切换增益而放大抖振。我复现时选的方案是在传统滑模观测器基础上用饱和函数替换符号函数同时引入自适应增益——滑模增益不再固定而是跟随转速和电流误差动态调整。低速和启动阶段用较低的增益避免振荡高速阶段适当提高增益保证估算精度。这一套改下来抖振问题从波形上看改善非常明显。2. 核心模型搭建从电机方程到观测器设计2.1 永磁同步电机在αβ坐标系下的数学模型复现之前电机模型必须吃透。这里用的是表贴式永磁同步电机SPMSM也就是 (L_d L_q L_s) 的简化情形。如果是内置式永磁电机电感不相等方程会多出磁阻转矩项和凸极效应观测器设计要复杂很多。定子电压方程在旋转dq坐标系下是[ u_d R_s i_d L_d \frac{di_d}{dt} - \omega_e L_q i_q ] [ u_q R_s i_q L_q \frac{di_q}{dt} \omega_e (L_d i_d \psi_f) ]对于表贴式电机(L_d L_q L_s)做Park反变换到αβ静止坐标系就得到我前面列出的电流方程形式。这里的 (R_s) 是定子电阻(L_s) 是定子电感(\psi_f) 是永磁体磁链(\omega_e) 是电角速度(\theta_e) 是电角度。在搭建Simulink模型时我建议直接用Simscape Electrical里的永磁同步电机模块或者用PMSM的标准数学模型自己搭。前者省事但内部细节不可见不方便观测反电动势和电机内部状态后者更利于学习也方便你验证观测器在理想电机模型下的效果。我自己偏好在 Simulink 里用标准方程组手动搭永磁同步电机模型把反电动势信号引出来这样后续对比观测器估算值和真实值会非常直观。2.2 传统滑模观测器设计传统滑模观测器的核心模块是电流观测器、滑模控制律、反电动势滤波和位置估计。电流观测器按照公式计算电流估计值 (\hat{i}\alpha)、(\hat{i}\beta)然后和实际电流做差得到滑模面。这里滑模面一般选为[ s \hat{i} - i 0 ]电流误差 (s_\alpha, s_\beta) 进入符号函数乘以常数增益 (k)作为校正项反馈回电流观测器。值得注意的是这个 (k) 必须满足可达性条件也就是要大于反电动势幅值。实际整定时一般取[ k \max(|e_\alpha|, |e_\beta|) ]如果 (k) 取得太小观测器无法收敛到滑模面估算就会失败如果取得太大抖振会非常剧烈。传统方案里这是个很尴尬的取舍为了保证全速度范围内都能收敛(k) 往往按最大转速下的反电动势峰值来选结果低速时增益严重过配抖振被放大。反电动势滤波一般用一阶低通滤波器[ \hat{e}_\alpha \frac{\omega_c}{s \omega_c} \cdot \text{等效输出} ](\omega_c) 的选取要平衡滤波效果和相位延迟。截止频率太低反电动势波形很干净但相位滞后大位置估算会偏截止频率太高滤波效果差抖振又回来了。这也是传统方案的一个痛点。2.3 高速滑模观测器优化点解析这个项目里用的高速滑模观测器和传统方案的核心区别有三个第一个区别是切换函数的替换。我把 (\mathrm{sgn}(s)) 换成了饱和函数[ \mathrm{sat}(s) \begin{cases} 1, s \Delta \ s / \Delta, |s| \le \Delta \ -1, s -\Delta \end{cases} ](\Delta) 是边界层厚度。当滑模变量进入边界层后控制量从“开关切换”变成“线性比例”高频切换消失抖振自然被压下来了。代价是滑模面的吸引域边界不再是严格滑模但因为电机系统本身存在惯性这个近似在实际工程中完全够用。第二个区别是自适应增益。传统方案增益固定高速滑模观测器让增益跟随转速和电流误差变化[ k k_0 k_1 |\omega_e| k_2 |s| ]简单解释就是转速高时反电动势大增益自动调高保证收敛转速低或误差小时增益自动降低避免多余抖动。这个策略对宽调速范围场景特别有用你不会为了最高转速的工况而在低速段忍受不必要的抖振。第三个区别是反电动势处理。传统方案用固定截止频率的低通滤波器高速滑模观测器里我改成了带相位补偿的滤波结构。先用低通滤波去掉高频毛刺再根据滤波器的相位滞后角度对估算位置做前向补偿[ \theta_{comp} \theta_{estimated} \arctan(\omega_e / \omega_c) ]这样既保留了滤波的平滑效果又不会因为滤波造成明显的角度滞后。实测下来补偿之后的位置误差能控制在比较小的范围内。3. Matlab/Simulink实现全过程3.1 仿真环境与版本建议我这次用的Matlab环境是R2021bSimulink和Simscape Electrical工具包都有。如果你的版本比较老建议至少R2020a以上因为新版本的PMSM模型和离散求解器对滑模这种高频切换的仿真支持更好。Simulink里离散步长、求解器类型直接影响抖振的仿真表现后面我会专门说。如果你的机器上没装Simscape Electrical也可以用Matlab Function手写PMSM模型相关性不大但建议后者的方式因为你可以把电机方程和观测器写在一起便于调试。3.2 电机模型参数设置我用的是表贴式永磁同步电机参数如下这些参数也是我调试时实际用的参数符号数值单位直流母线电压(U_{dc})311V定子电阻(R_s)2.875Ωd轴电感(L_d)0.003375Hq轴电感(L_q)0.003375H永磁体磁链(\psi_f)0.175Wb极对数(p)4–额定转速(n_N)1500rpm转动惯量(J)0.0008kg·m²阻尼系数(B)0.0001N·m·s在Simulink里我建议把电机模型参数用Matlab脚本里的变量定义这样Simulink模块引用变量名以后批量做参数扫描非常方便。比如在模型初始化脚本里写Rs 2.875; Ld 0.003375; Lq 0.003375; flux 0.175; p 4; J 0.0008; B 0.0001;这样在FOC控制器、SVPWM模块和观测器模块里都可以直接用这些变量。3.3 观测器模块实现细节滑模观测器模块建议用Simulink的MATLAB Function或者S-Function实现。如果用纯Simulink模块搭符号函数、积分器、增益这些拉起来也能搭但代码方式更直观且方便加入自适应逻辑。以下是我在MATLAB Function里写的核心观测器代码简化版function [theta_hat, omega_hat, e_alpha_hat, e_beta_hat] smc_observer(u_alpha, u_beta, i_alpha, i_beta, omega_mech, Ts) % 内部状态变量用persistent声明 persistent i_alpha_hat i_beta_hat e_alpha_filt e_beta_filt if isempty(i_alpha_hat) i_alpha_hat 0; i_beta_hat 0; e_alpha_filt 0; e_beta_filt 0; end % 电机参数可从外部传入这里直接用全局变量 Rs 2.875; Ls 0.003375; flux 0.175; p 4; % 自适应滑模增益 k0 100; k1 10; k2 0.5; k k0 k1 * abs(omega_mech) k2 * abs(i_alpha_hat - i_alpha); % 电流观测器方程 di_alpha_hat (-Rs/Ls) * i_alpha_hat (1/Ls) * u_alpha - (k/Ls) * sat(i_alpha_hat - i_alpha, delta); di_beta_hat (-Rs/Ls) * i_beta_hat (1/Ls) * u_beta - (k/Ls) * sat(i_beta_hat - i_beta, delta); i_alpha_hat i_alpha_hat Ts * di_alpha_hat; i_beta_hat i_beta_hat Ts * di_beta_hat; % 等价反电动势 滑模控制项滤波前 s_alpha k * sat(i_alpha_hat - i_alpha, delta); s_beta k * sat(i_beta_hat - i_beta, delta); % 一阶低通滤波 wc 2 * pi * 500; e_alpha_filt e_alpha_filt Ts * wc * (s_alpha - e_alpha_filt); e_beta_filt e_beta_filt Ts * wc * (s_beta - e_beta_filt); % 角度和速度估计 theta_hat atan2(-e_alpha_filt, e_beta_filt); % 对theta求导得到omega需要额外处理 omega_hat p * (sqrt(e_alpha_filt^2 e_beta_filt^2) / flux); e_alpha_hat e_alpha_filt; e_beta_hat e_beta_filt; end function y sat(x, delta) if x delta y 1; elseif x -delta y -1; else y x / delta; end end这里有个细节转速估算我用的是反电动势幅值除以磁链这个方式在高速段工作得很好但低速段反电动势幅值太小噪声会严重影响转速估算。实际工程里更常见的方式是直接对估算角度求导然后用低通滤波去噪。我建议在代码里同时对两种方式做个切换或加权低速用角度微分高速用幅值法能有效提高转速估算精度。3.4 位置与转速估算逻辑位置角估算最直接的方式是[ \hat{\theta}e \text{atan2}(-\hat{e}\alpha, \hat{e}_\beta) ]为什么是负号和这个比值因为反电动势分量和电角度的关系是 (e_\alpha -\psi_f \omega_e \sin\theta_e)(e_\beta \psi_f \omega_e \cos\theta_e)。所以[ \frac{-e_\alpha}{e_\beta} \frac{\psi_f \omega_e \sin\theta_e}{\psi_f \omega_e \cos\theta_e} \tan\theta_e ]再用atan2函数就可以得到完整的四象限角度值。但直接atan2的问题是当反电动势估算含有高频抖振时角度也会跟着抖。所以工业实现一般用锁相环PLL来提取角度和转速。锁相环的作用相当于一个自适应滤波器它的闭环结构能平滑地跟踪输入相位同时输出稳定的频率信息。我用的PLL结构很简单构造一个误差信号[ \epsilon \hat{e}_\alpha \cos\hat{\theta}e \hat{e}\beta \sin\hat{\theta}_e ]当 (\hat{\theta}_e \to \theta_e) 时(\epsilon \to 0)。把这个误差送入PI调节器输出就是电角速度 (\hat{\omega}_e)再积分得到估算角度。这样处理比直接atan2加低通滤波要平滑得多动态性能也好。在Simulink里搭PLL时我建议直接用离散PI控制器模块采样时间设置为Ts输出限幅设置合理范围避免启动瞬间角度跳变。3.5 系统闭环控制架构整个仿真系统是典型的三闭环控制外环是转速环中间是电流环观测器负责提供转子位置和转速反馈。转速环PI控制器输出q轴电流给定 (i_q^)d轴电流给定 (i_d^ 0)表贴式电机最大转矩电流比控制就是id0。电流环PI控制器输出dq轴电压经过反Park变换得到αβ轴电压再送入SVPWM模块产生开关信号驱动三相逆变器逆变器输出接PMSM模型。无位置传感器控制的关键在于反馈到转速环和电流环的位置信号不再来自编码器而是来自观测器估算值 (\hat{\theta}_e)。Park变换和反Park变换都用 (\hat{\theta}_e) 而不是真实角度。这就意味着整个闭环控制性能直接取决于观测器的估算精度。我在模型里添加了一个“理想位置/估算位置切换开关”。在调试阶段可以先切到理想位置运行让系统稳定后观察观测器的跟踪波形再把开关切到估算位置验证纯无位置模式下的闭环稳定性。这个开关设计在调试时非常实用避免了“系统一崩就不知道是控制器问题还是观测器问题”的困境。以下是Simulink模型的顶层模块列表供参考模块说明PMSM Model永磁同步电机方程输出三相电流、转速、位置三相逆变器用Universal Bridge或均值模型SVPWM空间矢量调制模块Clark/Park变换电流和电压坐标变换电流PI调节器d轴和q轴电流环转速PI调节器转速环滑模观测器核心模块输出估算角度和转速锁相环从反电动势提取位置和速度信号切换开关理想位置/估算位置切换4. 仿真结果分析与抖振抑制效果对比4.1 反电动势估算波形对比传统滑模观测器在固定增益、符号函数的配置下反电动势估算波形上有明显的高频锯齿状纹波。频率接近仿真步长的倒数和开关频率幅度能达到基波幅值的5%15%。这种波形进入角度提取环节会直接造成位置估算的毛刺。换成高速滑模观测器加饱和函数之后反电动势波形变得干净很多。高频毛刺基本消失波形接近正弦只在电机启动和负载突变的瞬态阶段有短暂波动稳定后能很快收敛到平滑状态。我在仿真中做了这样的对比同一台电机、同样的转速环和电流环参数只切换观测器的切换函数和增益模式。结论是饱和函数边界层厚度 (\Delta) 取0.10.2时反电动势波形毛刺减少了70%以上而角度估算误差没有明显增加。这说明用边界层换取平滑性是划算的。4.2 转速估算误差对比转速估算方面传统滑模观测器的转速输出波动较大。在1200rpm工况下传统方案的转速噪声峰峰值可能达到±30rpm而高速滑模观测器配合PLL之后转速噪声可以压到±5rpm以内。这里要注意PLL本身的带宽设定很关键。PLL带宽太低转速输出很平滑但动态响应慢突变负载时转速跌落大带宽太高转速噪声又变大。我实测的经验是PLL的PI参数按电流环带宽的1/51/10来整定能在动态和稳态之间取得比较好的平衡。4.3 转子位置估算精度对比位置估算误差是无位置传感器控制最重要的指标之一。我统计了稳定运行时的平均位置误差和最大误差。传统滑模观测器在滤波器和相位补偿不当的情况下位置误差可能在5°8°电角度高速滑模观测器加上锁相环处理后稳态位置误差可以控制在2°电角度以内。启动阶段的位置误差会偏大因为初始角度未知反电动势在零速时幅值为零观测器无法收敛。实际应用里一般需要预定位或者高频注入来解决零速启动问题。这个项目主要关注中高速运行所以启动策略可以先简单处理比如强制一个初始角度让电机拉入同步。4.4 高低速工况表现在300rpm低速工况下反电动势幅值较小信噪比低滑模观测器的估算性能会明显下降。高速滑模观测器由于增益自适应在低速时自动降低增益配合饱和函数的边界层尽量减小了噪声放大效应。实测在300rpm时转速波动大约±8rpm位置误差约3°4°还能维持闭环稳定如果要求更高就得用高频注入法了。在1500rpm额定工况下反电动势幅值足够大观测器性能最好。位置误差在1.5°左右转速波动很小电流波形正弦度也不错。这符合滑模观测器的应用定位中高速段是它的优势区间。5. 常见问题与排查技巧实录5.1 启动失败或估算发散这个是我被问得最多的一个问题。现象是仿真一开始观测器输出角度乱跳转速发散或者系统根本启动不了。排查步骤我建议按顺序来第一检查观测器增益是否满足可达性条件。低速时反电动势小增益可以小一点但太小确实无法收敛。你可以先给一个很大的固定增益比如 (k 500)看观测器能不能收敛到滑模面如果收敛了再逐步降低增益并加入自适应。第二检查坐标变换正负号。Clark变换和Park变换的方向、角度正负定义不一致是新手最容易踩的坑。如果反电动势估算和真实反电动势符号相反角度就会偏90°、180°等系统当然无法正常运行。第三检查仿真求解器设置。因为滑模观测器存在高频切换建议使用固定步长求解器步长不超过 (1e-5) 秒。步长太大高频切换无法正确表现会出现虚假抖动或发散。5.2 抖振仍然明显怎么办如果你换了饱和函数、加了滤波器抖振还是很明显可以从以下几个方面下手一是减小饱和函数的边界层 (\Delta)。边界层太宽滑模控制项的等效增益过低对抗动抑制力不足反而可能出现极限环振荡适当减小 (\Delta) 可以提高滑模面上的等效增益但也不能太小否则饱和函数退化成符号函数抖振回来了。经验取值是电流额定值的2%5%。二是检查电流采样噪声。Simulink理想模型里没有传感器噪声但如果你在模型里加入了噪声模块反馈电流质量差会让观测器输入恶化。可以在观测器输入端加一阶滤波但要注意和SVPWM延迟补偿配合。三是调整自适应增益的参数 (k_1, k_2)。如果高速时抖振大降低 (k_1) 的权重如果电流误差突变时抖动明显降低 (k_2) 的权重。自适应部分本质上是给你多一个旋钮不要在固定增益上死磕。5.3 位置估算滞后位置滞后一般来自低通滤波器。反电动势滤波截止频率太低相位滞后就大位置估算滞后也大。解决方法是提高截止频率或者增加相位补偿环节。我在3.3节代码里给出的 (\omega_c 2\pi \times 500\text{rad/s}) 是一个常用起点实际要根据电机转速范围调整。补偿角度可以用[ \theta_{comp} \arctan(\omega_e / \omega_c) ]把这个补偿值加到atan2/PLL输出的估算角度上基本能消除滤波带来的稳态滞后。但要注意补偿值是随转速变化的如果转速变化剧烈补偿的动态滞后会残留这种情况下提升滤波器截止频率比加大补偿更有效。5.4 参数整定心得最后分享几个我复现过程中的参数整定技巧这些在仿真里反复试过可以直接套用第一观测器增益和PI控制器参数分开整定。先把电流环、转速环调试好用理想位置反馈让系统稳定运行然后只切到估算位置再调观测器参数。这样每一步的变量少出了问题好定位。第二用脚本批量扫描参数。Matlab里写一个for循环循环修改 (k_0, k_1, \Delta) 等参数每次用sim命令跑仿真然后自动计算位置误差、转速波动等评价指标。比手动拖滑块高效得多。我一般把评价指标写成theta_err max(abs(theta_est - theta_act)); omega_ripple std(omega_est - omega_act);用这两个指标做简单优化能快速找到较优的参数区域。第三仿真步长不能随便选。我以前用可变步长ode45跑这个系统结果抖振一会儿大一会儿小波形看起来特别奇怪。后来改成固定步长ode4、步长 (1e-6) 秒波形立刻正常了。原因在于滑模控制本身就是高频切换可变步长求解器在切换点附近误差控制会失效产生数值噪声。第四磁链参数的准确性很重要。滑模观测器里的反电动势估算与磁链直接相关如果仿真模型里的磁链值和观测器里假设的磁链值不一致转速估算就会偏。做参数敏感性分析时可以在电机模型里把磁链调成0.16观测器里还是0.175会看到估算转速和实际转速明显偏差。所以在实际工程里磁链温漂是个需要认真对待的问题。复现这个项目最大的收获不是把代码跑通那一瞬间的成就感而是彻底搞清楚了滑模观测器各个参数之间如何牵一发动全身。固定增益、符号函数、低通滤波每一个在论文里都是一句话带过但真正调到波形平滑、误差可控需要大量的试验和数据对比。这篇里写的参数和步骤是我在复现过程中反复验证过的基本可以照着搭。如果你在调试时遇到了上述之外的特殊问题也建议回到电机方程本身逐项核对模型符号和采样逻辑大部分问题都出在这些基础环节上。