3、换相逻辑与初始位置检测:六步换相法、基于反电动势的零速启动、高频注入法原理

这一章,我们聊聊电机启动时最头疼的问题——转子初始位置检测。

说白了,就是电机刚上电那一刻,你根本不知道转子朝哪个方向。如果直接上电乱转,轻则抖动,重则反转甚至烧驱动。我刚开始做无刷电机驱动时,就吃过这个亏。那次调试,电机一上电就“嗡嗡”响,然后猛地反转,差点把联轴器甩飞。嗯,从那以后,我再也不敢跳过初始位置检测了。

本章我会把三种主流方法讲透:六步换相法、基于反电动势的零速启动、高频注入法。它们各有适用场景,没有银弹。

核心观点:初始位置检测的精度,直接决定了换相逻辑能否正确执行。位置偏差超过30°电角度,电机大概率会失步。

初始位置检测方法对比 初始位置检测 六步换相法 反电动势零速启动 高频注入法 开环强拖 适合低速/轻载 实现最简单 利用BEMF过零点 需要电机旋转 中高速才可靠 注入高频信号 零速/静止可检测 计算量大 风扇、水泵等轻载 高速风机、电动工具 伺服、机器人关节

3.1 六步换相法:最朴素的启动方式

六步换相法,也叫梯形波控制。它的思路很简单:不管转子在哪,我先按固定顺序给绕组通电,强行把转子拖到预定位置。

具体怎么做?

  1. 预定位:给任意两相通电,产生一个固定磁场,把转子拉到已知位置。比如A+B-,转子会停在某个电角度。
  2. 强制换相:按A+B- → A+C- → B+C- → B+A- → C+A- → C+B-的顺序,每步持续一段时间(比如10ms),让转子跟着转。
  3. 检测反电动势:当转速起来后,通过反电动势过零点判断转子位置,切换到闭环控制。

我的经验:预定位这一步很关键。如果负载惯性大,预定位时间要拉长,否则转子还没到位就换相,容易失步。我一般给50-100ms的预定位时间。

六步换相法的优缺点很明显:

优点 缺点
实现简单,不需要位置传感器 低速时转矩脉动大
适合轻载启动(风扇、水泵) 重载或大惯性负载容易失步
代码量小,适合低端MCU 无法精确控制位置

代码实现也很直接:

// 六步换相表:A B C 三相的PWM占空比
// 1表示高电平,-1表示低电平,0表示悬空
const int step_table[6][3] = {
  { 1, -1,  0},  // Step 0: A+B-
  { 1,  0, -1},  // Step 1: A+C-
  { 0,  1, -1},  // Step 2: B+C-
  {-1,  1,  0},  // Step 3: B+A-
  {-1,  0,  1},  // Step 4: C+A-
  { 0, -1,  1}   // Step 5: C+B-
};

void six_step_run(int step, int duty) {
  // 根据step_table设置三相PWM
  set_pwm(step_table[step][0] * duty,
          step_table[step][1] * duty,
          step_table[step][2] * duty);
}

注意:六步换相法在切换瞬间会产生较大的电流尖峰。我建议在换相时插入死区时间(比如2-5μs),避免上下桥臂直通。

3.2 基于反电动势的零速启动

这个方法利用了电机旋转时产生的反电动势(BEMF)。你想想看,转子转起来后,不通电的那一相会感应出电压。通过检测这个电压的过零点,就能知道转子位置。

但有个问题——零速时没有反电动势。所以这种方法本质上不是“零速启动”,而是“先拖起来再检测”。

具体流程:

  1. 开环强拖:先用六步换相法把电机拖到一定转速(比如500RPM)。
  2. 检测BEMF:在悬空相上检测反电动势,找到过零点。
  3. 切换闭环:根据BEMF过零点推算转子位置,切换到SVPWM闭环控制。

我在项目中遇到过一个问题:BEMF信号噪声很大,直接过零检测会误触发。后来加了低通滤波和滞回比较器,才稳定下来。

关键参数:BEMF检测的阈值通常设置为母线电压的一半。但实际中由于PWM开关噪声,建议用分压电阻+RC滤波,截止频率设在1-3kHz。

BEMF检测的硬件电路通常是这样:

// 伪代码:BEMF过零检测
// 假设当前是A+B-,检测C相电压
float bemf_c = read_adc(PIN_C);  // 读取C相电压
float neutral = (v_a + v_b) / 2; // 虚拟中性点电压
if (bemf_c > neutral + threshold) {
  // 检测到过零点
  zero_cross_flag = 1;
}
参数 推荐值 说明
强拖频率 10-30Hz 对应300-900RPM(4对极)
BEMF采样窗口 PWM周期中间点 避开开关噪声
滞回比较阈值 50-100mV 防止噪声误触发

我的习惯:强拖阶段用较低的PWM频率(比如10kHz),减少开关损耗。切换到闭环后再提高到20kHz以上。

3.3 高频注入法:零速也能精确检测

前面两种方法都有个共同缺点——需要电机转起来。但有些场合(比如伺服、机器人关节),要求电机在静止状态下就知道转子位置。这时候就要用高频注入法了。

原理其实不复杂。电机定子绕组有电感,而电感值会随转子位置变化。我注入一个高频电压信号(比如500Hz-2kHz),然后检测电流响应。通过分析电流的幅值或相位,就能反推出转子位置。

具体分两种:

  • 旋转高频注入:在静止坐标系注入旋转高频电压,检测电流的负序分量。
  • 脉振高频注入:在估计的d轴注入脉振电压,检测q轴电流响应。

我个人更常用脉振高频注入,因为它对凸极率要求没那么高,而且实现起来更直接。

核心公式(简化版):

// 脉振高频注入
// 在估计d轴注入高频电压
v_dh = V_inj * sin(ω_h * t);
v_qh = 0;

// 检测q轴高频电流响应
i_qh = low_pass_filter(i_q * sin(ω_h * t));

// 位置误差信号
ε = i_qh;  // 当ε=0时,估计位置=实际位置

// PI调节器跟踪位置
ω_est = Kp * ε + Ki * ∫ε dt;
θ_est = ∫ω_est dt;

重要:高频注入法依赖电机的凸极效应(Ld ≠ Lq)。如果电机是表贴式(SPM),凸极率接近1,高频注入效果会很差。这时候可以考虑用旋转高频注入或其它方法。

三种方法的对比总结:

方法 零速检测 精度 计算量 适用场景
六步换相法 否(需预定位) 低(±30°) 低 风扇、水泵
反电动势法 否(需强拖) 中(±10°) 中 高速风机、电动工具
高频注入法 是 高(±5°) 高 伺服、机器人

避坑指南:我曾经在一个项目里用高频注入法,结果电机嗡嗡响就是不转。查了半天发现是注入频率和PWM频率产生了差拍噪声。后来把注入频率设为PWM频率的1/10,问题解决。

最后说一句:没有万能的方法。选哪种,取决于你的负载特性、成本预算和精度要求。做产品不是发论文,稳定可靠比花哨更重要。