全速域无感FOC实战:高频注入与SMO权重切换在F28335上的实现

发布时间:2026/10/2 16:43:31
全速域无感FOC实战:高频注入与SMO权重切换在F28335上的实现 1. 从启动抖动说起为什么全速域无感控制绕不开高频注入搞过永磁同步电机无感FOC的人大概率都经历过这样一个场景电机上电闭环算法跑起来给定一个很小的q轴电流结果转子要么纹丝不动要么咯噔一下反转半圈再正转运气不好直接过流保护。这个问题十有八九出在转子初始位置辨识上——你连转子在哪儿都不知道怎么给它一个正确的力矩方向B1.1版本这套方案的核心命题就是解决从零速到高速全速域的无感控制问题。低速和零速区域反电动势幅值趋近于零滑模观测器SMO拿不到有效的转子位置信息这时候必须靠高频注入来主动探测转子凸极位置而到了中高速区域反电动势足够大SMO就能稳定估算角度这时候再把控制权交给SMO。两套算法之间的权重切换就是这套方案最考验工程功底的地方。这套代码基于TI的TMS320F28335/C2000系列DSP驱动对象是内置式永磁同步电机IPM采用FOC矢量控制框架整体工程名为TIDSP_F283xC2000_IPM_FOC_Sensorless_V1.0。它适合谁看如果你正在做无感FOC项目卡在启动阶段或者低速段抖动、失步或者你已经在用SMO但发现低速根本没法用那这套高频注入权重切换SMO的组合思路值得你花时间啃一遍。我先把结论摆在这儿高频注入解决的是零低速段位置从哪来的问题SMO解决的是中高速段位置怎么算得准的问题权重切换解决的是两套算法怎么不打架的问题。这三件事任何一件没做好全速域无感就是一句空话。下面我按实际调试的顺序把每个环节拆开讲。2. 高频注入辨识转子初始位置的原理与工程实现2.1 凸极效应才是高频注入的物理基础很多人第一次接触高频注入会疑惑电机都没转反电动势为零凭什么能知道转子位置答案在于IPM电机的凸极效应。内置式永磁电机的永磁体埋在转子铁芯内部导致d轴磁体方向和q轴磁体之间方向的电感不相等通常Lq Ld。这个电感差异就是高频注入的信号源。当你在定子侧注入一个高频电压信号比如1kHz~2kHz的正弦或方波由于d轴和q轴电感不同产生的高频电流响应幅值会随转子位置变化。具体来说在估计的d轴和q轴坐标系下高频电流的幅值包络里包含了转子位置误差角的两倍频信息。通过解调这个包络就能提取出位置误差再用一个锁相环PLL或者龙伯格观测器把它收敛到零就得到了转子初始位置。这里有个关键点注入频率的选择。频率太低会和基波、PWM谐波混在一起滤波困难频率太高受开关频率和死区影响大而且高频损耗增加。工程上一般取开关频率的1/10到1/5。假设你的PWM开关频率是10kHz注入频率取1kHz~2kHz比较合适。我实测下来1.5kHz在大多数中小功率IPM上表现比较均衡。2.2 旋转高频注入与脉振高频注入的取舍高频注入分两大流派旋转高频电压注入和脉振高频电压注入。旋转注入是在α-β静止坐标系下注入一个旋转的电压矢量实现简单但会产生转矩脉动因为注入信号会在q轴产生电流分量。对于需要静止辨识的场合转矩脉动会导致电机轻微抖动如果负载有静摩擦可能辨识不准。脉振注入是在估计的d轴方向注入高频信号q轴不注入。这样理论上不产生平均转矩转矩脉动小得多。代价是算法稍微复杂一点需要用到估计角度做坐标变换存在鸡生蛋的问题——但通过合理的初始估计值迭代可以收敛。B1.1这套方案我倾向于推荐脉振方波注入原因有三第一方波注入的信噪比高解调简单只需要在特定时刻采样电流即可第二方波注入不需要低通滤波器提取包络动态响应快第三在DSP上实现方波注入的计算量比正弦解调小对F28335这种定点浮点混合的芯片更友好。具体实现上在一个PWM周期内前半周期在估计d轴注入正电压后半周期注入负电压然后采样两次电流做差得到电流差分信号。这个差分信号的符号和幅值就包含了转子位置误差信息。用公式表示Δi_d ∝ V_inj * Ts * cos(2Δθ) / (2 * Ld * Lq) * (Lq - Ld) Δi_q ∝ V_inj * Ts * sin(2Δθ) / (2 * Ld * Lq) * (Lq - Ld)其中Δθ是估计角度和真实角度的误差。当Δθ趋近于零时Δi_q也趋近于零Δi_d达到最大。所以把Δi_q作为误差信号送入PLL就能让估计角度跟踪真实角度。2.3 初始位置辨识的完整流程与收敛判据实际工程中初始位置辨识不是一上来就闭环收敛的需要分阶段第一阶段预定位可选但推荐。给一个固定的d轴电压矢量持续几百毫秒把转子强行拉到已知位置。这一步能保证转子初始位置在已知的30度误差范围内避免后续高频注入收敛到错误的凸极极点因为凸极效应有180度周期性N/S极分辨需要额外手段。第二阶段高频注入收敛。注入高频信号运行PLL观察估计角度是否稳定。收敛判据一般是连续N个PLL周期内角度误差变化小于某个阈值比如0.01 rad且误差信号幅值小于设定值。第三阶段极性辨识。凸极效应只能辨识出转子的轴向但分不清N极和S极。常用的方法是二次谐波法或脉冲注入法在估计的d轴正方向注入一个短时脉冲观察电流上升率再在反方向注入同样脉冲比较两次电流响应。由于永磁体的饱和效应正方向N极方向的等效电感会略小电流上升更快。通过比较就能确定极性。注意极性辨识的脉冲幅值不能太大否则会导致转子轻微转动甚至退磁风险。一般取额定电流的30%~50%持续时间几十微秒到几百微秒。我在调试时踩过一个坑注入频率和电流采样时刻没对齐。F28335的ADC采样需要和PWM载波同步如果采样时刻正好落在开关管切换的振铃区电流采样值会严重失真导致辨识角度跳变。解决办法是把采样点放在PWM周期的中点此时开关管状态稳定振铃已经衰减。3. 滑模观测器在中高速段的估算逻辑与参数整定3.1 SMO的本质用不连续控制逼出反电动势滑模观测器的核心思想是构造一个电流观测器让观测电流和实际电流的误差在滑模面上滑动。当系统进入滑模状态后观测器的等效控制量就包含了反电动势信息而反电动势里就藏着转子位置。IPM电机在α-β坐标系下的电压方程可以写成u_α R * i_α Ld * di_α/dt ω * (Ld - Lq) * i_β e_α u_β R * i_β Ld * di_β/dt - ω * (Ld - Lq) * i_α e_β其中e_α -ω * ψf * sin(θ)e_β ω * ψf * cos(θ)ψf是永磁磁链。SMO构造的观测器方程为di_α_hat/dt (u_α - R * i_α_hat - ω_hat * (Ld - Lq) * i_β_hat z_α) / Ld di_β_hat/dt (u_β - R * i_β_hat ω_hat * (Ld - Lq) * i_α_hat z_β) / Ld其中z_α和z_β是滑模控制项通常用饱和函数或sign函数z_α k_slide * sign(i_α_hat - i_α) z_β k_slide * sign(i_β_hat - i_β)当观测误差收敛到零z_α和z_β就等效于反电动势e_α和e_β。然后用一个锁相环从z_α和z_β中提取角度和速度ε -z_α * cos(θ_hat) - z_β * sin(θ_hat) ω_hat PI(ε) θ_hat ∫ω_hat dt3.2 滑模增益k_slide的整定太大抖振太小不收敛k_slide是SMO最关键的参数。它的物理意义是滑模控制的最大输出幅值必须大于反电动势的最大幅值才能保证滑模面可达。反电动势最大幅值出现在最高转速e_max ω_max * ψf所以k_slide的理论下限是e_max。但实际取值要比这个大因为要留裕量应对参数误差和扰动。我一般取1.5~2倍的e_max。但k_slide不能无限大。太大了会导致抖振——sign函数在滑模面附近高频切换产生高频噪声这个噪声会通过PLL传到角度估算里表现为转速波动和电流谐波。解决办法有两个一是用饱和函数代替sign函数在滑模面附近用线性区平滑过渡二是用二阶滑模或超螺旋算法把不连续项放到积分里从根本上消除抖振。我在一台3kW的IPM上实测过k_slide取2倍e_max时sign函数方案在3000rpm时转速波动约±15rpm换成饱和函数后波动降到±5rpm以内。代价是饱和函数的边界层厚度需要整定太厚了滑模特性变弱太薄了抖振抑制效果差。一般取**额定电流的5%~10%**作为边界层厚度。3.3 低速段SMO为什么失效信噪比问题SMO在低速段失效的根本原因是反电动势幅值和转速成正比。转速降到10%额定以下反电动势可能只有几伏而逆变器的非线性死区、管压降和电流采样的噪声可能有几十毫伏甚至上百毫伏。信噪比太低z_α和z_β里有效信号被噪声淹没PLL提取的角度误差急剧增大。具体来说死区导致的电压误差可以估算ΔV_dead (T_dead / Ts) * Vdc假设死区时间2μs开关周期100μs母线电压300V那么ΔV_dead 6V。这个误差在低速时可能比反电动势本身还大。虽然可以通过死区补偿来减小但补偿精度有限残余误差仍然可观。所以工程上的通行做法是低速段不用SMO用高频注入中高速段用SMO中间设一个过渡区用权重切换。这就是B1.1版本的核心架构。4. 权重切换两套算法如何不打架4.1 切换点的选择不是拍脑袋定的切换点选在哪个转速直接决定了全速域控制的平顺性。选得太低SMO还没准备好角度估算误差大切换时转矩冲击明显选得太高高频注入的转矩脉动和噪声在高速段无法接受。我的经验是切换点取**额定转速的10%~15%**比较合适。具体定多少要看两个指标一是SMO在这个转速下的角度估算误差是否小于5度二是高频注入在这个转速下的转矩脉动是否小于额定转矩的5%。两个条件都满足的转速区间就是切换点的候选范围。以一台额定3000rpm的IPM为例我实测SMO在300rpm时角度误差约3度高频注入在300rpm时转矩脉动约3%那么切换点就定在300rpm附近。如果SMO在300rpm时误差还有8度那就得把切换点往上提到400rpm或500rpm。4.2 线性加权与滞环切换的对比权重切换有两种常见做法线性加权和滞环切换。线性加权是在切换区间内让高频注入和SMO的角度估算值按权重混合θ_final w * θ_hfi (1 - w) * θ_smo权重w随转速线性变化在切换点下限时为1全高频注入上限时为0全SMO。这种方法的优点是过渡平滑没有突变缺点是两套算法的角度估算值如果差异较大混合后的角度可能既不是高频注入的最优值也不是SMO的最优值反而引入额外误差。滞环切换是设两个阈值转速上升到上限阈值时切到SMO下降到下限阈值时切回高频注入。中间用滞环避免频繁切换。优点是逻辑简单每时每刻只用一套算法缺点是切换瞬间角度可能有跳变如果两套算法的角度差超过10度切换时转矩冲击明显。B1.1版本我推荐线性加权角度误差补偿的方案。具体做法是在切换区间内先计算两套算法的角度差Δθ如果Δθ超过阈值比如15度说明其中一套算法可能失锁这时候不做混合直接切到置信度高的那套如果Δθ在阈值内再做线性加权。这样既保证了平滑过渡又避免了错误混合。4.3 切换过程中的电流环和速度环处理角度切换只是第一步电流环和速度环也要做相应处理。高频注入期间电流环的带宽不能太高因为注入信号本身是高频的如果电流环带宽覆盖了注入频率会把注入信号当成扰动去抑制导致注入失效。一般高频注入期间电流环带宽限制在500Hz以下。切到SMO后电流环带宽可以恢复到正常值通常1kHz~2kHz。这个带宽切换如果处理不好会导致切换瞬间电流振荡。我的做法是在权重切换的同一个区间内同步渐变电流环带宽用和角度权重相同的w来插值带宽参数。速度环方面高频注入期间速度估算噪声大速度环带宽要压低一般取正常值的1/3到1/2。切到SMO后逐步恢复。速度环的输出是q轴电流指令如果速度环带宽突变q轴电流指令会跳变导致转矩冲击。渐变处理能有效缓解这个问题。提示切换区间的宽度不宜太窄建议至少覆盖200rpm~300rpm的转速范围。太窄了渐变效果不明显太宽了高频注入在较高转速下的负面影响时间太长。5. F28335上的代码架构与实时性保障5.1 中断分配PWM中断是主战场F28335的ePWM模块可以产生多种中断这套方案里最关键的是PWM周期中断。所有核心算法——电流采样、Clarke/Park变换、高频注入解调、SMO、PLL、电流环PI、SVPWM——都在这个中断里完成。中断频率等于PWM开关频率假设10kHz那么每个中断周期100μs。在这100μs内要完成上述所有计算对F28335的150MHz主频来说压力不小。我实测下来优化后的代码在10kHz中断下CPU占用率约60%~70%还有余量。但如果开关频率提到20kHz中断周期50μsCPU占用率会飙升到90%以上这时候就需要考虑把部分算法放到慢速中断或后台循环里。具体分配建议任务执行频率所在中断电流采样与变换10kHzPWM中断高频注入解调10kHzPWM中断SMO10kHzPWM中断PLL10kHzPWM中断电流环PI10kHzPWM中断SVPWM10kHzPWM中断速度环PI1kHz定时器中断权重切换逻辑1kHz定时器中断故障保护10kHzPWM中断速度环放在1kHz定时器中断里是因为速度环带宽通常只有几十Hz没必要在10kHz中断里跑。权重切换逻辑也放在慢速中断里因为切换本身是毫秒级的过程不需要微秒级响应。5.2 定点与浮点的混合使用F28335有FPU浮点运算单元但浮点运算仍然比定点慢。对于高频注入解调这种计算密集的部分我建议用定点Q格式实现。比如电流差分信号用Q12格式PLL的PI调节器用Q15格式。SMO的积分环节可以用浮点因为积分对精度要求高而且SMO的计算量相对可控。具体来说高频注入解调里的乘法和加法用定点能比浮点快30%~40%。但要注意溢出问题Q12格式的乘法结果需要用Q24暂存再移位回Q12。F28335的32位累加器能支持这个精度但代码里要显式处理饱和。5.3 电流采样时刻与注入信号的同步前面提到过电流采样时刻必须和PWM载波同步。在方波注入方案里一个PWM周期内要采样两次电流一次在正电压注入结束时一次在负电压注入结束时。这两次采样时刻必须精确对齐PWM的计数器中点和零点。F28335的ePWM模块支持在计数器等于CMPA或CMPB时触发ADC采样。我的配置是CMPA设在周期中点CMPB设在周期终点ADC在CMPA和CMPB各触发一次。这样两次采样正好对应正负注入的结束时刻。注意ADC采样到结果可用有转换延迟F28335的12位ADC转换时间约80ns加上采样保持时间总延迟约200ns~300ns。在10kHz开关频率下这个延迟对应3度电角度按3000rpm算需要在角度计算里做补偿。6. 实测中遇到的典型问题与排查思路6.1 初始位置辨识角度跳变从现象到根因现象电机上电高频注入运行估计角度在收敛后突然跳变180度然后稳定在错误的位置。排查过程先看PLL的误差信号发现误差信号在跳变前有一个明显的直流偏置。这个偏置不是噪声而是持续存在的。检查电流采样电路发现三相电流的偏置校准没做好。F28335的ADC有零点漂移如果上电时不做偏置校准采样电流里会有几毫安的直流分量。这个直流分量经过高频解调后变成了角度误差信号里的直流偏置导致PLL收敛到错误位置。解决上电时执行电流偏置校准——封锁PWM输出采样100次三相电流取平均值作为偏置后续采样值减去这个偏置。校准后角度跳变消失。6.2 切换点附近转速振荡权重切换的隐藏陷阱现象转速在切换点附近来回振荡幅度约±50rpm切换点上下各持续几百毫秒。排查过程先看角度估算发现高频注入和SMO的角度差在切换点附近有10度~20度的波动。再看权重发现权重变化太快——从1变到0只用了50ms。角度差乘以快速变化的权重导致混合后的角度有较大波动速度环响应这个波动输出q轴电流指令振荡反过来又影响转速。解决把权重切换时间从50ms拉长到300ms同时把速度环带宽在切换区间内再压低一半。调整后转速振荡幅度降到±10rpm以内。6.3 SMO低速失锁反电动势太小的连锁反应现象手动把切换点往下调想看看SMO在更低转速下的表现结果SMO在200rpm时角度误差超过30度电机失步。排查过程用示波器看z_α和z_β波形发现200rpm时z_α和z_β的幅值只有几十毫伏而噪声幅值也有十几毫伏信噪比不到10dB。PLL的误差信号被噪声主导角度估算完全不可信。解决这不是算法问题是物理限制。SMO在低转速下就是不可用必须靠高频注入。把切换点调回300rpm问题消失。这个案例说明切换点不能凭感觉往下压必须基于实测的信噪比和角度误差来定。6.4 高频注入噪声刺耳注入幅值和频率的平衡现象电机在低速运行时能听到明显的高频啸叫频率约1.5kHz声音刺耳。排查过程高频注入的电压幅值取的是额定电压的20%注入频率1.5kHz。噪声来自注入信号在电机绕组里产生的高频电磁力频率正好在听觉敏感范围内。解决两个方向——一是降低注入幅值从20%降到10%噪声明显减小但辨识精度下降收敛时间变长二是提高注入频率从1.5kHz提到2.5kHz超出人耳最敏感频段主观感受改善但受开关频率限制10kHz开关频率下2.5kHz注入已经是1/4再高会影响PWM质量。最终折中注入幅值12%频率2kHz噪声可接受辨识精度也够用。7. 参数整定速查与调试顺序建议7.1 关键参数整定表参数推荐值整定依据影响注入频率开关频率的1/10~1/5避开基波和PWM谐波太高受死区影响太低滤波困难注入幅值额定电压的10%~15%信噪比与噪声的平衡太大噪声大太小辨识慢PLL带宽50Hz~100Hz收敛速度与稳态误差的平衡太高噪声大太低收敛慢SMO滑模增益1.5~2倍e_max滑模可达性太大抖振太小不收敛SMO边界层额定电流的5%~10%抖振抑制太厚滑模特性弱太薄抖振大切换点额定转速的10%~15%SMO角度误差5度太低SMO失锁太高噪声大切换时间200ms~300ms转速振荡幅度太短振荡大太长响应慢电流环带宽注入期间500Hz避免抑制注入信号太高注入失效速度环带宽注入期间正常值的1/3~1/2抑制速度估算噪声太高速度振荡7.2 调试顺序从开环到闭环从高频注入到SMO我建议的调试顺序是这样的第一步电流环调试。先用编码器如果有或者开环强制换相把电流环PI参数整定好。电流环是基础电流环不稳后面什么都别谈。第二步高频注入开环验证。注入高频信号但不跑PLL用示波器看电流差分信号的波形确认凸极效应产生的信号幅值和信噪比满足要求。第三步高频注入闭环收敛。跑PLL观察估计角度是否收敛到真实角度用编码器对比或者用手转动转子看角度跟随。调整PLL带宽和注入幅值直到收敛稳定。第四步SMO单独验证。用编码器做角度参考手动让电机在300rpm以上运行观察SMO估算角度和编码器角度的误差。调整滑模增益和边界层直到误差小于5度。第五步权重切换联调。从零速缓慢加速到额定转速观察切换点附近的转速和电流波形。调整切换点、切换时间、电流环和速度环带宽直到全速域平顺。第六步负载测试。加负载重复第五步观察负载变化对切换的影响。负载变化会导致转速波动如果切换逻辑对转速波动敏感可能需要加入转速滤波或切换滞环。提示整个调试过程中编码器是必不可少的参考。即使最终产品是无感的调试阶段有编码器做对比能省下大量猜测时间。没有编码器的话至少要用示波器看相电流波形通过电流波形判断角度是否准确。8. 写在最后几个容易忽略的工程细节死区补偿不能省。低速段SMO失效的一个重要原因就是死区导致的电压误差。虽然高频注入不依赖反电动势但死区会影响注入信号的精度。建议在SVPWM模块里加入基于电流极性的死区补偿补偿量取实际死区时间对应的电压值。母线电压波动要补偿。SVPWM的输出电压和母线电压成正比如果母线电压波动比如电池供电场景同样的占空比对应的实际电压会变。高频注入的幅值和SMO的电压方程都依赖母线电压所以要用母线电压采样值做归一化。温度对电阻和磁链的影响。电机运行一段时间后绕组电阻随温度上升永磁体磁链随温度下降。SMO的电压方程里有电阻项磁链影响反电动势幅值。如果温升较大比如超过50度SMO的角度估算误差会增大。工程上可以加电阻在线辨识或磁链补偿但会增加计算量。如果应用场景温升不大可以忽略。高频注入的 audible noise 问题。前面提到过注入频率落在听觉敏感范围会有啸叫。如果应用对噪声敏感比如家电、汽车可以考虑随机频率注入或频率抖动把单一频率的噪声分散到更宽的频谱里主观感受会好很多。代价是解调算法要适应频率变化稍微复杂一点。这套B1.1版本的方案我在几个不同功率等级的IPM上都跑过从几百瓦到十几千瓦核心架构不变主要是参数整定的差异。高频注入的收敛时间一般在200ms~500ms取决于注入幅值和PLL带宽。SMO在300rpm以上的角度误差可以做到3度以内。切换点的转速波动控制在±10rpm以内。这些指标对于大多数工业应用和家电应用是够用的。如果你正在调这套方案遇到切换点振荡或者初始位置辨识不准的问题先别急着改算法回头检查电流采样偏置校准和死区补偿这两个基础环节。我踩过的坑里至少一半是这两个地方没做好导致的。基础打牢了上层算法才能稳。