ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

全速域PMSM无感FOC控制:高频注入与滑模观测器的工程实现

2026/10/2 20:26:29 拓冰建站 浏览量
全速域PMSM无感FOC控制:高频注入与滑模观测器的工程实现 1. 项目解读与全速域无感控制选型1.1 这个版本到底在解决什么问题搞电机控制的兄弟看到这个工程名应该会心一笑。B1.1版本全速域永磁同步电机无感控制低速段用高频注入做转子初始位置辨识中高速段交给滑模观测器SMO中间用权重切换把两个观测器平滑衔接底层跑在TI F283x/C2000平台上。翻译成人话就是一台IPM永磁同步电机不装编码器和旋变从完全静止起步一直到额定转速以上全程靠算法估算转子位置和速度实现磁场定向控制FOC。这就是业内说得最多的pmsm无感foc控制。为什么这么费劲因为FOC的核心是坐标变换坐标变换的前提是知道转子磁极的真实角度。有传感器时读一下编码器就行无感时只能靠电压电流硬估。而永磁电机有个物理规律反电动势正比于转速转速越低压在反电动势越小低速甚至静止时反电动势基本为零常规基于反电动势的观测器全部失效。所以要从零起步必须在“看不见”的时候重新造一双眼睛。这个版本解决的就是这双眼睛的问题。这个工程适合谁看我自己是这么定位的做压缩机、风机、水泵、伺服或者电动工具驱动的人已经在做有编码器FOC、想往无感方向迁移的人还有正在纠结怎么把高频注入、SMO和切换逻辑塞进一套代码的人。这篇博文没有宏大的技术展望只有选型、公式、参数、代码结构和后来踩过的坑按标题里的B1.1版本一条条拆开。顺便说一句很多人拿STM32跑FOC也会看到stm32 foc代码里出现类似结构和我在C2000上做的这套思路完全互通平台差异主要在底层外设和中断组织上。1.2 技术选型为什么是高频注入加滑模观测器对IPM电机零低速无感方案主流有三条路线高频注入、I-F强制启动、以及开环强拉。I-F固定角度强行拉转到中高速再切换闭环实现简单但切换瞬间电流冲击大负载突变容易失步高频注入则是低速时就保持闭环状态只是用凸极效应感知位置动态好但算法复杂而且要克服噪声、带宽、极性判断等一堆问题。B1.1选择高频注入主导低速更符合“全速域都要能顶得住负载”这个要求。中高速选SMO而不是龙贝格观测器或扩展卡尔曼滤波最重要的原因是工程性。SMO本质是结构切换控制对电感电阻参数误差和外部扰动有天然的鲁棒性不需要矩阵迭代计算量在C2000这种DSP上非常友好。卡尔曼滤波理论上更平滑但矩阵运算、噪声协方差整定这套东西在电机工况多变时不一定更好调反而更容易把自己绕进去。网上也有写成“滑膜观测器”的其实是滑模Sliding Mode Observer正经名字是滑模观测器。权重切换是这套系统的胶水。单独一个观测器很难覆盖全速域高频注入在高速时因为逆变器电压利用率越来越低高频分量会挤占调制空间凸极检测信噪比也下降SMO在低速时反电动势太小符号函数驱动不稳定。所以在中速加权重过渡段低速用HFI角度、高速用SMO角度、中间按转速比例线性融合。标题里那一长串“B1.1版本”其实就是这三个环节的版本化组合。2. 低速段核心高频注入与转子初始位置辨识2.1 静止与低速时为什么要另起炉灶先回答一个常见疑惑为什么不能把中高速的SMO强行往低速推看反电动势方程E ψf × ω转速到1%额定值时反电动势也只剩1%额定值相比功率管开关噪声、采样量化和逆变器非线性来说这个信号已经埋进噪声里了。电角度和机械角度混在一起一眼看过去就是噪声。基于电压模型的位置估计在低频段几乎是不可观的。另一个问题是同步电机在零速时永磁体始终有磁场但旋转的反电动势为零没有任何与速度相关的电压分量。想靠积分相位来估计稍微有一点直流偏置积分器就饱和漂移位置自然就找不到北。所以低速只能重新找一个“位置信息的载体”这个载体就是IPM电机的凸极特性。很多刚入门的兄弟被foc启动问题卡住其实卡的不是电流环而是转子初始位置检测这一关。2.2 凸极效应与高频注入原理IPM电机结构上有个特点永磁体嵌入转子铁芯导致d轴磁路长、电感小q轴磁路短、电感大也就是Ld小于Lq这叫磁阻凸极。当你往某个随转子同步旋转的坐标轴注入高频电压时高频电流响应会随着转子位置变化这就是高频注入能工作的物理基础。高频注入的实现方式有很多B1.1里用的是脉振正弦注入就是往估计的d轴方向叠加一个正弦电压信号表达式大概是[ \begin{bmatrix} v_{dh} \ v_{qh} \end{bmatrix} V_h \sin(\omega_h t) \begin{bmatrix} 1 \ 0 \end{bmatrix} ]在高频激励下电感的阻抗占据主导电流响应里携带位置误差信息。推导到最后q轴高频电流近似为[ i_{qh} \approx \frac{L_d - L_q}{2 L_d L_q} \cdot \frac{V_h}{\omega_h} \sin(2\theta_{err}) ]其中θ_err是实际转子位置与估计位置的差值。只要这个值不为零检测回路就会产生一个正比于位置误差的信号喂给锁相环或PI观测器让估计d轴自动转到真实d轴方向。这个过程本质上和步进电机foc控制原理里说的“用电感差异识别转子位置”是同一个思路只是永磁电机上表现为凸极。2.3 初始位置辨识从凸极定向到N/S极判别高频凸极跟踪有个先天的缺陷电感凸极呈现180度周期对称也就是说它能锁定d轴所在的直线但分不清这条直线上哪个方向是真正的N极哪个方向是S极。如果直接把这条直线当作d轴有50%的概率方向是反的一启动就反转或者堵转。所以B1.1流程里把初始辨识分成两步。第一步是凸极大致定向。静止状态下向电机三个桥臂注入短时电压矢量或者直接用旋转高频注入先让观测器收敛到d轴方向得到θ_h。第二步是N/S极性判别我用的方法是脉冲比较法向估计的d轴正向发一个短时电压脉冲记录电流峰值再向反方向发一个同样宽度的脉冲记录电流峰值。因为永磁体存在磁路饱和正向励磁会让定子铁芯进一步饱和电感变小电流峰值更高反向励磁相当于去磁电感变大电流峰值更低。比较两个峰值就能确定真实N极方向如果反向峰值大就把角度加上180度修正。这一步的工程细节很琐碎。脉冲宽度要足够长让电流建立又不能超过电流限幅值一般根据电机的额定电流和d轴电感估算。我第一版直接按固定脉宽搞低温试验时电流没建立到位极性判断错误后来改成“电流峰值到阈值就停止”的方式才稳定下来。收到电流反馈后还要做一阶低通滤波不然单个开关周期尖峰会把比较结果带偏。2.4 高频注入参数选择的工程参考高频注入有两个核心参数注入频率和注入幅值。注入频率要远高于电流环带宽又不能超过PWM开关频率的1/5到1/10。以10kHz开关频率为例我一般取1kHz左右的正弦注入或者用方波注入时取5kHz的采样频率。太靠近电流环带宽电流环会把高频分量当成干扰去响应导致电流畸变太靠近开关频率采样混叠和逆变器死区效应会让解调信号一团糟。注入幅值直接决定信噪比但也会带来噪声和损耗。幅值太低高频电流淹没在量化噪声里幅值太高低速时电机发出明显的电磁噪声长期运行还会提高铁耗和温升。我习惯从母线电压的5%开始试逐渐降到刚好能正确辨识的最低值。需要说明的是IPM电机的凸极率Ld/Lq越大同样的注入幅值能看到的高频电流越大信号越好如果凸极率接近1那高频注入基本是徒劳。3. 中高速段滑模观测器SMO的实现要点3.1 为什么中高速选滑模过了低速段反电动势信号足够强了就可以切到基于反电动势的观测器。SMO核心思想是用符号函数强制电流估计值逼近实际电流在一个滑模面上来回切换切换量里天然包含了反电动势信息。和直接积分相比滑模不依赖精确参数只要有足够的切换增益就能收敛对电阻电感偏差有较强的鲁棒性。这正是工程上最看重的点一个产线上不同批次电机电感差个10%很常见SMO照样能跑。和龙贝格观测器、扩展卡尔曼滤波相比SMO的计算量小得感人。它不需要矩阵乘法不需要在线迭代几个差分方程加一个反正切就完事。在C2000这种带FPU的芯片上整个观测器只占主中断里很小一段执行时间还能留出余量做保护逻辑和通信。当然SMO也有代价符号函数抖动会引入高频噪声必须加滤波滤波又会带来相位延迟需要补偿这个矛盾绕不开。3.2 αβ坐标系下的SMO方程与结构在静止两相坐标系下IPM电机的电压方程可以写成[ v_\alpha R_s i_\alpha L_s \frac{d i_\alpha}{dt} e_\alpha ][ v_\beta R_s i_\beta L_s \frac{d i_\beta}{dt} e_\beta ]其中eα、eβ是扩展反电动势分量包含位置信息[ e_\alpha -\psi_f \omega_e \sin\theta_e, \quad e_\beta \psi_f \omega_e \cos\theta_e ]SMO的电流估计方程写成[ \frac{d\hat{i}\alpha}{dt} \frac{1}{L_s}(v\alpha - R_s \hat{i}\alpha - K{sm} \operatorname{sgn}(\hat{i}\alpha - i\alpha)) ][ \frac{d\hat{i}\beta}{dt} \frac{1}{L_s}(v\beta - R_s \hat{i}\beta - K{sm} \operatorname{sgn}(\hat{i}\beta - i\beta)) ]当电流误差被符号函数压到滑模面上之后符号函数的等效输出就近似等于反电动势。这里有几个已经在实际中踩过的点一是坐标系的符号定义不同论文里eα、eβ的正负号经常不一样照抄容易反相我调试时用编码器台架对比角度方向才最终定下自己代码里的符号二是符号函数本身不连续实际实现里可以用饱和函数saturation代替纯sign降低抖振幅度三是滑模增益Ksm必须大于反电动势幅值和模型干扰的上界否则系统进不了滑模状态电流误差会一直晃。3.3 反电动势滤波、角度与速度提取符号函数输出里充斥着高频切换分量直接拿来算角度会抖得没法用。我的做法是先过一个低通滤波器滤掉高频分量得到平滑的反电动势信号eα_lpf、eβ_lpf。低通截止频率的选择要覆盖最高基频比如额定电频率200Hz取500Hz到800Hz比较合适。截止频率太低高速时相位延迟大太高抖振滤不干净。位置提取有两种常见方式。第一种是直接反正切[ \hat{\theta}e -\operatorname{atan2}(e{\alpha_lpf}, e_{\beta_lpf}) ]这个方法简单但噪声直接反映在角度上而且四象限边界附近容易出现角度跳变比如从179度跳到-179度对后续角度融合是灾难。第二种是锁相环先构造位置误差[ e_{\theta} e_{\alpha_lpf}\cos\hat{\theta}e - e{\beta_lpf}\sin\hat{\theta}_e ]把误差送给PI调节器输出速度估计再积分得到位置角。这种方法天然平滑对噪声的抑制能力强速度估计也是连续的我最后就是用的PLL方式。速度还可以用反电动势幅值除以磁链常数来估计但电机磁链不准确时误差大我只拿它做限幅保护不让异常情况把速度环打飞。3.4 SMO整定的几条实战经验第一条参数敏感性。SMO方程里的Rs和Ls至少要整体匹配差太多会直接削弱观测器的收敛范围。电机温度变化导致Rs漂移是常见问题我一般取75度左右的电阻值做折中或者干脆把滑模增益提高一点让鲁棒性覆盖参数漂移。第二条滑模增益不是越大越好。Ksm大到一定程度抖振和噪声明显增大还容易激发机械共振。我调增益时的手法是低速切入SMO的临界点观察电流误差波形首次进入“贴滑模面”状态的Ksm然后在此基础上加20%余量再多就有害无益。第三条低通滤波相位补偿不能省。低通滤波器会让反电动势相位滞后滞后角度等于arctan(f_el / f_cut)其中f_el是当前电频率。我只是在代码里加了一个随速度变化的补偿量把低频和高频段的相位误差都修正掉。这个补偿对切换权重区的角度融合至关重要不补的话两个观测器角度对不上切换必跳。4. 权重切换让低速和中高速平滑衔接4.1 切换区间与权重函数设计权重切换在B1.1版本里承担的是“接力棒”任务。切换区间不能只有一个速度点否则两个观测器的角度差异会瞬间甩到切换控制上。我设定的区间是0到10%额定转速用纯HFI10%到15%额定转速为过渡区15%以上用纯SMO。当然具体要看你电机和负载风机类负载可以更早切SMO压缩机这种带负载启动的就得让HFI多管一段。权重函数我用的是一维线性插值[ k_{sw} \begin{cases} 0, |\omega| \omega_{lo} \ \frac{|\omega| - \omega_{lo}}{\omega_{hi} - \omega_{lo}}, \omega_{lo} \le |\omega| \le \omega_{hi} \ 1, |\omega| \omega_{hi} \end{cases} ]k_sw等于0表示完全用HFI等于1表示完全用SMO。实际使用中可以做成关于转速和转矩的二维查表因为重负载下SMO的可信区域会往后推但这会明显增加整定工作量B1.1先用一维线性已经能跑后续版本再迭代细粒度。4.2 角度与速度融合的实现细节角度融合的表达式很简单[ \theta_{est} (1 - k_{sw}) \cdot \theta_{HFI} k_{sw} \cdot \theta_{SMO} ]但这里藏着两个坑。第一个坑是角度连续性HFI的输出角度一般折算到0到2πSMO的PLL输出也是0到2π但两者在边界处可能一个在十几度、一个在三百多度直接加权平均就错了。我在代码里先把两个角度都归一化到-π到π并且以HFI角度为基准把SMO角度通过加减2π搬移到离它最近的副本上再做加权这样边界跳变就没了。第二个坑是速度估计的融合。HFI本身不直接给速度需要对角速度做微分或加观测器微分噪声大所以我让HFI路下的速度估计算法用低速锁相环加低通滤波SMO路的速度来自PLL输出。融合时同样按k_sw加权并且把最终估计值再过一次低通避免切换瞬间速度环给定突变。电流环最怕的就是位置和速度同时跳变那一下就是过流保护。4.3 为什么不要硬切换硬切换在工程上不是不行很多老代码就是这么干的到了某个速度直接切SMO切完再根据速度环拉回来。问题在于切换瞬间两个观测器的角度误差如果是10度电动状态会突然多出一截电流脉冲轻则扭矩抖动重则触发过流。对风机水泵这种大惯性负载能扛过去对伺服或压缩机硬切换基本会露出明显的转速波动和噪声。权重切换牺牲了一点过渡区的“观测纯净度”换来的是电流连续性。代价是过渡区内两个观测器是同时起作用的如果HFI在过渡区已经信噪比很差它会拖累SMO的角度所以我把过渡区压得比较窄并且当HIFI给出的角度误差超过阈值时直接提升k_sw跳过去这个安全逻辑留着关键时刻兜底。5. TI F283x/C2000平台上的工程落地5.1 软件架构与工程组织项目跑在TI F283x系列DSP上代码基于C2000Ware和Motor Control SDK搭的。这里多说一句很多新手用TI芯片不知道去哪找底层例程直接去TI官网注册账号搜索C2000Ware下载安装包里带了完整的PWM、ADC、GPIO外设库和电机控制例程比从零手写寄存器省太多时间。B1.1的工程就是在这个框架上分模块改出来的建议你也这么干。我的软件结构分四层底层驱动、信号采样、核心控制和防护逻辑。底层驱动只管ePWM、ADC、GPIO这些寄存器配置信号采样层做相电流重构、母线电压采样、标幺变换核心控制层就是FOC、HFI、SMO、权重切换防护逻辑放在慢速中断和故障标志里。全部功能在PWM中断服务函数里按固定顺序执行一个周期内完成采样、变换、观测、更新占空比。主中断的时序我这样排ADC转换结束触发中断后先读三相电流和母线电压做Clarke变换和Park变换然后跑电流环PI输出d/q轴电压再做逆Park变换生成调制波最后更新ePWM比较寄存器。HFI注入发生在电压指令叠加阶段也就是在d轴电压指令上直接加一个Vh×sin(ωh t)分量SMO观测和权重切换放在稍后的同一次中断里因为它们只依赖反馈不参与当周期的电流环执行可以用同一份采样数据。5.2 PWM波形、定时器与ADC同步采样FOC的PWM波形是否干净直接决定了无感算法能不能喂饱。ePWM配置成中心对齐模式三角载波这样SVPWM产生的输出谐波小且对称。比较寄存器用shadow模式在载波周期顶部一次性更新避免周期中间更新导致脉冲宽度跳变。PWM频率我放在了10kHz这个频率下开关损耗和电流纹波都处于合理区间高频注入频率取1kHz是开关频率的十分之一给ADC采样留下充足裕量。ADC采样点和PWM定时器要严格同步这是“foc pwm波形和定时器”里最容易翻车的地方。我利用ePWM的零计数值触发ADC模块启动采样采样时间点选在下桥臂导通且续流稳定的窗口。如果靠三个桥臂下桥电阻做电流重构必须避开开关换向的死区窗口和振荡区间否则重构出来的电流全是毛刺。ADC的采样保持时间也要够长我的做法是把采样窗口配置成PWM中心的对称窗口两个采样点取中间两次结果平均。另一个工程细节是高频注入对PWM调制的影响。当d轴电压指令上叠加高频正弦后逆变器输出电压频谱多出注入频点相电流自然也就有高频分量。我专门验证过只要注入频率和PWM频率呈整数倍关系且ADC采样点不动就不会出现周期性混叠。如果采样点和注入频点错开高频分量反而会被当成噪声混进电流环后面章节会说这个坑。5.3 电流环、速度环与观测器带宽的配合聊到foc控制中带宽的理解这是个很容易被忽视的点。电流环带宽决定系统能多快跟踪电流指令一般取开关频率的1/10到1/2010kHz开关对应500Hz到1kHz带宽再高电流环就会出现明显的相位裕量不足。SMO本身没必要跑到电流环带宽以上观测器的带宽只要覆盖电机运行中最高的反电动势频率变化率即可。高频注入的1kHz则必须避开电流环带宽否则电流环会试图跟随高频分量导致d轴高频电流被PI压掉注入信号根本建立不起来。速度环带宽相对低很多一般50Hz到200Hz之间取决于负载惯量和机械刚度。我在速度环里加了积分抗饱和和转速微分前馈主要是为了防止切换区速度突变时积分饱和导致超调。整定顺序是铁律先把电流环整好再整SMO最后整速度环。电流环没整好就去调观测器你根本分不清是观测器的问题还是电流被带偏了。电流环PI参数我习惯用公式法起步[ K_p \omega_{cc} \cdot L_s, \quad K_i \omega_{cc} \cdot R_s ]其中ω_cc是电流环截止角频率L_s是均值电感。算出初值后上机微调先调Kp看到电流指令跟踪是否快速收敛再加Ki处理稳态误差。带IPM电机做无感时由于d/q轴电感不一样可以用平均电感评估但如果你想进一步压性能可以在MTPA路径上做变参数补偿B1.1版本暂时没做这么细。6. 实调中的坑与处理办法6.1 初始位置辨识方向错误与启动反转这个坑我几乎每个项目都见过。现象是高频注入收敛正常观测器角度也稳定但一上电流启动就反转或者直接堵转。本质原因就是N/S极判别失败把反方向当成了正方向。排查思路很直接第一次现象出来先别改代码用示波器抓d轴电流响应比较正反向脉冲的电流峰值确认饱和效应是否明显如果两方向峰值几乎一样说明脉冲宽度不够或者电流建立被限制把脉宽拉长一点同时确认在脉冲期间电流环还是开环状态闭环会让电流峰值钳死没法比较。还有一个容易忽略的点极性判别用到的d轴方向必须是凸极定向已经收敛后的角度。如果观测器还没收敛就发极性判别脉冲得到的“正向”其实是错误方向后续修正自然没意义。所以软件流程里要严格等高频注入收敛标志置位后再做极性判别收敛判据可以是连续若干周期位置误差小于阈值。6.2 切换瞬间电流过冲权重切换已经在做角度加权了为什么还会过冲我遇到过两次一次是角度连续性没处理位置从350度跳到15度附近时加权计算错乱另一次是速度估计在过渡区跳动太厉害速度环输出瞬间拉大电压。解决办法是把角度重映射逻辑写扎实并且给速度估计单独加一阶低通。你可以在过渡区把HFI估计速度暂时强行等于SMO估计速度只对角度做融合因为HFI速度通过微分获得的质量本来就不高反而拖后腿。调试切换区有没有更好的手段实调时我同时装着编码器做对比把观测器角度和编码器角度的误差实时记录。如果切换全过程中误差保持在小角度范围内说明融合逻辑没把位置拉歪如果误差在某个转速点突跳那就是权重函数或者角度重映射的问题。等验证完再摘掉编码器不要一上来就纯无感跑全速域那等于闭着眼跳悬崖。6.3 高频注入噪声与电机发热高频注入的代价是低速时电机发出高频“滋滋”声听起来像交流声叠加哨音。这个声音主要来自注入频率落在人耳可听范围以及高频电流引起铁耗增加。解决思路有两个一是把注入频率提到20kHz以上进入超声波区但这要求PWM开关频率足够高散热和死区会紧张二是在能完成任务的前提下尽量降低注入幅值并且在带载状态下自适应调节幅值轻载时降下来重载时再提上去。发热问题没有捷径只能从损耗源头控制。我做过一个对比实验同样的电机以固定幅值1kHz注入跑一小时外壳温升比正常6%额定转速运行高8到10度这个量对风机自然冷却的电机是能接受的对小体积密封电机就得慎重。所以量产方案里可以做成启动阶段用高频注入完成起转后一旦进入低速可切换区域就把注入幅度快速衰减不要让它一直满幅运行。6.4 高速滑模抖振与位置相位补偿SMO到了高速区之后符号函数的抖振会随着反电动势幅值增大而放大。表现是电流波形表面毛毛糙糙角度PLL输出也带着轻微波动。Ksm不能无限降反而应该结合反电动势幅值做自适应低速时Ksm稍微大一点保证收敛高速时用反电动势幅值做归一化让切换增益相对固定。这个改进虽然只改了滑模增益一个变量但效果立竿见影高速电流波形明显变干净。相位补偿永远要在切换之前做。我在代码里加了一个基于电频率的查表补偿角直接叠加到PLL输出位置角上。用编码器对比时可以看到在10%到90%额定转速范围内补偿后位置误差基本能压到5度电角度以内。没有这个补偿越到高速位置滞后越严重严重时甚至引发转矩脉动和速度环振荡。6.5 常见问题速查表现象常见原因处理建议静止启动反转N/S极性判别失效延长脉冲宽度确保开环发波检查凸极定向收敛标志低速吱吱声大注入频率落在可听区或幅值偏大提高注入频率或降低幅值重载自适应提升切换时电流尖峰角度边界跳变或速度估计突变角度重映射到同一周期过渡区速度只跟SMO高速电流毛糙滑模抖振Ksm自适应、加PLL、检查相位补偿观测器角度和实测偏差大Rs/Ls参数漂移或滤波器延时更新温度点参数、加入随频率变化的相位补偿母线电压跌落时失控电压重构不准确、占空比饱和增加母线电压补偿、限幅和过调制保护结尾关于这个版本我自己的一点体会这套B1.1版本跑通之后我的感受是无感FOC真正难的不是某一个算法而是把三个不同频段的观测器无缝拼成一个系统。高频注入像显微镜管近距离看清低速细节SMO像望远镜看远距离的高速形态权重切换就是中间的变焦环让两者不打架。所有环节最终都落到一个共同指标上转子位置误差到底稳不稳。如果你也准备复现我的建议是先保住实验台架装一个编码器做全程参照把电流环、SMO、高频注入逐个在编码器反馈下验证完再逐步削弱编码器参与度。省掉这一步后面排查问题的成本会高好几倍。B1.1只是版本号真正值钱的不是那串名字而是里面每一处调过、试过、甚至炸过之后留下来的判断力。希望这篇拆解能让你的全速域无感之路少走几个晚上。