3、三段式启动法:对齐、开环加速、切换至闭环
无感启动这个话题,我最早接触是在做一款工业风机驱动的时候。当时客户要求电机必须能在满载下平稳启动,不能有反转,也不能有剧烈抖动。我试了好几种方案,最后发现最靠谱的,还是今天要讲的这个三段式启动法。
说白了,三段式就是把启动过程拆成三个明确的阶段:对齐、开环加速、切换至闭环。每个阶段干一件事,互不干扰。你想想看,如果一上来就让无感算法去猜转子位置,那基本是猜不准的——电机静止时反电动势为零,观测器根本没法工作。所以必须先用外力手段把转子“摆正”,再慢慢推起来,等速度够了再交给闭环。
核心思想: 在低速段用开环强制手段建立旋转,在中高速段切换回基于反电动势的闭环观测。三个阶段各司其职,缺一不可。
3.1 第一阶段:对齐(Align)
对齐的目的很简单——让转子停在一个已知的电气角度上。我习惯的做法是:给电机施加一个固定的电压矢量,持续一段时间,让转子被磁拉力拖到该矢量对应的位置。
举个例子,如果你给 A 相和 B 相通电,合成磁动势会指向某个固定方向。转子为了最小化磁阻,会自动转到这个方向。这个过程不需要任何传感器,也不需要知道转子当前在哪。
这里有几个关键参数需要设置:
- 对齐电压幅值:不能太大,否则会产生过大的冲击电流;也不能太小,否则拖不动转子。我一般取额定电压的 10%~20%。
- 对齐持续时间:取决于负载惯量。轻载 100ms 足够,重载可能需要 500ms 甚至更长。我在做电梯门机时遇到过负载惯量特别大的情况,对齐时间设到了 1 秒才稳定。
- 对齐方向:通常选 0° 电气角对应的矢量。这样后续开环加速的起始角度就是已知的。
注意: 对齐阶段转子会实际转动。如果应用场景不允许转子有任何位移(比如某些精密定位设备),那这个方法就不适用了。这种情况下可以考虑高频注入法,但那是另一个话题了。
3.2 第二阶段:开环加速(Open-Loop Ramp-Up)
对齐完成后,转子停在已知位置。接下来我们要让它转起来。但这时候反电动势还很弱,观测器依然不可靠。所以只能采用开环方式——我们主动控制定子磁场的旋转速度和方向,让转子跟着跑。
开环加速的核心是:给定一个频率逐渐升高的电流矢量,让定子磁场匀速旋转,转子被拖着同步加速。
我常用的实现方式是这样的:
// 开环加速伪代码
theta_openloop = theta_align; // 从对齐角度开始
for (speed_cmd = speed_min; speed_cmd < speed_switch; speed_cmd += ramp_rate) {
theta_openloop += speed_cmd * dt; // 累加角度
// 根据 theta_openloop 计算三相占空比
// 输出 PWM
delay(dt);
}
这段代码看起来简单,但实际工程中坑不少。我列几个常见的:
- 加速度不能太快:如果频率上升率超过转子的跟随能力,就会失步。失步后电机可能剧烈抖动甚至反转。我一般把加速度控制在 50~200 Hz/s 之间,具体看负载。
- 电流幅值要适当补偿:开环阶段没有速度闭环,负载变化时电流不会自动调整。如果负载突然增大,电流不够就会失步。我习惯在开环阶段把电流设定为额定电流的 1.2~1.5 倍,留点余量。
- 起始频率不能太高:从零直接跳到一个较高的频率,转子根本反应不过来。起始频率我通常设在 5~10 Hz 电气频率。
我的经验: 开环加速阶段最容易出问题的是重载启动。我曾经做过一个压缩机项目,负载惯量很大,开环加速时总是失步。后来我把加速度降到了 30 Hz/s,同时把电流限幅提高到了 1.8 倍额定电流,才稳定下来。调试时建议用示波器观察相电流波形,如果出现明显的畸变或幅值波动,基本就是失步的前兆。
3.3 第三阶段:切换至闭环(Handover to Closed-Loop)
当开环加速把电机推到一定速度后,反电动势已经足够强,观测器可以稳定工作了。这时候就要从开环切换到闭环。这个切换过程如果处理不好,轻则速度波动,重则直接停机。
切换的关键在于:开环角度和闭环观测角度必须平滑衔接。
我见过很多新手直接写:
// 错误做法:直接切换
if (speed >= speed_switch) {
theta_use = theta_observer; // 突然切换,角度可能跳变
}
这样做的后果是:开环角度和观测角度之间存在偏差,突然切换相当于给电机一个角度阶跃,电流会瞬间失控。
正确的做法是做一个渐进式切换:
// 渐进切换:角度融合
if (speed >= speed_switch_low) {
// 在 speed_switch_low 到 speed_switch_high 之间线性融合
k = (speed - speed_switch_low) / (speed_switch_high - speed_switch_low);
k = clamp(k, 0.0, 1.0);
theta_use = (1 - k) * theta_openloop + k * theta_observer;
}
这样,在切换区间内,实际使用的角度是从开环角度平滑过渡到观测角度的。即使两者有偏差,也不会造成冲击。
切换速度点的选择也很重要。我一般这样设置:
| 参数 | 推荐值 | 说明 |
|---|---|---|
| 切换起始速度 | 额定转速的 5%~10% | 反电动势已可观测,但信噪比还不高 |
| 切换结束速度 | 额定转速的 10%~20% | 观测器已稳定,可以完全信任 |
| 切换时间窗口 | 100~500 ms | 取决于速度上升率和负载惯量 |
特别提醒: 切换完成后,一定要检查观测角度和开环角度的偏差。如果偏差超过 30° 电气角,说明开环加速阶段可能已经失步了,或者观测器参数没调好。这种情况下即使切换成功,后续闭环运行也会不稳定。我习惯在切换完成后记录一次角度偏差,如果偏差过大就报错停机。
3.4 三段式启动的完整流程
下面这张图把整个三段式启动的流程串起来了。你可以看到每个阶段的输入、输出和判断条件。
3.5 实际工程中的几个坑
三段式启动法看起来逻辑清晰,但实际调试时总会遇到各种意外。我把自己踩过的坑分享给你:
- 对齐时转子抖动:如果对齐电压矢量给的太短,转子还没稳定就进入开环加速,启动瞬间会抖动。解决办法是延长对齐时间,或者增加对齐电压的幅值。
- 开环加速时电流失控:这通常是因为加速度太快,转子失步了。我遇到过一种特殊情况——负载突然变化(比如风机启动时风阻突然增大),电流来不及响应。后来我在开环阶段加了一个电流环,虽然精度不高,但至少能限幅。
- 切换瞬间速度跌落:开环角度和观测角度偏差较大时,切换瞬间电机会减速甚至停转。我的解决方法是:在切换前先让观测器运行一段时间,但不参与控制,只记录角度偏差。如果偏差太大,就延长切换窗口或者调整观测器参数。
- 重载启动失败:负载惯量大的场合,开环加速阶段很容易失步。我建议在开环阶段使用 I/f 控制(电流-频率控制)而不是 V/f 控制,因为 I/f 控制对负载变化的鲁棒性更好。
一个小技巧: 调试三段式启动时,我习惯在代码里加一个调试模式——把开环角度、观测角度、实际使用的角度都通过 DAC 输出到示波器。这样一眼就能看出切换过程是否平滑。如果两条曲线在切换点附近有跳变,那就是参数没调好。
三段式启动法虽然经典,但也不是万能的。它最大的局限是:开环阶段无法感知转子实际位置,一旦失步就无法恢复。所以对于负载变化剧烈或要求极高可靠性的场合,可能需要更高级的启动策略。不过话说回来,对于大多数风机、泵类、压缩机等应用,三段式启动法已经足够成熟和可靠了。