先说结论:这套“高频方波注入 + 滑模观测器 + 加权切换”的组合,是所有做永磁同步电机无位置传感器控制的人迟早要面对的一条完整技术路线。低速用注入法解决零速和极低速下的转子位置观测,中高速用滑模观测器解决反电动势变弱之外的中高速段估算,中间加一个加权切换区把两套估算结果平滑衔接。这篇文章我就围绕这个方案,把原理、参数、仿真搭建和调坑实录全部摊开讲,争取让按这个思路做仿真的人少走几个月的弯路。
1. 为什么全速域控制必须分段:先说清楚“看不见”的问题在哪
永磁同步电机无位置传感器控制,本质上是一个“状态重构”问题。你手头只有电流和母线电压,但你需要转子位置和转速来让矢量控制里的 Park 变换、反 Park 变换有正确的角度基准。没有机械编码器或旋变,整个系统就像蒙着眼睛开车,只能靠电机的电磁特性来推算。
1.1 零低速段为什么难搞:反电动势消失了,但凸极性还在
先看感生电动势公式。在旋转坐标系下,永磁同步电机的电压方程里包含反电动势项,比如 ( e = \omega_e \psi_f )。这意味着转速为零或极低的时候,反电动势几乎为零,靠“测反电动势”来求位置这条路直接失效。你不可能从一个幅度接近零的信号里提取出可靠的角度信息,信噪比太差,放大噪声也没用。
但电机转子上有永磁体,定了转子之间有一个天然的非对称特征:直轴和交轴磁路不一样,说得更直白一点,电感在直轴和交轴方向是不相等的,也就是存在 ( L_d \neq L_q ) 的凸极性。就算转速为零,只要你在这个电机的端部注入一个高频激励,电流的响应幅度和相位就会随转子位置变化。这种随位置变化的高频电流响应,等于把转子位置信息“调制”到了高频载波上。我们做的所有高频注入法,本质就是把这个高频响应解调出来,恢复转子位置信息。
1.2 高频注入分两类:旋转电压注入和方波注入
高频注入有很多种变体,最常见的是旋转高频电压注入和脉振高频电压注入,以及这篇要重点讲的脉冲高频方波注入。
旋转注入法是在定子静止坐标系里叠加一个旋转的高频电压矢量,利用电机凸极性在电流响应上产生的正序和负序分量来解调位置。它的好处是结构对称,对参数不敏感,但信号处理链路比较长,需要带通、同步解调、低通一系列滤波,延迟比较大。
方波注入法则是在估算的直轴方向上叠加一个高频方波电压。相比正弦注入来说,方波注入的频谱更干净,因为只有一个基波频率和它的奇次谐波,你不需要像正弦注入那样做同步解调来把正负序分离,直接在特定时刻采样电流之差就可以解算出位置误差信号。这个特性让方波注入的信号带宽更高,动态响应更快,在工程上、在仿真里都更容易调试。
1.3 中高速段为什么靠滑模观测器:反电动势信号变强了,用强鲁棒的算法硬啃
转速一旦往上走,反电动势的幅度就变得很可观。这时候你再叠高频信号反而不划算,因为注入的信号会带来额外的损耗、噪声和转矩脉动,而且频率和幅值要跟控制频率协调,否则容易激发机械共振。
中高速段最常用的方案就是滑模观测器。它的思路很粗暴也很有效:构造一个基于定子电流的观测器,把真实电流和估算电流之间的误差喂给一个符号函数,得到一个滑模等效反电动势信号。这个信号里面包含了转子位置和转速信息,再用一个锁相环或反正切把它提取出来。
滑模观测器的优势是鲁棒性强,对电机参数变化的容忍度比一般的龙伯格观测器高,尤其是对定子电阻变化不敏感。代价是符号函数会带来抖振,需要额外滤波,而滤波会带来相位延迟,必须做补偿。
1.4 加权切换到底解决什么问题:不是“开关”,而是“混合”
很多人第一次看到“加权切换”这几个字,以为就是速度一到某个阈值,就从一套观测器切到另一套。大错特错。
真正的问题是:低速段凸极性信噪比高,高频注入法好使;但转向中高速时,高频注入的解调带宽有限,噪声越来越大,而反电动势法开始可靠。这两套观测器各有各的优势区间,但它们都会覆盖一个过渡范围。在这个范围内,如果直接硬切,你会看到位置估算角度跳变、转速估算跳变、电流振荡、转矩波动,甚至起动失败。加权切换就是一个“软交接”策略:在一个预定义的转速区间内,把两套观测器估算出来的位置和转速按权重混合,让系统平滑地完成交接。
光说完是不够的,下面几个章节我把每一段的原理和仿真实现细节都展开讲。
2. 高频方波注入法实现细节:从信号注入到角度解算
高频方波注入法在这个方案里负责零速到低速段的转子位置估算。它的关键步骤有三:注入、采样、解调。每一步做不好,后面都白搭。
2.1 高频方波注入的数学模型:为什么电流之差就是位置误差
我们在估算的 ( \hat{d} ) 轴方向上注入一个高频方波电压。这个注入电压可以写为:
[ v_{dh}^{*} = V_{inj} \cdot \text{sign}(\sin(\omega_{inj} t)) ]
也就是一个幅值为 ( V_{inj} ) 、频率为 ( f_{inj} ) 的方波。实际位置角和估算位置角之间存在一个误差 ( \theta_{err} = \theta_{real} - \theta_{est} )。因为电机 ( L_d )、( L_q ) 不相等,这个高频电压在真实轴系上产生的电流响应里,就会有一个跟 ( \theta_{err} ) 成正相关的高频分量。
具体推导不写全,核心结论是:在相邻两个开关周期内采样得到的定子电流之差 ( \Delta i_d )、( \Delta i_q ),经过一次 Park 变换到估算转子轴系后,构造出:
[ \varepsilon \approx K_{inj} \cdot \theta_{err} ]
在高频注入信号的两个相邻半周期内,电流响应的差值就能解算出位置误差信号。这个误差信号再扔给一个 PI 调节器,输出就是估算转速 ( \hat{\omega} ),估算转速积分一次,就得到估算位置 ( \hat{\theta} )。
这套思路的关键在于“相邻半周期电流相减”。为什么用差分而不用绝对采样?因为方波注入时,电机本身的基频电流会叠加在采样结果上,直接用绝对电流值会被基波污染,而相邻半周期的差值能把基波和直流偏置直接抵消掉,剩下的基本就是高频响应。
2.2 解调链路:从采样电流到位置估算的完整信号流
我的仿真模型里,解调链路是这么搭的:
- 在逆变器输出的电流采样点,直接采集相电流 ( i_a )、( i_b )、( i_c ),经过 Clark 变换得到 ( i_\alpha )、( i_\beta )。
- 用估算角度 ( \hat{\theta} ) 做 Park 变换,得到估算转子轴系下的 ( i_{\hat{d}} )、( i_{\hat{q}} )。
- 在每个方波半周期的结束时刻,保存当前采样值,与上一个半周期的保存值做差,得到 ( \Delta i_{\hat{d}} )、( \Delta i_{\hat{q}} )。
- 按差分解算公式求出位置误差 ( \varepsilon )。
- ( \varepsilon ) 过 PI 调节器,输出估算转速 ( \hat{\omega} )。
- ( \hat{\omega} ) 积分得到 ( \hat{\theta} ),送到 FOC 的 Park 和反 Park 变换里。
这个解调链路里最需要留意的是采样时刻。方波注入时,高频电流在每个开关周期内是线性上升或下降的,如果你在 PWM 载波峰值或谷值处采样,正好对应高频电流的“中间值”;如果你在错误的时刻采样,会采到电流的过渡沿,解出来的误差信号会带巨大的噪声。我在仿真里一般把采样时刻固定在 PWM 载波的顶点和底点,并且用两个连续周期的差值来计算斜率。
2.3 高频注入参数怎么选:幅值、频率、滤波器截止频率
参数选型直接决定低速段的稳态精度和动态带宽。我的经验值如下:
- 注入频率 ( f_{inj} ):一般取开关频率的 1/10 到 1/4。开关频率 10kHz 的时候,注入频率选 1kHz 到 2.5kHz。太低会和方法本身带宽冲突,太高会超出电流环采样能力,给解调带来频谱混叠。
- 注入幅值 ( V_{inj} ):这个要看你母线电压和目标电流纹波。一般取额定电压的 5%~15%,以让高频电流幅值在额定电流的 10% 左右。太大会造成明显的噪声和损耗,太小则信噪比不足。
- 解调滤波截止频率:解调得到的误差信号 ( \varepsilon ) 会混入高频谐波,所以后面要加一个低通滤波器。截止频率通常取注入频率的 1/10~1/5,我经常先按 200Hz 起调,看动态响应再调整。
- PI 调节器参数:估算转速环的内环带宽不能太慢,否则系统加减速时跟不上真实位置。我一般先让 PI 的零点在 50Hz~100Hz 处,然后根据相位裕度拉增益。
注意,这些参数在仿真里看着是常量,但实际工程里还要跟着电流幅值和转速前馈做标定。仿真里至少要把注入幅值设置成可以随母线电压变化调整的形式,否则后面做恒功率弱磁的时候会出问题。
2.4 实操注意事项:调制比限制、死区补偿、采样同步
这部分属于只有踩过坑才会知道的东西。
第一个坑是调制比。方波注入的电压是叠加在电流环输出电压上的,如果电机运行点接近调制极限,叠加的方波电压会让指令电压超过逆变器能输出的最大值,造成实际输出电压畸形。结果就是高频电流乱七八糟,解调直接崩掉。我在仿真里加了限幅判断:如果目标电压幅值超过最大调制电压的 90%,就先削减注入幅值,而不是让电流环把注入电压一起限掉。
第二个坑是死区效应。逆变器死区会造成电流谐波,而高频方波注入法对这个谐波特别敏感,因为它会直接污染相邻半周期的电流采样差。仿真里如果不加死区,波形会好得离谱,但不真实。我建议仿真里把死区模块加上,然后看解调出来的误差信号里有没有明显的 6 次谐波,有的话就要在采样值上做死区补偿,或者在解调链路里加陷波器。
第三个坑是采样同步。数字实现里,电流采样必须与 PWM 同步。Simulink 里如果你用连续时间域跑,模型看不出区别;但你要是改成离散域,采样周期和 PWM 周期没对齐,解调性能会有肉眼可见的下降。所以从建模第一步开始,就按离散时间系统来做电流采样和注入生成,别图省事用连续时间模块。
3. 滑模观测器 SMO 的实现细节:逼出反电动势,再稳住抖动
转速升上去之后,我们切换成反电动势法。滑模观测器的实现路径和高频方波注入完全不同,这里没有什么高频激励,全靠基波电流电压数据把反电动势“逼”出来。
3.1 反电动势模型:SMO 在仿真里到底在算哪条方程
永磁同步电机在静止 ( \alpha\beta ) 坐标系下的电流方程可以写成:
[ \frac{di_\alpha}{dt} = -\frac{R_s}{L_s} i_\alpha + \frac{1}{L_s} v_\alpha - \frac{1}{L_s} e_\alpha ]
[ \frac{di_\beta}{dt} = -\frac{R_s}{L_s} i_\beta + \frac{1}{L_s} v_\beta - \frac{1}{L_s} e_\beta ]
这里 ( e_\alpha ) 和 ( e_\beta ) 就是反电动势在静止轴系上的分量。滑模观测器的做法是:构造一个“电流估算器”,把真实电压指令 ( v_\alpha )、( v_\beta ) 输入进去,算出一个估算电流 ( \hat{i}\alpha )、( \hat{i}\beta )。然后,用真实电流和估算电流的差值做一个滑模面,将误差通过符号函数放大,反馈到估算器里,把电流估算误差驱向零。
当滑模面收敛后,电流误差为零,此时符号函数的输出平均值就约等于反电动势 ( e_\alpha )、( e_\beta )。你要做的,就是从这两个反电动势分量里把角度和转速提取出来。
3.2 符号函数和饱和函数:为什么仿真里要用 sat 而不是 sign
教科书里的滑模观测器通常写:
[ z_{\alpha\beta}=K_{smo} \cdot \text{sign}(\tilde{i}_{\alpha\beta}) ]
仿真一开始我也用 sign,结果发现输出反电动势抖振非常大。原因很简单:sign 函数在高增益情况下把任何微小的电流误差都放大到满幅,输出是一串高频方波,信号根本无法直接用。后面加低通滤波虽然能消掉一部分,但会把反电动势的相位延迟搞得很大,角度误差就越修越乱。
工程和仿真里更常用的是饱和函数 sat:
[ z_{\alpha\beta}=K_{smo} \cdot \text{sat}(\tilde{i}_{\alpha\beta}, \delta) ]
边界层厚度 ( \delta ) 越大,抖振越小,但估算精度会变差;太小又恢复到 sign 的抖振。我建议仿真里一开始先把 ( \delta ) 设大一点(比如额定电流的 5%),先把整个环路跑通,再慢慢减小。这个参数就是质量换抖动的典型代表,没有一个通吃值,必须先做扫描。
3.3 从反电动势到位置:用锁相环 PLL 而不是直接反正切
得到 ( e_\alpha )、( e_\beta ) 之后,最直观的做法是:
[ \hat{\theta} = \text{atan2}(-e_\alpha, e_\beta) ]
看起来简单,但直接反正切会被反电动势谐波干扰,角度波形会有毛刺。更重要的是,反电动势经过低通滤波之后有相位延迟,直接反正切得到的是“有延迟的角度”,在动态过程中会出现明显滞后,导致电流环解耦失败。
我的做法是:把反电动势先过一阶低通滤掉开关纹波,然后用 PLL 锁相环来追踪角度。PLL 的结构是:把 ( e_\alpha )、( e_\beta ) 和当前估算角度做一个 Park 变换,得到的 ( q ) 轴分量作为角度误差:
[ \varepsilon = -e_\alpha \cos\hat{\theta} - e_\beta \sin\hat{\theta} ]
然后过 PI 调节器,输出估算转速,再积分得到估算角度。PLL 的好处是它天然带滤波作用,相当于一个自适应的跟踪滤波器,能比直接反正切把角度搞得平滑得多,而且你可以通过调整 PLL 带宽来平衡动态和噪声。
3.4 SMO 参数调试的真正诀窍:三个环节分开调
我不太建议一上来就零散地调 SMO 的 6、7 个参数,那样很容易调死。我习惯把 SMO 调试分成三个环节:
- 第一环节只开电流滑模环:把反电动势输出接出来看波形。这时候即使角度不对也无所谓,你只要看到反电动势波形大概是两个正交的正弦波,且幅度随转速变化,说明滑模面收敛了。如果看到波形是杂乱的,先调 ( K_{smo} ) 和 ( \delta )。
- 第二环节调 PLL:反电动势波形正常后,把 PLL 接上。给一个固定转速指令,观察 PLL 输出的角度是否线性上升,转速估算值是否稳定。如果转速有震荡,调 PLL 带宽。
- 第三环节做斜坡加减速:让转速在整个中高速段内爬坡,观察角度误差和转速误差。这个阶段你会发现,SMO 在中高速段非常好使,但在 500 rpm 以下就逐渐崩溃,因为反电动势太小了。这就是我们为什么要加权切换的根本原因。
4. 加权切换策略:两套观测器如何在过渡区平滑交接
整个系统的难点和亮点其实都在这一节。注入法和 SMO 单独做都不难,难的是让它们自然衔接。
4.1 切换区间的权值设计:用转速归一化,还是用反电动势幅值?
常见做法是按转速划分区间。比如设定切换起始转速 ( \omega_1 )(低速段上限)和结束转速 ( \omega_2 )(中高速段下限):
[ k_{smo} = \frac{\omega_e - \omega_1}{\omega_2 - \omega_1} ]
[ k_{inj} = 1 - k_{smo} ]
然后把两套观测器的位置和转速按权重合成:
[ \theta_{est} = k_{inj} \cdot \theta_{inj} + k_{smo} \cdot \theta_{smo} ]
[ \omega_{est} = k_{inj} \cdot \omega_{inj} + k_{smo} \cdot \omega_{smo} ]
这个方法实现最简单,直观,但我必须提醒一个坑:转速在切换区间内可能因为负载突变、加减速出现波动,权值就跟着剧烈摆动,可能导致切换抖动。解决办法是加滞回,让切换区间上升和下降时使用不同的边界,避免在阈值附近反复横跳。
另一种更工程化的做法是用反电动势幅值作为切换依据。反电动势幅值直接反映了 SMO 在当前转速下的信号质量,低速时它弱,高速时它强。用反电动势幅值做归一化:
[ k_{smo} = \frac{|e_{smo}| - E_{min}}{E_{max} - E_{min}} ]
这样在空载和带载时会自动调整切换点,适应性更好。我仿真里通常先用转速法把整个系统跑通,再换成反电动势幅值法做优化。
4.2 切换抖动怎么来的:相位跳变、零点偏置和权值突变
真正导致切换抖动的有三个原因。
第一个原因是两套估算器之间可能存在固定的角度偏差。比如注入法估算的角度可能因为滤波器相位延迟而偏前或偏后,SMO 估算的角度可能因为低通滤波和 PLL 而滞后。如果两者差值在切换点处达到十几度,加权出来的角度就会在这里产生一个拐点。解决方法是做一次角度补偿,把其中一套估算器对齐到另一套,或者更严谨一点用离线辨识的方式标定两组角度偏差,在加权之前先做偏移补偿。
第二个原因是权值突变。如果你用 if-else 硬切换,在边界处角度直接从注入法跳到 SMO,电流环必然崩溃。要避免这个,唯一的方法是让切换区间足够宽,并且权值指令至少连续可导。很多仿真里直接把权值按线性渐变算,其实已经不错了。
第三个原因是零点偏置。高频注入法在低速时有一个比较小的角度估算噪声,SMO 在中高速时也有一个较小偏置。在切换中间区域时,两种噪声会叠加,最终电流里面会出现一个轻微的 2 倍频或电流环带宽附近的波动。要削弱这个,建议在权值合成之后再加一级带宽不高的角度低通或转速滤波。
4.3 仿真里怎么实现双观测器并行运行
仿真里做加权切换最容易犯的错是“只跑当前生效的观测器”。正确做法是:在低速段,让 SMO 也一直跑着,只不过不把它输出给电流环;在中高速段,也让注入法一直跑着,只是不参与闭环。只有这样,才能让两套估算器的状态(比如积分值、滤波器状态值)在切换点时刻是“热”的,不会在切换瞬间突然从零开始收敛。这个细节太重要了,我当年第一次做的时候就是图省事只运行一个,结果切换瞬间位置估计直接飞了。
具体在 Simulink 里,我会把两个观测器模块的输出都接到加权模块里,用切换信号参与计算输出。两个观测器使用的都是同一个电流采样值,它们并行跑,只是输出被忽略或加权。
4.4 加权切换和电流环的配合:一个容易被忽略的细节
很多人在切换时只盯着角度和转速,容易忽略电流环本身的状态。FOC 的电流环在运行过程中会根据位置估算不断更新积分器。如果切换瞬间角度有少量跳变,电流环的积分器会被重新励磁,产生一个电流冲击。
我的经验是:在切换区间内,适当调低电流环的比例增益或限制积分输出,或者给电流环指令加一个斜坡限幅,可以有效抑制角度跳变引起的电流冲击。当然这是启停阶段的凑法,长期运行还是要靠角度连续性本身解决。
5. Simulink 仿真搭建实录:从空白模型到全速域跑通
前面说了这么多原理,下面开始讲怎么在 Simulink 里把这个系统搭起来。我会按模块来拆,讲清楚每个模块在哪、参数怎么设、连线上有什么坑。
5.1 模型整体结构:五块模块的拼接逻辑
我的仿真模型分成五块:
- 电机本体与逆变器模块:用 Simulink 自带 PMSM 模型,或者自定义微分方程模型。电机参数放在一个 MATLAB 脚本里定义,方便批量修改。
- 电流采样与坐标变换:从电机测量端取出 ( i_a )、( i_b )、( i_c ),做 Clark、Park 变换。
- 电流环与指令生成:转速外环输出 ( i_q ) 指令,电流内环输出 ( v_d )、( v_q )。
- 双观测器模块:高频方波注入解调和 SMO 各自独立实现,输出角度和转速估算值。
- 加权切换与母线电压调制:根据当前转速计算权值,合成最终角度和转速,再送到坐标变换和观测器内部。
5.2 电机参数与逆变器参数设置参考
以下是我做全速域仿真时常用的一组参考参数,具体数值要根据你自己的电机调整,但数量级可以参考:
| 参数名称 | 参考数值 | 备注 |
|---|---|---|
| 直流母线电压 | 310 V | |
| 额定功率 | 2.2 kW | |
| 极对数 | 4 | |
| 定子电阻 | 0.958 Ω | SMO 鲁棒性与此相关 |
| 直轴电感 | 5.25 mH | |
| 交轴电感 | 12.04 mH | 凸极比 > 2,注入法好做 |
| 永磁磁链 | 0.1827 Wb | |
| 开关频率 | 10 kHz | |
| 注入频率 | 1 kHz | 开关频率的 1/10 |
| 注入幅值 | 30 V | 先按母线电压 10% 起调 |
| 切换起始转速 | 300 rpm | 约 10% 额定转速 |
| 切换结束转速 | 750 rpm | 约 25% 额定转速 |
这里要说明一下,凸极率 ( L_q / L_d ) 对高频注入法影响极大。如果你的电机是表贴式,凸极率接近 1,那高频注入法的信号会非常微弱,这时候要么加大注入电压,要么改用其他信号提取手段。我建议仿真时先把凸极率设成 2 以上,跑通之后再降到实际值看看效果。
5.3 高频注入模块在 Simulink 里的具体实现
高频注入模块我通常直接用 MATLAB Function 写成,不用零散的 Simulink 模块搭,因为这样改起来更快,逻辑也更清晰。
核心逻辑可以写成如下的伪代码:
function [theta_inj, omega_inj, eps] = high_freq_injection(...) % 用估算位置角做 Park 变换 id_est = cos(theta)*ialpha + sin(theta)*ibeta; iq_est = -sin(theta)*ialpha + cos(theta)*ibeta; % 方波半周期检测:根据三角载波符号切换保存值 if carrier>0 d_id = id_est - id_prev_pos; id_prev_pos = id_est; else d_id = id_est - id_prev_neg; id_prev_neg = id_est; end % 同理得到 d_iq % 解算误差信号 eps = d_iq * cos(theta) - d_id * sin(theta); % 具体形式按推导定 end注意这里的核心是半周期保存与差分。在 Simulink 里,载波信号可以从 PWM 发生器里引出,用它的符号来触发采样保持。我用 MATLAB Function 更省事,因为在 Simulink 上搭一堆采样保持模块反而容易引入代数环。
另外,高频注入模块的输入不应该是连续时间信号。我强烈建议整个模型都直接设置成定步长离散仿真,步长等于 PWM 周期,比如 1e-4 秒。这样你才能保证每个 PWM 周期只采样一次,不会出现奇奇怪怪的连续时间积分问题。
5.4 SMO 模块的离散化实现
SMO 模块也是用 MATLAB Function 或 S-Function 实现。离散化的关键是电流观测器的积分步骤。
假如电流估算方程为:
[ \frac{d\hat{i}\alpha}{dt} = -\frac{R_s}{L_s}\hat{i}\alpha + \frac{1}{L_s}v_\alpha - \frac{1}{L_s}z_\alpha ]
离散化之后写成:
z_alpha = K_smo * sat(i_alpha_est - i_alpha, delta); z_beta = K_smo * sat(i_beta_est - i_beta, delta); d_ialpha_est = -(Rs/Ls)*i_alpha_est + (1/Ls)*v_alpha - (1/Ls)*z_alpha; ialpha_est = ialpha_est + Ts * d_ialpha_est;这里的 ( z_\alpha ) 经过低通滤波得到 ( e_\alpha ),然后再送入 PLL。低通滤波器的截止频率要放在开关频率附近、信号基频和几十倍谐波之间。我一般第一版先取 500 Hz,根据波形细调。
注意离散化步长。如果你的仿真步长是 1e-4 秒,SMO 的状态更新也是 1e-4 秒,那这个观测器的等效动态带宽会受采样频率限制,不可能调到理想值。这也是我建议整个模型离散化和 PWM 同步的原因之一。
5.5 加权切换模块的 Simulink 连接方法
加权切换模块不需要复杂的算法,它就是一个权值计算和乘法加法:
- 输入当前估算转速 ( \omega_e )。
- 根据切换阈值 ( \omega_1 )、( \omega_2 ) 计算 SMO 权重 ( k_{smo} )。
- 带滞回处理:用触发条件记忆上一次状态,避免在阈值附近反复横跳。
- 计算最终角度和转速。
- 角度用一个重要处理:因为角度是周期性的,不能直接乘权重,要先做角度差归一化。比如:
delta_theta = wrapToPi(theta_smo - theta_inj); theta_est = theta_inj + k_smo * delta_theta;这样处理之后,角度加权就不会出现 358 度和 2 度平均出 180 度的鬼问题。这个细节非常重要,很多第一次做切换的人都会在这里栽跟头。
5.6 调试验证:低速启动、中速切换、高速稳态到全速域
仿真搭建完成后,我按以下顺序做验证:
- 零速启动:给一个 0 rpm 的转速指令,看估算位置能否静态收敛到正确位置附近。这叫“预定位”。我实测下来,高频方波注入加上合适的 PI 参数,能在 0.1 秒内收敛到 2 度以内。
- 低速段动态:给一个 100 rpm 的转速指令,让电机带载启动,看位置误差和转速误差。这个阶段主要调注入幅值和 PI 参数。
- 切换区间:给一个从 100 rpm 线性爬到 1000 rpm 的指令,观察权值从 1 变成 0 的过程。这里重点看切换区间内位置误差是否超过可接受范围、电流是否有畸变。
- 高速段动态:在 1000 rpm 以上做加减速,观察 SMO 的 PLL 带宽是否够用。
- 全速域往返:从 1000 rpm 减速回 0,再从 0 加速到 1000 rpm,验证反向切换的滞回是否正常。
这一套验证下来,基本能覆盖所有可能出问题的环节。
6. 常见问题与排查技巧实录
最后这部分是纯经验总结。我把这些年做这个方案的仿真和实际调试中容易踩到的典型问题整理成一个速查表。
6.1 启动瞬间位置发散,怎么排查
启动时位置发散的根源通常是解调信号没建立起来或者 PI 参数饱和。先别急着调 PI,先用示波器看解调出来的位置误差 ( \varepsilon ) 是否有稳定的小信号。如果 ( \varepsilon ) 是幅值很大且乱跳的噪声,检查注入幅值是否太小,采样时刻是否正确。如果 ( \varepsilon ) 信号正常但 PI 输出还是跑偏,检查 PI 的限幅和积分器清零逻辑。很多时候是 PI 的积分项在启动前已经积分了一堆初始误差,启动瞬间直接饱和,导致角度飞速旋转。解决方法是启动前给 PI 做一次清零。
6.2 注入电流纹波太大,电机噪声明显
仿真的电流纹波大,原因是注入幅值过高或者解调滤波带宽太宽。我在前面给的参考值是注入幅值 30V,如果母线电压只有 310V,这个幅值在电流里会产生大概 10%~20% 的纹波占比。实际调试时,可以用示波器看电流波形里的高频纹波幅度,目标控制在额定电流的 10% 以内。要是还有表现出的电磁噪声问题,就要考虑降低注入频率或采用随机脉宽调制来分散噪声频谱。
6.3 切换时刻出现明显的转矩波动
切换时刻转矩波动,第一检查角度连续性,第二检查转速估算连续性。角度连续性要看切换区间内 ( \theta_{est} ) 是否有跳变。我见过最常见的原因是角度加权写成:
theta_est = (1-k)*theta_inj + k*theta_smo;而没有用角度差归一化,导致切换区间内的角度发生了越来越大的偏移。改成theta_est = theta_inj + k * wrapToPi(theta_smo - theta_inj)后,问题通常立刻消解。
6.4 SMO 在中高速段突然发散
SMO 发散通常不是增益不够,而是反电动势估错了。常见原因是电机参数不准,尤其是定子电阻 ( R_s )。低温启动时定子电阻会变小,而你用的是常温值,导致滑模观测器在估算电流时用了错误的模型,长期积分后误差累积。仿真里可以故意把电阻调偏 20% 来观察 SMO 的鲁棒性。另一种发散原因是直流母线电压波动没有被补偿,导致指令电压不准确。解决办法是用实测母线电压除以额定母线电压的系数来修正指令电压。
6.5 低通滤波器导致角度滞后,要不要补偿
所有从反电动势提取位置的方案都会面临低通滤波器的相位滞后。SMO 的符号函数输出经过低通滤波后,反电动势相位会滞后,最终估算角度也会滞后。工程上常用角度前馈补偿:在得知滤波截止频率和当前转速的情况下,计算相位滞后量并加回角度上。
公式是:
[ \theta_{comp} = \arctan(\frac{\omega_e}{\omega_{lp}}) ]
这个补偿在转速升高时比较明显,在低速段反而不大。仿真里你可以直接把补偿加上,看电流波形是否变好。注意这里补偿是基于转速的,转速突变瞬间补偿量会跳变,反而带来新的误差。我一般会给补偿量也加滤波器,或者限制补偿变化率,就不会出现切换瞬间角度突跳了。
6.6 仿真跑得慢、出现代数环、步长敏感
很多人在 Simulink 里搭这种复杂模型会碰到两个烦人的问题:代数环和仿真步长敏感。
代数环是因为输出直接反馈到了同一个采样时刻的输入里。典型位置就是高频注入模块里,误差信号里同时使用了估算角度和真实电流,而估算角度又是由误差信号积分出来的,形成了隐含的代数依赖。解决方法是在电流采样环节加一个单位延迟(Unit Delay),或者把 PI 的积分状态单独取出来做反馈,避免同一仿真步内的瞬时反馈。
仿真步长敏感常常表现为:步长从 1e-4 改到 5e-5,结果波形完全不同。这通常说明模型中存在过高的微分增益或者某些模块没有正确离散化。我见过太多人把 SMO 写在连续时间模块里,却用离散步长仿真,结果积分环节每次都会引入误差。统一全部离散化,这个现象会大幅减少。
写在最后的个人体会
这套全速域方案做下来,我最大的感受是:真正值钱的部分根本不是某个观测器的公式推导,而是“两套观测器如何共同工作”。高频方波注入法的解调、SMO 的滑模面设计,这些单独拿出来都能找到很多资料,但当你把它们放进同一个系统里做加权切换时,才会遇到数不清的工程细节问题。角度差归一化、权重滞回、PI 状态同步、滤波相位补偿,每一样都决定了整个系统在切换区间的表现。
如果你正在做类似的无位置传感器控制仿真,我的建议是先把一套观测器彻底跑熟,再叠加另一套,最后再来处理切换。不要一上来就追求全速域闭环跑通,那只会让问题叠加在一起,难以定位。先低速跑稳,再中高速跑稳,再切换,这条路虽然慢,但每一步都是可控的。做完之后你会发现,这套方案在拓扑结构上并没有多深奥,真正的收获全都在调试细节里。