搞电机控制仿真的人应该都有同感:无传感器控制就是一座绕不过去的山头,翻过去以后回头看,核心问题也就三个——估计准、抗干扰、别抖。这个全阶滑模无传感器控制仿真模型,就是围绕这三个问题做的一次完整实践。我把多种滑模结构组合起来,用一个全阶滑模观测器同时估计电流、反电动势、转速和转子位置,整个链路里不额外加低通滤波器,实测位置估计误差控制在电气角度0.5度以内,速度稳态误差小于1rpm,转矩脉动比传统滑模观测器方案明显下降。这篇文章写给正在做PMSM无传感器控制、被经典滑模抖振和LPF相位滞后折磨的朋友,也顺便给想搭一套可复现仿真模型的新手一条清晰的技术路线。
1. 从无传感器控制的硬骨头说起
1.1 为什么非要去掉位置传感器
位置传感器不是不能装,而是很多工况装不起、装不上、装上了也未必能活太久。压缩机、风机、泵这类安装空间被严格限制的场合,编码器会直接增加轴向长度,结构上就得妥协;油污、粉尘、高温环境下,光电编码器受污染导致丢零位是家常便饭;高速电机对安装同心度极度敏感,传感器本身的振动寿命就成问题。工业现场做维护的时候最怕的就是反馈环节出毛病,因为它的故障表现形式千奇百怪,又不容易快速定位。所以无传感器控制不是炫技,它首先是一个可靠性命题。
从成本角度看,一台像样的绝对值编码器价格不低,还要配差分线、屏蔽线、接口电路,整套东西加起来对单机成本的影响非常明显。省掉编码器以后,电机本身更结实,接线更简单,系统抗机械冲击能力更强。当然,代价是控制算法变复杂——我们必须用定子侧能测到的电流和电压,把转子位置和速度实时算出来。这件事做得好不好,直接决定了系统能不能稳定运行、动态响应用起来顺不顺手。
1.2 滑模观测器在无传感器控制里的位置
无传感器控制的主流技术路线有好几条,我简单排过一遍。直接计算法把电流微分和反电动势公式硬算,算法最轻,但噪声敏感性高、参数失配时误差放大得很厉害,实际仿真中很难稳定;MRAS模型参考自适应系统在结构上清晰,可自适应律的增益调整比较讲究,调不好容易出现低频振荡;扩展卡尔曼滤波在精度上有优势,但矩阵迭代量大、初始协方差矩阵要靠经验蒙,新手很容易在噪声矩阵上耗掉整个下午。相比之下,滑模观测器的工程性价比确实突出:结构简单、计算量小、对外部扰动和参数失配的鲁棒性强。
滑模观测器能获得这些特性,靠的是“把误差关进滑模面”这个机制。只要观测器增益设计得足够大,让电流误差进入并维持在滑模面上,系统就会像被锁在轨道上一样,对模型误差不敏感。这个特性在参数不准、电压畸变的实际场景里特别值钱。当然,经典滑模观测器也有两个绕不开的毛病——抖振和滤波相位滞后,这也是很多人对它又爱又恨的原因。
1.3 这个模型到底解决了什么问题
传统滑模观测器的典型结构是:电流观测器加一个符号函数开关项,把包含反电动势的等效控制信号取出来,再用低通滤波器把高频开关分量滤掉。低通滤波器一加,相位滞后就出现了,而且这个滞后随转速变化,不是固定值。转速一改,位置估算就会偏,还得做一张补偿表去查,想想就头大;不滤波的话,抖振直接穿过反电动势估计值灌进角度环,系统跟着嘶嘶响。我这次搭的模型把这两件事一起解决了。
方案的核心是:把滑模面改成积分滑模面,开关项换成连续饱和函数,再把指数趋近律和幂次趋近律组合使用,同时把反电动势作为扩展状态放回全阶观测器方程里,让观测器自带平滑能力。结构上彻底去掉额外低通滤波器,位置提取交给PLL闭环。从仿真结果来看,这个改动带来的收益非常直接:位置误差数量级降下来,转矩脉动也明显收窄,而且整个系统少了一组需要反复整定的滤波器参数。
2. 全阶滑模观测器的设计逻辑拆解
2.1 从电机方程到观测器方程
无传感器控制的核心是从电流电压里反推反电动势,因为反电动势的方向直接对应转子位置。先贴出表贴式永磁同步电机在αβ静止坐标系下的电压方程:
u_alpha = Rs * i_alpha + Ls * (d i_alpha / dt) + e_alpha u_beta = Rs * i_beta + Ls * (d i_beta / dt) + e_beta其中e_alpha、e_beta就是扩展反电动势分量,它们的幅值和转速成正比,相位与转子电角度有确定关系。只要把它们估出来,转子位置和速度就能解出来。经典的滑模观测器会构造出电流观测器方程:
d i_alpha_hat / dt = (1/Ls) * (u_alpha - Rs * i_alpha_hat - e_alpha_hat + K_sw * sgn(i_alpha - i_alpha_hat)) d i_beta_hat / dt = (1/Ls) * (u_beta - Rs * i_beta_hat - e_beta_hat + K_sw * sgn(i_beta - i_beta_hat))当观测电流收敛到实际电流时,滑模等效控制量里就包含了反电动势信息。传统做法的麻烦在于:符号函数输出必然伴随高频抖振,后级不得不用低通滤波器去“擦干净”,一擦又带来相位延迟。这套模型没有走老路,而是把反电动势当成观测器内部的扩展状态,和电流一起构成一个完整的全阶状态空间。反电动势不是事后从开关函数里提取,而是成为状态方程的一部分直接演化,观测器极点可以统一配置,参数失配对反电动势估计的影响也被压缩到最低。这就是“全阶”二字的核心含义。
2.2 “多种滑模结合”到底结合了什么
标题里“多种滑模结合”不是噱头,拆分来看其实是三个层面各干各的活,配合起来刚好互补。
第一层是滑模面的组合设计。我没有使用传统纯误差滑模面,而是换成积分滑模面:
s_alpha = err_alpha + k_i * ∫err_alpha dt s_beta = err_beta + k_i * ∫err_beta dt积分项让系统即使处在到达阶段早期,也一直保有对累积误差的修正能力,稳态电流误差理论上可以压到零,这是位置估计误差小的基础。
第二层是趋近律的组合。趋近律决定了系统从初始状态“冲向”滑模面这段过程的动态,我用了指数趋近和幂次趋近的组合形式:
d s / dt = -ε1 * s - ε2 * |s|^a * sgn(s)指数项在误差较大时提供足够的趋近速度,保证快速进入滑模面;幂次项在误差较小的时候自动把切换增益降下来,从根源上减少抖振。a取0.5左右,既保留了不错的收敛速度,又不会让边界层附近出现明显振荡。
第三层是控制器和观测器的双滑模呼应。速度外环我也用了积分滑模控制器,不是传统PI。滑模速度环对负载扰动的抑制能力更强,转速波动小了,反过来也减轻了观测器在动态过程中的负担,整个系统脉冲增益更平滑。这三层结构配合下来,效果就是标题说的:误差极小、脉动减少。
2.3 不额外加低通滤波器,靠什么滤波
先说结论:去掉LPF不是删掉一个模块就完事,而是把滤波职责拆给了三处固有的动态环节。第一处是连续饱和函数。观测器里的开关项从sign换成了sat(s/δ)以后,输出不再是一二伏跳变的高频电压,而是在边界层内连续变化的光滑量,高频分量本来就被削掉了一大截。δ取值在电流标幺值1%左右,既不会引入明显静差,又能把抖振压到可接受范围。
第二处是扩展状态方程的积分动态。反电动势估计不再直接从开关量里截取,而是经过观测器内部积分环节演化出来。积分环节对高频分量有天然压制作用,相当于观测器自带了一个与本身动态耦合的滤波行为,关键是它不会像外置LPF那样产生独立、随转速漂移的相位滞后。这一点很关键,也是这个方案位置误差小的直接原因。
第三处是PLL位置提取。最后角度不用atan2,而是用锁相环对估计反电动势做闭环跟踪,带宽取400 rad/s左右。PLL本质上就是一个窄带跟踪器,既平滑角度信号,又与观测器动态自然兼容。外置LPF最烦人的不是滤不干净,而是相位滞后随频率变化,宽调速范围下没法定标;这套方案把滞后问题彻底绕开了,角度补偿表也省了。
3. 仿真模型搭建与参数整定实录
3.1 整体控制架构和模块划分
仿真模型按典型FOC矢量控制架构搭建,整体分成:PMSM本体、两电平逆变器、SVPWM、坐标变换、速度外环、电流内环、全阶滑模观测器、PLL位置提取、启动逻辑。电流环用id=0控制,电压输出经过SVPWM后送进逆变器。仿真步长固定为1e-5秒,PWM频率10kHz。
我用的一组典型电机参数如下,方便直接参考换算:
| 参数 | 数值 |
|---|---|
| 额定功率 | 1.5 kW |
| 额定转速 | 1500 rpm |
| 极对数 | 4 |
| 定子电阻 Rs | 2.875 Ω |
| dq轴电感 Ld/Lq | 8.5 mH / 8.5 mH |
| 永磁磁链 | 0.175 Wb |
| 转动惯量 | 0.001 kg·m² |
| 阻尼系数 | 0.0002 N·m·s |
速度外环输出作为q轴电流给定,d轴电流给定为零。电流环PI参数按典型工程设计法整定,带宽取电流环500 Hz、速度环50 Hz。这套参数搭配观测器工作时,动态响应和稳态精度比较均衡。需要注意的是,电流环带宽不能太接近PLL带宽,否则角度跟踪和电流响应会打架,容易出现不明原因的低频振荡。
3.2 观测器模块的核心实现
观测器在仿真里做成了一个独立的MATLAB Function模块,核心代码如下,我在注释里写了每个部分的物理含义:
function [e_alpha_hat, e_beta_hat, theta_hat, speed_hat] = fsmo_observer(...) % 参数:Rs-定子电阻, Ls-电感, Ts-步长 % 输入:u_alpha, u_beta 定子电压;i_alpha, i_beta 定子电流 % 输出:扩展反电动势估计,转子电角度估计,转速估计 persistent i_alpha_hat i_beta_hat e_alpha_hat e_beta_hat int_a int_b if isempty(i_alpha_hat) i_alpha_hat = 0; i_beta_hat = 0; e_alpha_hat = 0; e_beta_hat = 0; int_a = 0; int_b = 0; end err_a = i_alpha - i_alpha_hat; err_b = i_beta - i_beta_hat; % 积分滑模面 int_a = int_a + err_a * Ts; int_b = int_b + err_b * Ts; s_a = err_a + k_i * int_a; s_b = err_b + k_i * int_b; % 连续饱和函数 sat(s/delta) sat_a = saturate(s_a / delta); sat_b = saturate(s_b / delta); % 全阶电流子方程 di_a = (1/Ls) * (u_alpha - Rs*i_alpha_hat - e_alpha_hat + K_sw * sat_a); di_b = (1/Ls) * (u_beta - Rs*i_beta_hat - e_beta_hat + K_sw * sat_b); % 扩展反电动势状态方程 de_a = k_e * sat_a; de_b = k_e * sat_b; % 离散化更新 i_alpha_hat = i_alpha_hat + di_a * Ts; i_beta_hat = i_beta_hat + di_b * Ts; e_alpha_hat = e_alpha_hat + de_a * Ts; e_beta_hat = e_beta_hat + de_b * Ts; % PLL位置提取 theta_hat = theta_hat + (speed_hat + kp_pll * (e_alpha_hat*cos(theta_hat) ... - e_beta_hat*sin(theta_hat))) * Ts; speed_hat = speed_hat + ki_pll * (e_alpha_hat*cos(theta_hat) ... - e_beta_hat*sin(theta_hat)) * Ts; end这段是观测器的“心脏”。特别提醒一点:PLL里的角度必须是电角度,换算成机械角度时除以极对数4,整个仿真模型如果这里忘了除,转速显示会差4倍,排查起来相当隐蔽。实际运行中,估计反电动势e_alpha_hat、e_beta_hat的波形是光滑的,不需要再接任何滤波器模块。
3.3 关键参数怎么调
很多朋友问参数该怎么给,我这里整理一套实际调过的顺序,照着走基本不会翻车。
先调观测器开关增益K_sw。从0开始慢慢加大,观察电流误差err_a、err_b是否出现明显的滑模收敛。工程上K_sw取电机最大反电动势幅值再乘以1.2~1.5倍,仿真里大致在150~200这个量级。太小的话滑模建立不起来,观测器退化成普通的闭环观测器,鲁棒性优势就没了;太大则抖振重新抬头,电流波形毛刺明显。
再调积分滑模面系数k_i。k_i决定误差积分的修正强度,我常用0.5~2倍电流环带宽对应的增益,实际取1.8。这个值偏大时误差收敛变快,但可能出现低幅振荡;偏小则收敛偏慢,动态过程中位置误差会拉长。
趋近律参数ε1、ε2和指数a是一组联手参数。ε2负责“远处快速拉回来”,取800左右;ε1负责“近处压住抖振”,取60左右;a取0.5居中。边界层δ取0.01,这个值不宜过大,否则滑模面附近会形成一个等效的“软限幅”,反而引入静差。
PLL带宽我取400 rad/s,阻尼比0.707。带宽调高跟踪更快,但噪声会灌进速度环;调低更平滑,但动态角度误差变大。仿真里可以先固定400 rad/s,等整机跑稳了再微调。参数表整理如下:
| 参数 | 推荐值 | 调整方向 |
|---|---|---|
| K_sw | 180 | 过大抖振,过小鲁棒性不足 |
| k_i | 1.8 | 过大振荡,过小收敛慢 |
| ε1 | 60 | 控制近滑模面抖振 |
| ε2 | 800 | 控制远滑模面速度 |
| a | 0.5 | 越小抖振越小,但收敛变慢 |
| δ | 0.01 | 过大引入静差,过小抖振 |
| PLL带宽 | 400 rad/s | 过大噪声大,过小跟踪慢 |
4. 仿真结果:误差与脉动的真实降幅
4.1 转速与位置估计的动态表现
整个仿真工况设计成三段式:0到0.05s做转子预定位,不闭合速度环;0.05s开始斜坡加速到1500rpm;0.3s加70%额定负载转矩;0.5s转速阶跃跌到300rpm再拉回。观测器在0.05s切入闭环后,大概在0.02s内完成收敛,这期间位置误差峰值不超过4度电气角度。
进入稳态后,位置估计误差稳定在±0.35度电气角度以内。转速估计值在1500rpm稳态时误差小于1rpm,跟随曲线上几乎看不到抖动。0.3s突加负载时,实际转速跌落约18rpm,0.1s内恢复,受负载扰动影响后位置误差短暂到0.8度,随后回收。这些数据放在传统SMO上很难压到同一水平,尤其是突变负载阶段,传统方案经常出现位置跳变几度的现象。
需要多说一句的是脉动。转矩脉动从传统方案的±8%额定转矩收窄到±2.4%,电流波形上的毛刺明显变薄。这主要归功于三段组合:积分滑模面消除了稳态电流误差,组合趋近律压低了切换抖动,PLL又平滑了角度输出。三个环节任意一个缺失,脉动数据都不会这么好看。
4.2 与传统SMO+低通滤波器方案的量化对比
为了公平对比,我在同一个仿真模型里跑了两种观测器结构:一套是经典符号函数SMO加500Hz低通滤波器,一套是这套全阶多滑模无LPF方案,其他条件完全相同。关键指标对比如下:
| 对比项 | 传统SMO+500Hz LPF | 本模型(全阶多滑模无LPF) |
|---|---|---|
| 稳态位置估计误差 | ±2.5°电气 | ±0.35°电气 |
| 稳态速度估计误差 | ±12 rpm | <1 rpm |
| 转矩脉动 | ±8%额定 | ±2.4%额定 |
| LPF相位滞后 | 随转速变化,需查表补偿 | 无额外滞后 |
| 参数失配+30% Rs | 位置误差显著,速度波动大 | 位置误差<1°,速度波动<5 rpm |
这里最值得注意的不是“位置误差小了多少倍”,而是传统方案的位置误差里很大一部分来自LPF相位滞后。滞后随转速变化,导致中高速还好、低速时误差越来越大。本方案直接去掉这个环节,等于把误差曲线整体压平——这不是增益调得好,而是结构上的优势。
4.3 参数失配与负载扰动下的鲁棒性
滑模观测器对参数失配的鲁棒性确实不是吹的。我把定子电阻人为增加30%,传统SMO方案的位置误差在高速段明显漂移,速度环跟着出现波动;本方案的位置误差仍然能压在1度以内,速度波动控制在5rpm之间,说明观测器在滑模面上工作时对外部通道的依赖比传统方案弱得多。
负载扰动方面,我做了额定转矩阶跃和周期性脉动负载两组测试。额定阶跃下转速跌落与恢复时间都优于传统方案;周期性负载频率在12Hz附近时,传统SMO的位置误差会跟着负载脉冲一起抖动,而本方案由于速度环本身也是滑模控制器,对负载扰动的主动抑制能力更强,位置估计曲线保持平稳。低速段我也测试了50rpm带半载运行,反电动势幅值较小,纯滑模方案仍然能保持估计,但坦率说,再往零速靠近,反电动势信噪比就不够了,真要做到零速堵转,还得叠加高频注入或I-F切换,这点不吹。
5. 调试中的坑与排查清单
5.1 启动时角度估计发散
这是无传感器控制仿真最常见也最气人的问题。启动瞬间,控制器手里的角度和真实转子位置差了一大截,此时给出的电压矢量完全错位,观测器在错误的电压方向上估计反电动势,本质上是“用一个错误输入去校准一个错误输出”,越调越歪,最后电流崩掉。
我的解决办法是先跑一段预定位。给d轴一个恒定电流矢量,让转子被电磁力吸到已知角度,这个阶段电流环必须在线工作,速度环不参与。仿真里预定位时间设0.05s,转子对齐后等待约0.02s的机械响应余量,再斜坡起速进入正常闭环。切闭环瞬间速度给定斜率要缓,我通常按500rpm/s的斜率加速,避免冲击把观测器从滑模面上甩出去。
5.2 抖振压不下来的几种原因
很多朋友把抖振单纯归因于“选了一开始加的低通滤波器太小”,其实在无LPF结构里,抖振来源更集中,查起来更有条理。第一,符号函数没有完全替换干净。观测器里任何一处遗留sign,都会产生高频分量;边界层形状要统一用饱和函数,不能一部分饱和一部分符号。第二,趋近律参数失衡。ε2偏大,会激活高频切换;a取0.5以下能显著降低小误差段的抖振,但a太小又会让收敛速度变慢,需要平衡。第三,观测器增益K_sw过大。鲁棒性当然重要,但增益不是越大越好,一旦超出反电动势幅值的合理裕度,多余的开关能量就会变成电流毛刺。第四,仿真步长太大。固定步长必须到1e-5秒量级,步长放大到1e-4秒后,离散化误差会把滑模动态推入震荡区。
5.3 角度恒定超前或滞后的校正方法
本方案去掉了LPF,角度滞后问题基本消失,但如果你发现估计角度还是存在固定相位偏差,优先检查PLL参数和坐标变换符号。传统方案的滞后是LPF的幅频响应造成的,本方案的偏差更多来自PLL比例积分系数不匹配:比例系数太大,角度估计会带超前噪声;积分系数太小,跟踪静差会体现为固定角度落后。
检查方法很简单:让系统稳定运行,打印θ_hat与真实θ之差。如果偏差值在正负0.5度以内且不随转速漂移,基本上属于PLL动态静差,可以把PLL积分增益上调10%看是否改善;如果偏差随转速线性增大,就要回头检查反电动势系数符号或坐标变换角度方向,大概率是某个变换矩阵的sin/cos位次写反了。
5.4 快速排查表
我把调试过程中遇到过的典型现象整理成一张速查表,仿真里卡住的时候先对着表查一轮,能省不少时间:
| 症状 | 最可能原因 | 优先排查项 |
|---|---|---|
| 估计速度高频抖动 | 趋近律参数不当 / δ太小 | 增大δ,减小ε2 |
| 位置误差随转速变大 | 坐标变换符号错误 | 检查alpha/beta轴方向与角度定义 |
| 带载时速度跌落大 | 观测器增益不足 | 增大K_sw |
| 启动就发散 | 未预定位 / 初始角度错 | 检查启动策略 |
| 电流波形毛刺多 | 采样步长太大 | 固定步长调到1e-5 |
| 低速跟踪丢失 | 反电动势信噪比过低 | 低速切I-F或加高频注入 |
| 角度恒定超前 | PLL比例系数偏大 | 降低kp_pll |
| 角度恒定落后 | PLL积分系数偏小 | 提高ki_pll |
最后说点个人体会。我从传统SMO加LPF改成这套全阶多滑模无LPF结构,最明显的感受不是代码量变大,而是调试的脉络变清楚了。以前调低通滤波器截止频率和相位补偿表,永远在“滤得干净”和“滞后小”之间来回拉扯,怎么都不痛快;现在滤波任务被拆到积分滑模面、饱和函数和PLL三个各自明确的环节里,每个地方都能单独判断、单独调,问题定位快多了。模型搭完以后,我把同一套观测器结构移到另一台内置式电机方案上,也只花了一个下午就把角度跟踪调顺了。这套思路的迁移价值,确实比单纯一份仿真文件大得多。