4. 开环到闭环切换:切换时机判断、相位对齐策略、平滑过渡算法

好,咱们进入第四章。这一章,说实话,是FOC启动里最容易出问题的地方。

开环跑得好好的,一切换到闭环,电机突然抖一下,甚至直接失步。我早期做项目时,就被这个问题折磨过好几个通宵。后来慢慢摸透了里面的门道,今天全部分享给你。

4.1 切换时机判断:什么时候该切?

开环启动,说白了就是强行拖着电机转。但你不能一直拖下去。什么时候放手让闭环接管?这里有几个关键判断依据。

4.1.1 转速条件

最核心的条件:电机转速必须足够高。高到什么程度?我个人习惯是,至少达到目标转速的 10%-20%。

举个例子,目标转速 3000 RPM,那开环至少要跑到 300-600 RPM 才能考虑切换。转速太低,反电动势信号太弱,观测器根本算不准位置。

核心原则: 切换时的转速,必须保证反电动势幅值 > ADC 能分辨的最小电压。

4.1.2 电流稳定度

光看转速还不够。你还要看电流环是否稳定。怎么判断?看 Iq 电流的波动。

我在项目中遇到过,转速到了,但 Iq 电流像过山车一样上下乱窜。这时候强行切换,必死无疑。

判断标准:

  • Iq 电流波动 < ±5% 额定电流
  • 持续稳定时间 > 50ms(至少 3-5 个电周期)

4.1.3 时间保护

嗯,这里要注意。加一个超时保护。如果开环运行超过设定时间(比如 2 秒)还没达到切换条件,果断报错停机。

为什么?因为可能是堵转了。你想想看,电机堵在那里,你还一直开环强拖,电流会飙升,MOS管分分钟烧掉。

避坑指南: 我曾经因为没加超时保护,连续烧了 3 块驱动板。后来学乖了,所有项目必加超时保护,而且时间设得保守一点。

4.2 相位对齐策略:让开环和闭环「对上眼」

开环运行时,你给的是一个虚拟角度。闭环运行时,用的是真实角度。这两个角度如果不一致,切换瞬间转子位置会突变,电机就会抖。

说白了,相位对齐就是让虚拟角度和真实角度「握手」。怎么握?

4.2.1 开环角度跟踪

开环运行时,实时记录你给的虚拟角度 θ_open。同时,用观测器(比如滑模观测器)估算真实角度 θ_est。

关键来了:在切换前,不断比较这两个角度。如果偏差太大,说明开环和闭环「没对上眼」,不能切。

// 相位对齐检查伪代码
if (abs(θ_open - θ_est) > THRESHOLD_ANGLE) {
    // 偏差太大,继续开环运行
    // 可以微调开环频率,让电机跟上
} else {
    // 角度对齐,准备切换
    ready_to_switch = true;
}

4.2.2 强制对齐法

如果角度偏差一直降不下来怎么办?我有个土办法,但很管用。

在切换前,让电机在当前位置停留 100-200ms。这时候观测器会收敛到真实位置。然后,把开环角度强制设置为观测器角度。

小技巧: 强制对齐时,电流环要切换到弱磁模式,防止电流过冲。我一般把 Iq 限幅降到 30%。

4.2.3 渐进式对齐

对于要求高的场合,可以用渐进式对齐。就是让开环角度慢慢「靠拢」到观测器角度。

比如每 10ms 调整 1 度,这样电机感觉不到突变。我做过测试,这种方法切换时的抖动最小。

4.3 平滑过渡算法:让切换「无感」

好,时机到了,角度也对齐了。怎么切?直接一刀切?不行。要平滑过渡。

4.3.1 权重过渡法

我最常用的方法。切换时,开环和闭环的权重慢慢变化。

// 权重过渡算法
float weight_open = 1.0f;
float weight_close = 0.0f;
float step = 0.01f;  // 每次调整步长

for (int i = 0; i < 100; i++) {
    // 最终角度 = 开环角度 * 权重 + 闭环角度 * 权重
    θ_final = θ_open * weight_open + θ_est * weight_close;
    
    // 更新权重
    weight_open -= step;
    weight_close += step;
    
    delay_ms(1);  // 过渡时间约 100ms
}

你看,这样角度是慢慢过渡的,电机根本感觉不到切换。

4.3.2 电流缓冲

角度过渡的同时,电流也要缓冲。切换瞬间,把 Iq 参考值降低到当前值的 70%,然后慢慢恢复到目标值。

为什么?因为开环和闭环的电流环参数可能不同。直接切,电流会突变。我见过有人切换时电流从 1A 直接跳到 5A,电机差点飞出去。

过渡时间参考:
电机类型 角度过渡时间 电流缓冲时间
小型无人机电机 50-80ms 30-50ms
工业伺服电机 100-200ms 50-100ms
大功率轮毂电机 200-500ms 100-200ms

4.3.3 状态机管理

最后,用状态机来管理整个切换过程。我习惯分 4 个状态:

  1. STATE_OPEN_LOOP:纯开环运行
  2. STATE_ALIGNING:相位对齐中
  3. STATE_TRANSITION:平滑过渡中
  4. STATE_CLOSED_LOOP:纯闭环运行

每个状态都有进入条件和退出条件。这样逻辑清晰,不容易出 bug。

避坑指南: 我曾经在状态机里忘了加「超时退出」逻辑。结果有一次电机卡在 STATE_ALIGNING 状态,一直出不来。后来加了看门狗定时器,每个状态都有最大停留时间。

4.4 实战经验总结

说了这么多,给你总结几条实战经验:

  • 切换前一定要确认角度对齐,偏差超过 5 度就别切
  • 过渡时间宁长勿短,100ms 过渡比 10ms 过渡安全得多
  • 电流限幅要降低,切换瞬间电流容易过冲
  • 加超时保护,防止死锁

嗯,这一章的内容就这些。下一章我们讲「低速重载启动策略」,那又是另一个坑。到时候见。