永磁同步电机无位置传感器全速域控制:注入+滑模观测器仿真
1. 全速域控制方案的整体架构与选型思路做电机控制的工程师都知道永磁同步电机无位置传感器控制最头疼的问题就是“低速死区”。转子反电动势和转速成正比转速一低反电动势就小到没法看直接套用中高速的观测器算法几乎必死。所以业内做全速域控制基本都走这样一条组合路线零速和低速阶段用高频方波注入法撑住转子位置估计转速上来之后切到滑模观测器SMO中间再用加权切换把两个观测结果平滑衔接整套算法在Matlab/Simulink里做仿真验证。这个方案算是目前工程落地最稳的组合套路之一既能覆盖零速满载启动又能保证中高速的动态响应。这篇文章我会把三种技术路线放在一个全速域控制框架里逐个拆解工程实现的关键细节包括高频方波注入的调制解调过程、SMO滑模面的设计和滤波补偿、还有加权切换时避免角度跳变的具体做法。最后再把我调试仿真时踩过的坑和排查思路整理出来给正在做PMSM无感控制仿真、或者准备把算法往平台移植的工程师做个参考。1.1 为什么必须“低速注入 中高速观测”双模组合先把底层的物理约束说清楚。永磁同步电机的基波模型里反电动势的形式是e_alpha -ψf · ωe · sin(θe) e_beta ψf · ωe · cos(θe)转速ωe降下来反电动势幅值同步下降。零速时反电动势理论上就是零任何基于反电动势的观测方法都失效。这不是算法好坏的问题而是信号源本身不存在。所以零速和极低速阶段必须换一种激励方式。常见的思路是给电机注入一个额外的高频电压信号利用转子凸极效应引起的电感不对称通过检测高频电流响应来解算位置。内置式永磁同步电机交直轴电感差异明显凸极率通常能做到1.3以上注入效果比较容易做出来。表贴式电机凸极率小需要更高的注入幅值和频率才能保证信噪比这也是为什么很多方案在表贴式电机上应用时要单独做参数适配。过了低速区间之后反电动势信号足够强了就可以用滑模观测器这类基于基波模型的方法。SMO对参数摄动和外部扰动有天然的鲁棒性电流环动态响应也更快是中高速段最常用的工程方案。两个观测器各自只在部分速度区间工作中间需要一个过渡策略把两段拼接起来这就是加权切换存在的意义。简单说低速信标靠注入高速靠反电动势切换靠加权三者配合完成全速域覆盖。1.2 三种方法在控制系统中的角色定位我用表格把分工理一下方便后续对号入座方法适用速度段信号来源优势固有短板高频方波注入零速至约10%额定转速注入信号的高频电流响应零速可用、低速带载能力好额外损耗与噪声、表贴式凸极率低时难做滑模观测器SMO约10%额定转速以上基波反电动势动态响应快、参数鲁棒性强低速信号弱时失效、抖振需要抑制加权切换过渡转速区间两个观测器输出融合平滑过渡、无角度跳变切换逻辑需要精心调参、依赖角度一致性在完整的矢量控制框架里电流环的Park变换需要转子位置转速环反馈也需要速度信息。无位置传感器控制的核心就是用上面这些观测器输出替代编码器的真实角度和速度。双模方案比单模自适应能力强很多代价是切换逻辑本身成为一个新的调试点。1.3 为什么选方波注入而不是正弦注入高频注入大类里旋转电压注入和脉振正弦注入是早年的常见做法。旋转注入需要在αβ系注入高频旋转电压然后通过带通滤波提取负序分量信号处理链比较长滤波器设计复杂工程落地时调试周期长。脉振正弦注入在估计d轴注入单相正弦电压解调相对简单但正弦信号的幅值包络提取仍然需要较高的带通滤波器阶数。高频方波电压注入是近些年工程上更喜欢用的方案。它和脉振正弦注入同属脉振系但注入信号是方波频谱主要集中在基波和奇次谐波比正弦信号更干净理论上滤波分离更容易。更关键的是方波注入的控制时机可以和PWM载波周期、电流采样点精确对齐电流响应在注入电压换向时产生阶跃变化采样窗口固定后解调算法非常简单对处理器算力要求也更低。注入频率的选择有几个硬约束。它必须高于电机基波频率和电流环带宽保证低频段不受影响同时又要低于PWM开关频率一般是开关频率的1/10到1/20。我常用的配置是开关频率10kHz时注入频率取500Hz到1kHz注入幅值取额定电压的5%到15%。太低不好提信噪比太高容易和电流环带宽打架这个区间是经验值实际要根据电机参数微调。2. 高频方波注入法的核心原理与Simulink实现2.1 方波注入法的位置解算逻辑脉振方波注入的物理基础是磁路凸极效应。在估计转子坐标系γδ系的γ轴上叠加上一个高频方波电压高频电流的响应会同时出现在γ轴和δ轴。如果估计角度和真实转子角度存在偏差Δθδ轴上的高频电流响应幅值和Δθ近似成正比而且是过零线性的。具体信号链路可以拆成四步第一步在估计d轴叠加方波电压信号形式是u_inj乘以方波符号函数。第二步采样定子三相电流转换到估计dq系得到包含高频分量的电流。第三步用带通滤波器把高频分量从基波电流里分离出来再做一次同步解调也就是乘以方波信号并低通滤波最终得到和位置误差Δθ成比例的直流量。第四步把这个误差信号送到PI调节器PI输出作为估计转速的修正量再做一次积分得到估计角度。整个环路不断修正直到Δθ收敛到零。这个结构和锁相环非常像本质上就是一个“角度锁相环”。我觉得用锁相环来理解方波注入的控制结构是最直观的PI负责锁定角度积分器负责输出只是输入信号不是频率而是位置误差。2.2 Simulink关键模块搭建与参数配置下面按模块逐个说我用一台额定功率3.7kW、极对数4、额定转速2000r/min的内置式PMSM作为默认参数对象额定相电压220V交直轴电感Lq12mH、Ld6mH反电动势系数0.18V·s/rad。注入信号源模块用Pulse Generator生成方波周期设2e-3s占空比50%幅值设为20V到40V相当于额定电压的10%左右。这里注意Pulse Generator输出的是0到幅值的方法要先加减幅处理变成±U_inj的对称方波否则会产生直流偏置。载波同步方面如果模型里PWM的载波是10kHz建议方波切换时刻和载波周期对齐。更简单的做法是在离散仿真里把注入方波的采样步长设定为载波步长的整数倍避免异步采样导致的高频噪声。带通滤波器模块中心频率选注入频率500Hz通带选±100Hz左右建议用二阶或四阶巴特沃斯带通。滤波器阶数越高分离效果越好但相位延迟也越大。在初始版本里我通常用二阶先跑通再根据位置误差波形微调。如果发现带通输出幅值太小先检查注入频率是否落在通带内部。解调模块将带通输出的电流信号乘以同频方波再用低通滤波器提取直流分量。这里的低通截止频率可以设在50Hz到100Hz之间值越小越平滑但相位延迟越大启动阶段收敛速度会受影响。位置观测器模块解调得到的误差信号进PI调节器比例项Kp和积分项Ki一起把稳态误差清掉。PI输出是机械角速度估计值除以极对数得到电角速度再积分得到电角度。为了防止输出角度溢出要加模2π处理Simulink里可以直接用Modulo或Remainder模块。下面给一个仿真初始化脚本的示意片段把关键参数集中管理起来% 电机参数 Rs 0.96; % 定子电阻/欧姆 Ld 6e-3; % d轴电感/H Lq 12e-3; % q轴电感/H flux 0.18; % 转子磁链/Wb pn 4; % 极对数 Jn 0.003; % 转动惯量/kg·m^2 % 注入信号参数 f_inj 500; % 注入频率/Hz u_inj 30; % 注入电压幅值/V f_sw 10000; % 开关频率/Hz fs 1e-5; % 仿真步长/s % 观测器参数 w_lpf 2*pi*100; % 低通截止频率/rad/s kp_pll 20; % 位置环比例 ki_pll 200; % 位置环积分我自己的习惯是把这些参数全部集中到一个初始化脚本里模型内只留变量名。这样后面做参数扫描会方便很多不用挨个打开模块属性窗口改数值。2.3 方波注入阶段必须注意的三个细节第一个是初始位置极性判断。方波注入解算出的角度只有模π的信息也就是零度到一百八十度区间因为注入信号对N极和S极的响应在理想模型里是对称的。如果启动位置落在反方向电机启动瞬间会倒拖甚至过流。工程上常规做法是先给一个短时脉冲序列观察d轴电流响应方向来判断极性再决定是否给角度补π。仿真里可以简化处理但我建议把这个逻辑加进去否则后面和实际硬件对接时会吃大亏。第二个是滤波器延迟补偿。带通和低通滤波器都会引入相位延迟导致角度观测结果滞后真实位置。低速段转速变化慢延迟影响不大但到了过渡区两端角度出现固定偏差就是从这里来的。选中带通滤波器时可以通过波特图读出注入频率处的相位滞后量在角度输出端做前向补偿。第三个是电流采样窗口。方波注入时高频电流在电压换向瞬间变化率很大如果采样时刻不固定解调出来的信号会带很大的离散噪声。用定步长仿真时要把采样控制器的采样时刻设置成和注入方波换向时刻固定错开一般错开1/4载波周期就够。3. SMO滑模观测器的原理与Simulink实现细节3.1 SMO的数学模型与滑模面设计SMO的作用是在中高速段从反电动势里估计转子位置和转速。它在αβ静止坐标系里建立定子电流方程写成状态空间形式然后构造一个滑模观测器让观测电流跟踪实际电流。当滑模运动建立以后切换项的平均值就可以用来估计反电动势。在αβ坐标系下PMSM的定子电压方程可以写成u_alpha Rs·i_alpha Ls·di_alpha/dt e_alpha u_beta Rs·i_beta Ls·di_beta/dt e_beta其中反电动势分量里面包含了转子位置信息。观测器结构是用电压方程算出电流预测值再拿实际电流和预测电流的误差作为反馈经过滑模增益和切换函数修正预测值直到误差进入滑模面并保持为零。此时滑模控制律中的等效控制量就是反电动势的估计值。这里有一个工程上很关键的坑反电动势估计出来之后不能直接用来做反正切求角度。原因是反电动势是正弦波反正切对噪声极度敏感尤其是过零附近一个纹波就能让角度跳几度。所以位置提取我一般推荐用锁相环或者正交锁相。3.2 切换函数与滑模增益的工程设计切换函数最理想的形式是符号函数sign(s)但纯符号函数必然带来抖振。抖振在中高速段最直接的表现就是电流波形毛刺多、电磁噪声大。工程上常用饱和函数sat(s)或者连续函数s/(|s|δ)来替代。饱和函数的边界厚度δ需要试验太薄了抖振几乎没压下去太厚了滑模等效控制量有偏差位置估计会出现稳态误差。滑模增益k的选取需要满足可达性条件直观理解就是切换增益要大于反电动势幅值。我用一个实例说明估算量级上面的电机在额定转速2000r/min时电角速度是ωe 2000 × 2π / 60 × 4 ≈ 837.8 rad/s反电动势幅值Em ≈ ψf × ωe 0.18 × 837.8 ≈ 150.8V。那滑模增益至少不能小于这个值实际取1.5倍到2倍比较稳妥也就是200到300之间。要注意的是增益调得太大抖振也更大调太小低速段进入滑模状态的转速门槛会抬高和方波注入的切换区间就对不上了。3.3 反电动势滤波、角度提取与相位补偿反电动势的滑模估计量一般通过低通滤波器取平均值。但低通滤波器有个绕不开的问题就是相位滞后。滞后角度大小和滤波器截止频率ωc、电角速度ωe有关关系近似为Δθ_lag arctan(ωe / ωc)例如截止频率选100Hz在额定转速下ωe ≈ 837.8 rad/sωc ≈ 628 rad/s相位滞后就是arctan(837.8/628) ≈ 53度。如果不补偿这个偏差足以让电流环完全错相轻则效率下降重则失稳。所以很多论文里都在说补偿真正仿真时一定要算这一步。更稳妥的工程方案是干脆不用相位补偿改用锁相环从反电动势估计值里提取角度和速度。PLL结构天然带有滤波动态特性而且相位和速度同步输出方便直接用到矢量控制里。锁相环的带宽要覆盖电机转速变化速度同时又要滤掉高频纹波一般取几十赫兹到一两百赫兹之间。带宽高了动态好但纹波大低了平滑但滞后大这个取舍要结合工况调整。Simulink里搭SMO的核心模块不多电流误差计算、滑模增益和切换函数、低通滤波、反正切或PLL。我习惯把整个SMO封装成子系统输入是αβ轴电压电流输出是角度和速度。子系统内部用Memory模块打破代数环这一步比较关键否则离散模型经常提示代数环求解失败。4. 加权切换策略与整体仿真搭建4.1 切换区间设计与权重计算切换策略的目标是让系统从一个观测源平滑过渡到另一个。如果切换瞬间两个角度有阶跃偏差转速环和电流环都会受到冲击表现为转矩脉动甚至过流。我常用的做法是设一个归一化速度过渡带。以额定转速为基准0到5%区间只用方波注入5%到15%区间做线性加权过渡超过15%只使用SMO。权重的计算可以直接写进MATLAB Function模块里也可以写脚本离线算好查表仿真实测下来在线计算更灵活。权重计算逻辑的示意代码function [alpha, theta_obs] fcn(w_norm, theta_hf, theta_smo) w1 0.05; % 过渡带起点 w2 0.15; % 过渡带终点 if abs(w_norm) w1 alpha 1.0; elseif abs(w_norm) w2 alpha (w2 - abs(w_norm)) / (w2 - w1); else alpha 0.0; end % 角度加权前做unwrap处理避免角度跨越2pi导致加权异常 delta theta_smo - theta_hf; delta atan2(sin(delta), cos(delta)); theta_obs theta_hf alpha * delta; end注意这里的角度加权不是在原角度上直接做alpha乘加而是先算角度差再对角度差做wrap到[-π, π]的处理最后把加权后的差值加到基础角度上。直接对两个角度做alpha_A·θ_A alpha_B·θ_B一旦某个角度从π跳变到-π加权结果会瞬间产生巨大跳变这个坑我踩过。4.2 切换平滑性的两个关键前提加权逻辑写对了不等于切换就平滑。两个观测器在过渡区的输出首先要做一致性校正。我的做法是先把SMO的PLL锁相到当前方波注入输出的角度上让SMO角度在一开始就跟住注入角度等到SMO完成跟踪锁定之后再把权值逐渐切过去。这个“先同步再切换”的思路比直接加权切换效果好很多。第二个关键是过渡区间不要同时调电流环PI参数。很多人做仿真时喜欢在切换点顺便把控制器参数也切换掉结果两个变更叠加起来出了问题分不清是谁引起的。先把观测器切换做平滑稳定之后再去调控制器参数问题边界会清楚得多。4.3 完整Simulink多模切换模型框架一个完整的全速域矢量控制仿真模型从外到内大概分六层电源与逆变器层面直流电源、三相桥式逆变器、PWM调制器。电机本体层面Simulink自带PMSM模型或自定义dq模型机械负载输入。坐标变换层面Clarke变换、Park变换、反Park变换。控制算法层面速度环PI、电流环PI、SVPWM或正弦PWM、限幅与解耦项。观测器层面高速注入观测器子系统、SMO子系统、加权切换逻辑。监控与波形层面Scope模块、To Workspace导出用于后续数据分析。电流环需要角度转速环需要速度反馈这两个量在全速域算法里都要来自加权切换后的观测输出。也就是说加权切换模块的位置不仅在两个观测器之间还在整个控制回路的反馈通道上。模型里要保证从启动开始就让观测角度闭环运行不能先在开环状态跑一段再切闭环那会掩盖很多启动问题。仿真配置方面离散定步长模型建议步长设在1e-5s到5e-5s之间。步长太大PWM和注入信号的细节丢失步长太小仿真时间成倍增加。求解器我习惯用ode3或ode4这类固定步长求解器更适合电力电子开关模型。仿真时长按工况设计比如0到1秒零速满载启动1到3秒匀速升速到额定转速3到4秒加额定负载冲击4到5秒减速回零。这样一个仿真用例就能把全速域逻辑完整验证一遍。4.4 初始状态与启动流程的仿真设置启动阶段是全速域控制最容易出问题的地方仿真设置里值得单独做两个准备。第一个是初始转子位置必须设成已知值或者加上初始位置辨识子程序。因为方波注入只能收敛到模π如果初始位置给一个随机值仿真启动会有一段比较混乱的收敛过程。为了模拟真实启动可以在注入解调完成极性判断之后再让位置观测器闭环。第二个是启动时转速参考值不要给阶跃给斜坡或者S曲线。低速段本身就靠注入信号在撑转速突变会拉扯角度观测器给它一点加速时间收敛过程会稳定得多。5. 仿真调试中的常见问题与排查记录这部分是我实际调试中遇到最多的问题。很多问题不是算法原理不对而是仿真细节埋的雷。5.1 高频注入角度收敛到反向位置现象是启动瞬间电流冲击特别大电机实际转起来之后速度方向相反或者堵转。排查方向先看初始极性判断逻辑有没有生效。如果在仿真里实现了脉冲极性判断就检查判断阈值是不是太大了导致实际已经判断出来但逻辑没有翻转角度。还有一种情况是带通滤波器初始瞬态没有衰减完就开始解调建议把注入使能信号延时几个载波周期再开启位置环。5.2 切换到SMO瞬间转速抖动或电流尖峰这个现象我在仿真里见过很多次。最直接的原因是两个观测器的角度没有对齐加权切换在角度差较大的区间启动。解决办法是先把过渡区一个位置固定住单独给SMO的PLL一个角度跟踪指令让SMO角度稳态跟踪上注入角度再放开切换权重。另外检查一下加权函数的输出权值有没有做平滑比如加一个速率为1ms到5ms的一阶低通也可以明显减小切换瞬态。5.3 低速带载时高频注入噪声大、位置波动带载时电流幅值变大基波电流增多同样的带通滤波器可能没有把基波完全滤掉。调低带通滤波器通带宽度或者提高注入频率让基波和谐波的间隔更大。同时检查加入的高频注入电压是不是被电流环误当成了扰动。和电流环带宽保持一定距离之后这个耦合会小很多。如果仿真模型里带了死区模块高频注入下死区电压畸变会更明显需要用死区补偿模块或者先关掉死区跑通再逐步加上。5.4 仿真速度慢或者出现代数环警告模型出现代数环警告时优先在电流误差计算路径上插入Memory模块或者Unit Delay模块切断直通路径。步长太大也会引起PWM模块输出波形异常导致仿真不收敛。我一般把步长固定为开关周期的十分之一以下比如10kHz开关频率用1e-5s步长既能看清细节又不至于慢到没法调参。如果整个模型跑一次要十几分钟建议把不必要的Scope显示模块去掉用To Workspace加数据字典的方式离线分析数据速度能提升不少。5.5 常见问题速查表故障现象可能原因排查与解决思路启动反向或过流初始极性判断错误检查极性判断阈值与翻转逻辑延时启用位置环切换到SMO时抖动两个观测角度未同步先让SMO锁相跟踪低速角度再释放权重注入位置波动大带通滤波器带宽过大缩窄通带提高注入频率或注入幅值高速段角度滞后低通滤波器相位滞后用锁相环替代反正切或前馈补偿相位角SMO高频抖振明显滑模增益过大或符号函数切换改用饱和函数并调整边界厚度降低增益仿真不收敛或极慢步长过大或代数环步长降到载波周期的1/10插入Unit Delay加权切换瞬间临界振荡权重跳变太大对权重输出做低通平滑增大过渡带宽度最后分享一个我之前调试这类系统时踩过的深坑。把SMO的低通滤波器截止频率设得很高以为这样能加快动态响应结果反电动势波形里的高频毛刺全部进了角度提取位置观测结果一团糟。后来我养成了一个习惯每改一个滤波参数先用单独的信号分析模块看观测器的波特图响应再做整机仿真。很多仿真问题表面上是控制算法的问题实际上都是信号调理的问题。先保证观测信号干净再去折腾控制器参数调试效率会高很多。如果条件允许建议在做完仿真之后找一个小功率样机或者硬件在环平台验证一次启动和切换的动态过程仿真里很多被忽略的离散化细节往往就是真机调试时突然冒出来的硬骨头。