做电机控制的同行应该都有过这种经历:项目做到一半,甲方一句话"编码器成本压不下来,能不能去掉传感器",你就得把整个控制架构重新捋一遍。三相电机的无感观测器,就是在这种"既要省传感器、又要稳住性能"的夹缝里被反复拿出来讨论的方案。我最近把一个基于滑模观测器的无感控制模型从零搭完,从电机本体建模到闭环仿真跑通,前前后后踩了不少坑。这篇文章就把整套设计和仿真过程拆开讲,包括数学推导、Simulink模块搭建、参数整定和实机化之前必须补的功课,给正在做无感控制的工程师们一个可以直接参考的路线。
1. 拆掉位置传感器之后,系统到底缺了什么
1.1 位置传感器在传统矢量控制里扮演的角色
在聊无感观测器之前,得先理清楚被拆掉的那个传感器原本在系统里干什么活。转速环、电流环大家都熟,转子磁场定向才是关键——FOC(磁场定向控制)的本质是把三相交流电流分解成励磁分量和转矩分量,而这个分解的前提是精确知道转子磁链的实时位置。编码器或旋变提供的,就是这个转子电角度θe。没有这个角度,Park变换和逆Park变换的矩阵连算都没法算,转矩控制更是无从谈起。
所以无感控制的第一性原理就一句话:用可测的电压电流,通过电机数学模型,把转子角度和转速实时地"算"出来,替代物理传感器的测量功能。这里的难点不在算法本身,而在"算得准"和"跟得上"。
1.2 无感控制的核心命题:用模型换传感器
无感观测器本质上是一个开环的模型估计器外加闭环的误差修正器。它的逻辑是:先根据电压方程估算出定子电流,再用实际电流和估算电流的误差去修正对反电动势、磁链乃至转子位置的估算。只要模型足够准、修正足够快,估算角度就能收敛到真实角度附近。
这和"直接测反电动势然后算角度"的做法有本质区别。后者听起来更简单,直接把αβ轴的电压方程改写成反电动势的形式,测出电压电流,一减就算出来。但实际工程里微分项对噪声极其敏感,而且真实反电动势里叠加了大量逆变器开关谐波,直接算出来的角度根本没法用。观测器里的滑模项、滤波器和锁相环,本质上都在做同一件事——在噪声和模型误差的干扰下,把角度估计问题变成一个鲁棒跟踪问题。
做仿真的时候,很多人喜欢直接把几个公式拖进Simulink就开跑,结果要么角度发散发毛,要么低速直接崩掉。我建议第一步不是建模,而是先把观测器各个环节的数学关系和物理含义理清楚,这样后面调参才有的放矢。
2. 滑模观测器的数学起点:从αβ轴电压方程到反电动势提取
2.1 电机模型里藏着转子位置的"踪迹"
先写下表贴式三相永磁同步电机(SPMSM)在αβ静止坐标系下的电压方程:
uα = Rs·iα + Ls·(diα/dt) + eα
uβ = Rs·iβ + Ls·(diβ/dt) + eβ
这里的eα、eβ是反电动势分量,它们和转子位置的关系是:
eα = -ψf·ωe·sinθe
eβ = ψf·ωe·cosθe
注意看,转子电角度θe的信息就藏在反电动势的相位里。只要能准确知道eα和eβ,转子角度和转速都能解出来。所以无感观测器设计的第一步,变成了"如何从电压电流里准确提取反电动势"。
2.2 为什么选滑模而不是直接算反电动势
有人会问:电压电流都能测,Rs和Ls也是已知的,直接把方程改写成eα = uα - Rs·iα - Ls·(diα/dt)不就行了吗?理论上可以,实际上不行。Ls·(diα/dt)这一项需要电流微分,而实际采样电流里全是噪声和谐波,微分运算会把噪声放大几个数量级。反电动势本身幅值又不大——转速越低越小,低速时甚至被噪声淹没。直接开环计算的方案,信噪比差得没法用。
滑模观测器的思路是换个角度:我不直接求反电动势,而是构造一个电流估算器,让估算电流去"跟踪"实测电流。当估算电流和实测电流之间存在误差时,用一个符号函数sign施加强增益,把误差压到滑模面上。在滑模面上,等效控制量正好等于反电动势。这个做法的高明之处在于:电压电流的噪声被符号函数的开关特性"平均"掉了,等效控制提取出的反电动势信号,比直接计算干净得多。
2.3 滑模面收敛后,等效控制等于什么
滑模观测器的核心方程长这样:
d(îα)/dt = (-Rs/Ls)·îα + (1/Ls)·uα - (k/Ls)·sign(îα - iα)
d(îβ)/dt = (-Rs/Ls)·îβ + (1/Ls)·uβ - (k/Ls)·sign(îβ - iβ)
当估算电流收敛到实际电流,即 îα = iα、îβ = iβ 时,滑模运动发生。此时符号函数里的等效控制分量,在低频意义上就逼近反电动势:
[eα] ≈ k·sign(îα - iα) 的等效值
[eβ] ≈ k·sign(îβ - iβ) 的等效值
这里有个容易忽略的点:滑模增益k必须足够大,大于反电动势幅值加上模型扰动项,才能保证系统到达滑模面。但k也不能无限大,k太大会导致严重的抖振,把高频分量引入到等效控制信号里。我实测下来,k一般取反电动势幅值的1.5到3倍,具体边界在调试环节再细说。
3. 从抖振信号到转子角度:一阶低通与锁相环的配合逻辑
3.1 sign函数带来的高次谐波怎么"洗"干净
符号函数的开关特性带来了一个直接后果——等效控制信号里混着大量高频分量,直接拿去算角度肯定不行。标准做法是在符号函数输出后面串一个一阶低通滤波器,把高频抖振滤掉,剩下平滑的等效反电动势。
滤波器的传递函数是:
H(s) = ωc / (s + ωc)
ωc是截止角频率。这个参数的选择是个典型的折中:截止频率设高了,滤波效果差,反电动势信号里还带着开关噪声;设低了,有效信号本身的幅值和相位也被衰减,角度估算误差增大。我一般把ωc取在控制频率的1/10到1/20附近,比如10kHz的控制频率,滤波器截止频率落在500Hz到1kHz。但这只是初始值,具体还要结合转速范围和负载工况调整。
3.2 低通滤波器的相位滞后补偿怎么算
一阶低通滤波器最大的副作用是相位滞后。滞后角度和信号频率以及滤波器截止频率直接相关:
Δθ = arctan(ωe / ωc)
ωe是电角速度。转速越高,滞后越明显。如果不做补偿,估算角度会落后真实角度,导致电流解耦不彻底,d轴电流波动、母线电压利用率下降,严重时直接失步。补偿方法很简单:在锁相环输出的θe基础上,加上一个和估算转速相关的补偿角。实际操作中这个补偿角的精度不需要太高,因为锁相环本身还有一定的自适应能力,但必须加,否则高速段必然出问题。
3.3 用锁相环代替atan2的工程理由
反电动势eα、eβ已经到手,理论上用atan2就能直接求θe。但直接atan2在工程上有两个毛病:一是eα、eβ过零附近有噪声时,角度输出会剧烈跳变;二是转速信息还得单独对角度微分,微分噪声又来了。锁相环的好处在于,它把角度和转速的估计统一成了一个跟踪问题,用PI调节器去锁定反电动势的相位,同时输出平滑的转速估计。典型的反电动势锁相环结构是:
误差e = eα·cosθ_hat + eβ·sinθ_hat
θ_hat是估算角度,经过PI调节器后积分得到角度,PI输出同时作为角速度估计。
这个结构天然带滤波特性,对反电动势噪声不敏感,而且角度和速度同时输出,省掉了一个微分环节。我自己的模型里,锁相环带宽设在200Hz到500Hz之间,配合低通滤波器使用,动态和稳态都能兼顾。
4. Simulink仿真模型的搭建路线与参数设定
4.1 电机本体与逆变器的建模选择
仿真模型的第一部分是电机本体。Simulink里有现成的PMSM模块,参数设置方便,但我不建议直接用它做无感观测器验证——内置模块的电机模型是理想的,观测器似乎能轻松收敛,掩盖很多实际问题,容易给人一种"算法稳定"的错觉。我动手搭了一个基于电压方程的电机子模块:输入是三相电压,输出是三相电流和电磁转矩,机械部分用简单的运动方程耦合。这样做虽然繁琐,但后续加参数误差、参数摄动就方便多了。
逆变器部分我直接用三相两电平桥臂加PWM发生器,母线电压设成310V左右模拟三相220V整流后的直流母线。功率管的导通压降和死区时间,我在第一批仿真里先设成理想值0,等基础跑通了再把它打开,专门看它对观测器的影响。
4.2 SMO核心模块的搭建细节
滑模观测器模块在仿真里的搭法如下:
- 输入:电流环输出的αβ轴参考电压uα_ref、uβ_ref,以及采样得到的αβ轴实际电流iα、iβ
- 内部流程:先按电压方程算电流估算值的微分,再积分得估算电流;估算电流和实际电流误差过符号函数,乘增益k;符号函数输出经过一阶低通滤波,得到等效反电动势eα、eβ
这里有个细节容易踩坑:符号函数直接用Sign模块会带来严重的数值振荡,尤其是变步长仿真时。我的做法是用饱和模块代替符号函数,饱和限幅值设成1,这样等效于一个归一化的滞环切换,数值上稳得多。实际仿真里这个替换对结果影响不大,但能明显改善仿真速度。
另一个容易忽略的细节是滤波器的离散化实现。Simulink里如果用连续一阶低通传递函数,变步长仿真时没有问题;但后面要往实机移植,最好从一开始就用离散传递函数F(z),把仿真步长固定下来,模拟真实的离散控制周期。
4.3 角度反馈闭环:无感控制系统中的坐标变换怎么连
观测器估算出的θ_hat,反馈到电流环的Park变换和电压重构的逆Park变换,替换掉原来编码器提供的θe。这个替换就完成了闭环:电流环用估算角度进行坐标变换,电流控制器输出参考电压,参考电压经过逆Park变换得到αβ轴电压,送给SVPWM调制。SVPWM输出的三相电压驱动电机本体,采样电流再回到观测器,形成完整的无感FOC闭环。
需要提一句的是,电流环的参考坐标系完全依赖θ_hat。如果θ_hat存在一个固定偏差,d轴电流和q轴电流之间会出现耦合,表现在仿真里就是转速波动或者弱磁区的电流异常。做闭环仿真时,我习惯先给一个固定角度偏移量去测试系统的容错能力,看看电流环在多大角度误差下还能稳定,这比单纯看稳态误差更有工程参考价值。
4.4 启动阶段的处理:零低速预定位与I-F切换
这是仿真里最容易翻车的地方——观测器在零速和极低速时基本失效,因为反电动势幅值和转速成正比,零速时反电动势为零,观测器没有任何有效输入。仿真里如果一上来就给个目标转速然后直接发动SMO,电流会乱冲,角度会任意漂移,最终发散。
我采用的启动策略是I-F(电流-频率)开环启动:先把转子预定位到某个固定位置,然后用一个缓慢增加的电流矢量,以固定电角速度拖着转子转起来。当转速上升到反电动势足够大、观测器收敛稳定之后,再从I-F切换回闭环FOC。切换逻辑可以用转速阈值触发,也可以用观测器误差大小触发。阈值设多少合适呢?我的经验是:额定转速的5%到10%。比如额定转速3000rpm,切换点设在150到300rpm之间,太小了观测器还没有完全收敛,切过去容易冲击;太大了又失去了无感低速扩展的意义。仿真里这个切换点可以通过反复试跑来找,实机上还得叠加角度误差判断。
5. 仿真调试中的真实踩坑记录:发散、振荡、过补偿
5.1 滑模增益k选多大才算"够用"
滑模增益k是观测器里最敏感的参数。我在第一版模型里按理论值把k设成反电动势幅值的两倍——额定转速下反电动势幅值大约是这样算的:
Emax = ψf·ωe_max
以某款额定3000rpm的电机为例,磁链ψf取0.1Wb,最高电角速度大约是314rad/s,反电动势幅值大约31V。k取两倍就是62V。跑出来的结果是:中高速段角度估算平稳,但低速段一启动就振荡,电流噪声也大。原因在于低速段反电动势幅值远小于额定值,两倍裕量在那个工况下显得不够,滑模面难以维持。
后来我改成了分档增益:低速段用大增益保证滑模面能建立,高速段用小增益降低抖振。具体数值靠仿真试凑,但初始范围可以参考反电动势幅值的1.5到3倍,然后在仿真里把转速从低到高扫一遍,看哪个区间开始振荡就上调,哪个区间噪声明显就下调。滑模增益不是越大约好,够用就行,这是我在调试里最大的体会。
5.2 滤波器截止频率与带宽的匹配误区
滤波器截止频率选错,是另一个最常见的问题。我一开始把低通滤波器截止频率设成2kHz,想着开关频率是10kHz,滤高频绰绰有余。结果角度估算在3000rpm附近出现明显滞后,电流环解耦失败,q轴电流出现震荡。算了一下,3000rpm对应的电频率是150Hz,2kHz的截止频率带来的相位滞后大约4.3度,看似不大,但在高速轻载工况下,这点误差足以让系统动态性能显著恶化。
后来把截止频率降到800Hz,角度滞后补偿量也同步调了,情况好了不少。这里要给一个具体的匹配原则:截止频率至少要高于最高电频率的5倍以上,保证有效信号不被过度衰减;同时又要低于开关频率的1/5,保证滤波效果。800Hz到1.5kHz这个范围对10kHz开关频率来说是合理的初始区间,取哪个值取决于你对相位滞后补偿的把握程度。
5.3 仿真步长太大也会让SMO崩盘
这个坑和算法本身无关,但能把人折磨到怀疑人生。我用变步长仿真时,最大步长设成1e-4秒,结果观测器在高速段频繁失步,波形像发了癫痫一样。排查了半天发现,符号函数环节在步长较大时会产生自激振荡,等效控制量被反复翻转,后续的低通滤波和锁相环全被带崩。
把仿真改成定步长1e-5秒之后,问题立刻消失。所以做电机无感仿真时,我建议从一开始就坚定地用定步长离散仿真,步长和实机控制周期保持一致,比如控制频率10kHz就用1e-4秒步长,控制频率20kHz就用5e-5秒。这样既不会有数值稳定性问题,也方便直接往实机代码上迁移。
5.4 角度补偿算错时系统会出现哪些典型症状
角度补偿的量如果算错了,症状很典型:轻载时电流波形还算正常,一加负载就会听见明显的"嗡嗡"声,母线电流波动,转速出现与负载同频率的脉动。这是因为补偿角度不准确,坐标系和真实转子磁场之间存在残余角差,导致励磁分量和转矩分量没有完全解耦。
仿真里排查这个问题有个好办法:把观测器估算角度和"理想电机模型"里的真实角度同时拉出来,放到同一个scope里看。如果两条线之间存在一个固定角度差,那就是补偿角没算对;如果角度差随转速变化而变化,那就是补偿公式里的系数给错了。我最后一次修正时,把补偿角的计算从arctan(ωe/ωc)换成了近似线性化的形式,在转速变化范围内重新拟合了系数,误差控制在电角度2度以内,系统就彻底安静了。
6. 仿真跑通不算完:实机移植前必须补齐的差距
6.1 离散控制周期下的观测器精度
仿真里跑通的算法,离直接上机还有一段路。最大的区别是离散化:仿真里即使定步长,也可以在一个步长内做完整的代数运算;实机上控制频率受限于CPU算力和电流环带宽,通常10kHz或者20kHz,观测器必须在这个周期内算完。离散化方法的选择直接关系到观测器的稳定性。我建议用双线性变换把连续域的滑模观测器和滤波器离散化,而不是简单的欧拉前向,后者在大步长下容易引入递减相位裕度。
锁相环的PI参数在连续域调好的值,离散化之后大概率需要重新调整。我的判断依据是把锁相环带宽保持在控制频率的1/10以内,比如10kHz控制频率,PLL带宽不超过500Hz,这样离散化对它的影响相对可控。
6.2 逆变器死区与电流采样噪声的影响
仿真里如果一开始就把死区设为0,实机上一定会措手不及。死区时间会引入一个和电流方向相关的电压误差,相当于在αβ轴电压上叠加了方波扰动,这个扰动将经过滑模观测器的强增益放大,在估算反电动势上表现为明显的低次谐波。实机调试时最常见的现象是,空载转速平稳,带一点负载后角度估算开始波动。
应对手段有两个:一是做死区补偿,在电压参考值上叠加一个和电流方向相关的补偿量,这个在无感系统里尤其重要,因为观测器本身对电压参考值非常敏感;二是在电流采样上做中心对齐采样,尽量避开功率管开关带来的尖峰噪声。仿真阶段至少应该把死区时间打开,看看观测器在死区影响下还能不能保持角度估计精度,提前发现问题。
6.3 电机参数失配时观测器的表现与应对
无感观测器对电机参数Rs和Ls的依赖是不对称的:电阻误差在低速段影响明显,因为压降占比大;电感误差在高速段影响明显,因为反电动势幅值变大。实机上电机温度变化会导致电阻变化,磁路饱和会导致电感变化。我在仿真里做过一组参数失配实验:把电阻在模型里故意设成实际值的1.5倍,低速段电流误差明显增大;把电感设成实际值的0.8倍,高速段角度估算开始出现稳态偏差。
应对措施是在观测器前端加参数辨识,或者在启动时做一次离线参数自学习。工程上更常见的做法是鲁棒化设计:在滑模增益里加入自适应项,让观测器对参数失配不那么敏感。仿真阶段至少要做一遍参数摄动测试,记录估算角度的极限误差范围,看看系统的应用边界在哪里,否则上机之后电机一热起来,参数一变,算法直接翻车。
7. 最后分享几个我自己觉得好用的调试习惯
调试无感观测器的时候,有个习惯我保留至今:每次只动一个参数,改完跑完记录波形,再改下一个。滑模增益、滤波器截止频率、锁相环带宽、角度补偿系数,这四个参数互相耦合,一起改出了问题根本定位不了是哪个环节引起的。
仿真初始阶段,先不要追求低转速,直接给个额定转速跑起来,把观测器在中高速段的性能调到稳定收敛,再往下探低速边界,一点点逼近极限。我见过太多人一上来就在150rpm练基本功,调了三天还在振荡,本质上是在和物理极限较劲,完全没有必要。
最后还有一个小技巧:在Simulink里同时把真实角度和估算角度接到同一个示波器上观察Lissajous波形。如果两条曲线在相位上重合,说明观测器完全收敛;如果差一个固定相角但稳定,说明补偿可能有偏差但系统能工作;如果两者来回打转,基本可以判定滑模面没建立——先回去调增益,别动其他参数。这个办法我用了好几年,比看一堆性能指标直观得多。