做无感PMSM控制,最绕不开的就是转子位置和速度怎么拿。装编码器当然省事,但成本、温漂、振动、安装空间这些现实问题摆在那儿,尤其在一些批量化、高可靠性的应用场景里,机械传感器反而成了最脆弱的一环。圈里做电机控制的工程师应该都有体会:项目立项时,硬件方案一开会必然吵“要不要带编码器”,最后往往躲不开一条路——无传感器控制。而众多无传感器方案里,基于滑模观测器的永磁同步电机空间电压矢量控制,算是工程实践中最常见、也最容易落地的一种。
这篇内容就把我基于Simulink搭的这一套仿真模型完整拆开讲一遍,包含系统架构、滑模观测器的数学模型原理、SVPWM(空间电压矢量PWM)的实现逻辑、整套模型的参数整定过程,以及仿真时容易踩的各种坑。适合刚接触FOC和SMO、想在Simulink里跑通一个无感控制模型的人参考,也适合已经有了基础模型、但调不稳定、波形不如预期的人对照排查。
1. 为什么绕不开无传感器方案:机械传感器的那些“隐藏成本”
很多人在学校做实验、在实验室调板子,用的都是带编码器的永磁同步电机,霍尔或者光电编码器一装,转子位置直接读,控制器写起来也简单。可一旦到了实际产品层面,问题就一件接一件冒出来。
先说成本。一套分辨率勉强够用的增量式编码器,在批量采购时可能就要多付出一部分物料成本,如果再算上安装、校准的人工工时,整个驱动器的成本就上去了。对于风机、水泵、压缩机这类本身售价不高、但出货量巨大的应用,这部分成本基本不可接受。
其次是环境适应性。编码器怕什么?怕灰尘、怕油污、怕震动、怕高温。电机在长时间运行后,编码器码盘一旦脏污,反馈信号就会出现尖刺甚至丢失;机械安装松动之后,编码器轴和电机轴不同心,反馈的位置数据就带上了周期性误差,轻则电流谐波变大,重则直接导致系统振荡。更不要说很多场景里电机要长时间运行在恶劣环境,哪怕是加了防护罩,编码器的故障率也远高于电机本体。
还有一个常被忽略的点,就是体积和轴系长度。加了编码器意味着电机后面要多伸出一段轴,整个动力总成的轴向尺寸被拉长。在电动压缩机、智能家电、机器人关节这些对空间寸土寸金的产品里,这一步直接影响了整机结构设计。去掉编码器之后,电机尾部可以做得更紧凑,整机设计自由度明显更高。
所以在做电机驱动器方案选型时,我在绝大多数民用和轻工业场景里都优先推荐无传感器方案,只在低速重载、或需要零速大扭矩起动的极高动态性能场合才保留编码器。无传感器控制就成了一个必修课题,而其中工程化程度最高的,公认还是滑模观测器这一条路。
2. 滑模观测器的数学模型:从电机方程到转子位置提取
标题里写的“滑膜观测器”,实际上指的就是滑模观测器(Sliding Mode Observer, SMO)。刚接触的人经常在文档里写成“滑膜”,这也不算罕见,但从控制理论角度说,“滑模”特指一种使系统状态在切换面上做高频抖动的控制策略。这里我直接用“滑模观测器”来讲,避免概念混淆。
2.1 为什么选择滑模策略而不是其他观测器
无感控制的核心,就是通过电机端可测量的电压和电流,反推出转子的位置和速度。可用的方案有几种:高频注入法、模型参考自适应(MRAS)、扩展卡尔曼滤波(EKF)、滑模观测器。我为什么选SMO?很简单:对模型参数变化和外部扰动不敏感,计算量小,工程调参经验成熟。
高频注入法在零速和低速下表现不错,但要额外注入高频信号,滤波环节复杂,而且对电感参数敏感,对永磁电机凸极率要求高。EKF虽然精度高,但协方差矩阵和噪声矩阵的调试非常繁琐,计算量也大,在MCU上跑起来对算力有压力。MRAS结构清晰,但在高速段容易受反电动势模型误差影响。SMO则靠滑模面的强鲁棒性,在中高速段有非常稳定的表现,计算只需要几个矩阵乘法和符号函数切换,代码实现很轻量。
当然,SMO不是没有缺点,它最大的短板是低速段性能较差,因为反电动势幅值随转速成比例下降,信噪比变差,导致位置估计误差变大。所以我在这套Simulink模型里也明确了一个边界:SMO方案适合中高速运行工况,起动阶段配合开环强制定向或I/F起动的工程策略来衔接。
2.2 反电动势模型:SMO估计的核心对象
PMSM在αβ静止坐标系下的电压方程可以写成:
uα = Rs·iα + Ls·(diα/dt) + eα
uβ = Rs·iβ + Ls·(diβ/dt) + eβ
其中eα和eβ就是反电动势项,它们和转子电角度θe直接相关:
eα = -ψf·ωe·sin(θe)
eβ = ψf·ωe·cos(θe)
从反电动势里面,可以提取转子角度:
θe = atan2(-eα, eβ)
所以问题的关键就变成了:怎么从电压、电流中靠谱地得到反电动势。反电动势没法直接测,只能构造状态观测器去估计。SMO的思路,是把电流作为可测状态,设计一个滑模电流观测器,利用电流观测误差设计滑模切换律,让观测器逼近真实电流。当状态进入滑模面后,等效控制输入中就包含了反电动势信息。
2.3 SMO观测器的完整状态方程推导
构造滑模观测器的电流状态方程为:
d(iα_est)/dt = -(Rs/Ls)·iα_est + (uα - k·sign(iα_est - iα))/Ls
d(iβ_est)/dt = -(Rs/Ls)·iβ_est + (uβ - k·sign(iβ_est - iβ))/Ls
其中iα_est、iβ_est是观测器估计电流,k是滑模增益,sign是符号函数。把观测器方程减去真实电机电流方程,得到电流误差动态方程:
d(iα_err)/dt = -(Rs/Ls)·iα_err + (eα - k·sign(iα_err))/Ls
d(iβ_err)/dt = -(Rs/Ls)·iβ_err + (eβ - k·sign(iβ_err))/Ls
当k足够大,满足 k > max(|eα|, |eβ|) 时,系统会被强行驱动到滑模面,使 iα_err → 0、iβ_err → 0。此时,符号函数的等效输出就等于反电动势除以k的补偿量:
[sign(iα_err)]eq = eα/k
[sign(iβ_err)]eq = eβ/k
所以反电动势估计值就是:
eα_est = k·sign(iα_err)
eβ_est = k·sign(iβ_err)
实际模型里,直接在符号函数后面接低通滤波器提取等效控制信号。注意,符号函数的高频切换会让反电动势估计带大量高频分量,这个低通滤波器必不可少。
2.4 转子位置和速度的计算细节
拿到反电动势估计值后,转子位置可以由atan2计算:
θe_est = atan2(-eα_est, eβ_est)
这里有一个必须注意的细节:低通滤波器带来的相位延迟会在位置估计中引入滞后误差。滤波时间常数越大,高频分量滤得越干净,但相位滞后也越大。工程上常用两种方法处理:一种是在角度估计值上补偿一个相位角,补偿量约为:
θoffset ≈ atan(ωe / ωc)
其中ωc是低通滤波器截止频率,ωe是电角速度;另一种是把反电动势估计先经过一个正交锁相环(PLL)再提取速度和角度,锁相环自带相位跟踪能力,不仅能平滑角度,还能直接得到转速估计,目前大多数工程实现都采用PLL方案。我这套Simulink模型里用的就是PLL,省去了相位补偿的麻烦,抗噪能力也更好。
2.5 为什么增益k的设计是SMO的灵魂
如果k选得太大,观测器会被强行鲁棒地拉到滑模面,但反电动势估计中的高频抖振噪声会非常大,导致角度估计抖动明显,电流波形出现高频毛刺,严重时会激励起机械共振。如果k选得太小,滑模条件不满足,观测器根本无法进入滑模面,电流误差无法收敛,角度估计会直接发散。
我一般推荐k取电机额定反电动势峰值的1.2到1.5倍,同时结合仿真表现调整。下面的表总结了我调试时对k值的观察:
| 滑模增益k | 观测器表现 | 电流波形特征 |
|---|---|---|
| 偏小 | 角度跟踪失败,系统失稳 | 电流发散,逆变器限流 |
| 适中偏小 | 可运行但角度误差大 | 电流畸变明显,存在拍频 |
| 适中 | 角度稳定跟随,波动小 | 电流接近正弦,含少量高频毛刺 |
| 偏大 | 稳定但抖振严重 | 高频噪声明显,波形长毛 |
3. Simulink模型整体架构:从逆变器到控制环的完整链路
接下来是核心内容,就是这套模型在Simulink里具体怎么搭。我会从顶层结构讲起,再逐块拆解每个子系统的功能。
3.1 顶层模型的模块划分和信号流
打开Simulink,新建模型后,顶层需要包含四大块:
- 永磁同步电机本体模块(用Simscape Electrical里的PMSM模块或自建方程模块)
- 三相全桥逆变器模块(用Universal Bridge或MOSFET桥)
- 控制模块(包含Clarke变换、Park变换、SVPWM、电流PI环、速度PI环、SMO观测器)
- 信号测量与显示模块(Scope、RMS测量、角速度观测器)
信号流方向很清晰:直流母线电压进入逆变器,逆变器输出三相电压加载到PMSM上,PMSM输出的三相电流送入控制模块。在无传感器模式下,PMSM的机械位置信号只用来和观测器输出做对比验证,不参与反馈控制——这是整个模型能否叫“无传感器”的关键验证点。
直流母线电压我设置成310V(模拟三相整流输出),PMSM参数采用一台常用的表贴式永磁同步电机数据:定子电阻Rs=2.875Ω,d/q轴电感Ld=Lq=0.0085H,永磁磁链ψf=0.175Wb,极对数np=4,额定转速1500rpm,额定转矩2.3N·m。这套参数间接来自一台工业风机电机,比较有代表性。
3.2 SVPWM逆变器为什么要单独建模
很多初学者图省事直接用Simulink自带的PMSM控制库里面的SVPWM块,我建议不要这么做。自带的块虽然方便,但封装太死,你没法直观看到扇区判断、矢量作用时间和开关序列生成过程。自己搭一遍SVPWM,对理解调制原理特别关键,也能方便地调换死区参数和调制策略。
SVPWM的原理简要回顾一下:对于三相逆变器的8种开关状态(6个有效矢量+2个零矢量),任意一个期望电压矢量都可以由两个相邻有效矢量和零矢量按时间比例合成。在αβ坐标系下,通过判断角度所处扇区,计算两个相邻矢量的作用时间T1和T2,剩余时间分配给零矢量,再按照7段式对称发波生成三相开关信号。Simulink里搭这一步要用的核心计算模块是三角函数、取模、限幅和逻辑判断块。
| 扇区 | 角度范围 | 邻接矢量 |
|---|---|---|
| I | 0°~60° | U1(100)、U2(110) |
| II | 60°~120° | U2(110)、U3(010) |
| III | 120°~180° | U3(010)、U4(011) |
| IV | 180°~240° | U4(011)、U5(001) |
| V | 240°~300° | U5(001)、U6(101) |
| VI | 300°~360° | U6(101)、U1(100) |
SVPWM相比SPWM最大的优势是直流母线电压利用率高约15.5%,同时电流谐波更小、转矩脉动更低。对无传感器控制来说,SVPWM还有一层隐性好处:开关序列对称、零矢量分布合理,使得相电流采样窗口更稳定,为观测器提供了质量更高的电流反馈信号。这一点在后面的调试中会体现得很明显。
3.3 FOC双闭环控制的内部结构
控制模块内部是经典的电流内环+速度外环结构:
速度环的给定值经过一个斜坡函数限速后,和观测器估计的速度做差,经过PI调节器输出iq的给定值。id的给定值在表贴式电机(Ld=Lq)下直接给0,代表最大转矩电流比控制。两个电流PI调节器分别对id和iq做闭环,输出dq轴电压给定,经过反Park变换得到αβ轴电压给定,交给SVPWM去调制。
在电流环PI参数整定上,我按照工程上常用的零极点对消方法:
Ki/Kp = Rs/Ls
然后按期望电流环带宽确定Kp和积分时间常数。带宽一般取1/10到1/5的开关频率,本模型开关频率设置为10kHz,所以电流环带宽取1000rad/s左右。根据公式Kp = Ls·ωc可先算出一个初值,再微调,最终仿真中我的电流环Kp在十几个左右,Ki在几千的量级。速度环带宽取电流环的1/10到1/5,Kp可先用经验值,后面靠波形微调。这里有一个实操要点:电流PI和速度PI都必须在Simulink里考虑数字控制的离散周期,我这套模型的核心控制都是离散化的,采样周期设成和PWM载波周期一致(100微秒),分装在离散子系统里。
4. 观察器与原材料的兼容性问题
上一节把控制链路讲完了,现在单独把SMO在Simulink里的搭建细节说透,因为这一块是整套模型的成败点。
4.1 SMO子系统的Simulink实现
SMO子系统输入为αβ轴电压uα、uβ和αβ轴电流iα、iβ,输出为估计角度和估计速度。整体按照2.3节的状态方程,用基本的加法、乘法、增益、符号函数和积分器搭成,特别不建议直接套Matlab Function,因为可视化程度差,调试时不好看中间信号。
具体模块连接顺序是:
- 电流误差计算:估计电流减实际电流,得到iα_err、iβ_err
- 滑模切换项:符号函数后乘以增益k
- 状态更新:根据电压方程计算电流导数,积分得到估计电流
- 反电动势提取:符号函数输出进低通滤波器,得到eα_est、eβ_est
- 角度速度提取:eα_est、eβ_est进入PLL,输出角度和速度
低通滤波器我用的是一阶低通,截止频率1000Hz左右。前面提过,如果要直接用atan2就别用PLL,用了PLL可以放宽对LPF相移的顾虑。PLL内部是一个Park变换加PI调节器加积分器的经典结构:把反电动势矢量旋转到估计角度的同步坐标系,q轴分量作为角度误差输入PI,PI输出是角速度,角速度积分再得到角度。
4.2 滑模增益k到底怎么调出来
我在实际调试中总结了一个比较简单有效的调k方法:先让电机在较低的转速下稳定运行,用一个固定的斜坡给定速度,然后用时间常数较大的LPF观察反电动势估计波形。如果波形里出现了明显的饱和削顶,就说明k偏大,换来的可能是大量高频噪声;如果波形幅值明显小于真实反电动势峰值,就说明k偏小,角度估计会跟着抖。
我最终的k值是直接按实际反电动势幅值计算的,大约在80左右。大家注意这里必须用电角频率去算反电动势幅值,别用机械角速度,否则差一个极对数倍数,很容易把k调错。
4.3 起动策略:纯SMO扛不住零速,怎么办
前面已经说了,SMO在低速下不行。所以这套模型的起动逻辑是:先I/F强迫定向起动,再切换到SMO无感运行。I/F起动指的是给一个固定幅值的电流和一个线性爬升的电角度频率,强制让转子跟着同步旋转起来。当估计速度达到额定速度的15%到20%左右时,切换到SMO模式,之后整个系统完全依靠观测器闭环运行。
这个切换时刻的选择很关键,切太早,反电动势信噪比仍不够,角度估计还有明显抖动,切换瞬间电流会有很大冲击;切太晚,I/F阶段电流产生的转矩角可能变大,切换时容易失步。工程上通常通过持续监测角度误差是否在阈值以内来决定切换时机。
在Simulink里,这个逻辑我用一个Stateflow图表实现,状态涵盖“I/F起动”、“切换判断中”、“SMO运行”三个阶段。如果你不想引入Stateflow,也可以用带迟滞的switch逻辑代替,效果差不多。
5. 仿真结果解析:从波形看系统的真实表现
模型搭完就得到处看结果说话。仿真时长我设成2秒,步长用变步长ode45,PWM载波10kHz。下面的分析基于一个典型工况:电机空载起动到1000rpm,1秒时突加2N·m负载。
5.1 转速响应:起动切换段最容易露馅
从转速波形看,I/F起动阶段转速线性爬升到150rpm左右,然后切入SMO模式,切换点处转速会出现一个短暂的小凹陷,随后在速度环调节下迅速回到给定值。如果k值或者PLL参数不合适,这里的小凹陷会变成明显的超调甚至震荡,切换瞬间电流也会有一发大的尖刺。
整个加速过程里,转速跟随性良好,1000rpm稳态下转速波动大概在正负3rpm以内。如果转速波动明显偏大,优先检查PLL带宽和SMO输出LPF截止频率,两者共同决定了速度估计的平滑度和响应速度。
5.2 电流波形:高频毛刺和基波畸变的辨别方法
突加负载之后,q轴电流会发生突变,从空载的很小值跳到负载对应值,d轴电流则始终被PI环压制在零附近。三相电流波形呈正弦,叠加了一些细密的高频毛刺,这就是滑模抖振的直观体现。毛刺幅值如果小于基波电流的5%左右,是可以接受的;如果毛刺很粗、像锯齿一样,说明滑模增益偏大或者LPF截止频率偏高。
一个特别需要留意的坑是:电流采样毛刺往往会沿着PWM开关周期规律出现,看起来像控制环不稳,其实是观测器高频分量经SVPWM调制后耦合回电流回路形成的。解决办法是让电流反馈路径上增设采样保持和合理的抗混叠滤波,别只盯着电流环PI去调。
5.3 角度估计误差:SMO到底估准到什么程度
整段仿真里,我把真实电机转子位置和SMO估计位置做差,得到角度误差波形。I/F起动过程中误差较大,因为是开环拖动;切入SMO后,误差很快收敛到几度以内,稳态下误差基本在3度电角度以内。3度电角度对大多数风机、泵类应用来说完全够用,但如果要做高精度伺服,就需要进一步优化。
注意角度误差里会有一倍频甚至六倍频的脉动成分。一倍频脉动通常来自逆变器死区和反电动势谐波,六倍频脉动和电流采样误差和SVPWM的离散误差相关。抑制手段包括加死区补偿、提升电流采样同步精度,或者对角度估计结果做谐波前馈,工程实现上可以后续追加。
6. 调参踩坑记录:这些问题每个做过SMO的人都可能遇到
最后这部分,把我调这套模型时踩过的坑都列出来,每一个都对应了至少半天的排查时间,希望后来的人能少走弯路。
6.1 电流环PI调好了,观测器还是崩——先检查坐标系变换方向
这是最容易踩的一个坑。整个FOC链路里Clarke和Park变换一共有三处:电流反馈的前向变换、电压给定反变换、以及PLL内部的角度变换。任何一处角度符号差了,系统性就会不可控。我建议在观测器输出端直接做对比测试:给电机一个恒定角度位置,让角度缓慢变化,观察αβ轴电流是否是预期的正余弦波形。如果电流波形相位明显不对,大概率就是变换方向的问题。
6.2 低通滤波器和PLL的“联合延时”会互相放大
低通滤波器延时和PLL带宽是一对互相竞争的矛盾。LPF截止频率低,反电动势平滑了,但延时大,PLL为了补偿延时必须调高带宽,结果又把噪声放大了。我实际调完的配置是LPF 1000Hz、PLL带宽200rad/s左右,两者配合下角度误差稳定在3度以内。你的电机参数和应用场景不同,要用这个状态组合作为出发点重新扫描调优。
6.3 模型里要小心代数环问题
搭建SMO时,如果你把符号函数输出直接同时用于状态更新和反电动势提取,Simulink里很容易出现代数环报警,仿真速度骤降甚至直接报错。解决办法是拆阶段:先算状态更新,再做反电动势提取,或者在观测器输出端插入一个单位延迟(Unit Delay)来打断代数环。这个细节看似不起眼,但对仿真体验影响极大。
6.4 开关频率和采样频率没对齐,导致电流反馈相位不一致
离散控制中,电流采样要尽量和PWM载波中心对齐,否则采样到的电流是开关纹波的非零均值,控制精度会下降。在Simulink里做离散化时,要把采样时间统一成PWM周期的整数倍,并在PWM触发信号上升沿打戳采样时刻。如果你把电流环采样频率设置成和PWM频率不同步,就会看到电流波形上叠加有规律的低频拍频毛刺。
6.5 负载突变时角度估计瞬态跌落
突加负载瞬间,电流突增,反电动势瞬态变化,SMO的收敛需要时间,角度误差会短暂变大到十几度,然后被PI环拉回来。如果想抑制这个跌落,可以适当增大滑模增益k,或者提高PLL带宽,但代价是稳态噪声变大。这个取舍没有绝对的“最优”,完全看应用偏向动态还是偏向稳态。
7. 基于这些经验,后续还可以往哪个方向扩展
这套模型跑通以后,可扩展方向很多。一个是把LPF+atan2结构替换成更高阶观测器,比如滑模+龙贝格观测器的混合结构,进一步压低角度误差;一个是加入死区补偿和母线电压波动补偿,提升系统在全工况下的鲁棒性。
还有一个工程上很实际的方向,是把整个控制算法从Simulink毫秒级模型转成C代码部署到MCU。因为SMO计算量小,大部分主流MCU完全跑得动。届时帧率、定时器同步、ADC触发这些细节又会变成新的调试主战场。按我的经验,能搭建、能调稳、能看懂波形的这一整条链路,远比调出某个特定参数更值钱,因为它在任何电机控制项目里都是通用的方法论。
做无感PMSM控制这么多年,我自己的体会是:Simulink仿真模型最大的价值是给了你一个“零成本试错”的环境,你可以反复拉高负载、反复切换工况,把所有可疑的坑都在仿真阶段踩一遍。真到硬件上,往往是那一次起动或者那一次负载突变就能帮你定位问题,而你在仿真里积累的手感,就是现场最快的排障工具。