3. 三相六步换相控制:六步换相逻辑、PWM调制策略

好,咱们今天聊聊BLDC控制里最经典、也是最基础的一个环节——六步换相

很多刚入行的朋友,一上来就盯着FOC(磁场定向控制)看,觉得六步换相太简单。其实不然。我做了这么多年电机控制,可以负责任地告诉你:六步换相是理解无传感器控制的基石。你连这个都搞不清楚,后面那些高级算法根本玩不转。

3.1 六步换相逻辑:说白了就是“谁通电,谁断电”

BLDC电机为什么能转?说白了,就是定子线圈得按顺序通电,产生旋转磁场,拖着转子跑。六步换相,就是把一个电周期分成6个阶段,每个阶段只给两相线圈通电,另一相悬空。

我习惯把这三相叫做A、B、C。每个阶段,电流从一相流进去,从另一相流出来。比如:

  • Step 1:A+进,B-出,C悬空
  • Step 2:A+进,C-出,B悬空
  • Step 3:B+进,C-出,A悬空
  • Step 4:B+进,A-出,C悬空
  • Step 5:C+进,A-出,B悬空
  • Step 6:C+进,B-出,A悬空

你看,是不是很简单?每60°电角度换一次相,转一圈就是6步。但这里有个坑——换相时机。换早了,电流还没建立起来;换晚了,转矩就掉下去了。我在项目中遇到过,换相点偏了5°电角度,电机就开始抖,效率直接掉了10%。

核心要点:六步换相的本质,就是让定子磁场始终领先转子磁场60°~120°电角度,这样才能产生最大平均转矩。

3.2 PWM调制策略:上桥调制 vs 下桥调制

光有换相逻辑还不够,你还得控制转速和转矩。这就得靠PWM了。PWM调制策略,说白了就是“谁在斩波,谁在常通”。

常见的策略有两种:上桥调制下桥调制。我一个个说。

3.2.1 上桥调制(High-side Modulation)

上桥调制,就是上桥臂的MOS管做PWM斩波,下桥臂的MOS管一直导通。举个例子,在Step 1(A+进,B-出)时:

  • A相上桥:PWM斩波
  • B相下桥:常通
  • C相:全关

这种策略的好处是:电流纹波小,因为PWM斩波在上桥,下桥一直通着,电流路径比较稳定。但缺点也很明显——上桥MOS管的开关损耗大,而且需要自举电路来驱动上桥。

我的经验:上桥调制适合低速、大转矩的场景。比如电动工具、机器人关节,这些地方对转矩响应要求高,电流纹波小能减少噪音。

3.2.2 下桥调制(Low-side Modulation)

下桥调制正好反过来:下桥臂做PWM斩波,上桥臂常通。还是Step 1的例子:

  • A相上桥:常通
  • B相下桥:PWM斩波
  • C相:全关

这种策略的好处是:驱动电路简单,下桥MOS管可以直接用低边驱动,不需要自举。但电流纹波会大一些,因为PWM斩波在下桥,电流路径会经过电机绕组和地,容易引入共模干扰。

注意:下桥调制在高速时容易出问题。我记得有一次做高速吹风机的项目,用下桥调制,转速一上2万转,电流波形就开始抖。后来换成上桥调制,问题就解决了。所以,高速场景我建议用上桥调制。

3.2.3 混合调制(Complementary Modulation)

还有一种更高级的——混合调制。就是上下桥都做PWM,但相位互补。比如上桥PWM占空比70%,下桥就是30%。这种策略能进一步减小电流纹波,但控制逻辑复杂,而且上下桥容易直通,死区时间得算好。

我个人不太推荐新手用混合调制。除非你特别清楚自己在做什么,否则老老实实用上桥或下桥调制就行。

3.3 换相时序图:一张图看懂所有

说了这么多,不如一张图来得直观。下面这张SVG图,展示了六步换相的逻辑和PWM调制策略的对应关系。

六步换相时序图(上桥调制示例) 电角度 0°~60° 60°~120° 120°~180° 180°~240° 240°~300° 300°~360° A相 上桥PWM 上桥PWM 下桥常通 下桥常通 B相 下桥常通 上桥PWM 下桥常通 C相 上桥PWM 下桥常通 上桥PWM 换相点 换相点 换相点 换相点 换相点 上桥PWM 下桥常通 上桥PWM 下桥常通 上桥PWM 下桥常通 注:悬空相(未导通)在图中未显示,实际为高阻态。 每个换相点对应一次霍尔信号变化(或反电动势过零点)。 公众号:蓝海资料掘金营,微信deep3321

这张图里,我用了上桥调制作为例子。你看,每个60°区间内,只有一相的上桥在做PWM,另一相的下桥常通,第三相悬空。换相点就是那些虚线位置,每到这个点,你就得重新配置MOS管的开关状态。

一个小技巧:实际写代码时,我习惯把6个换相状态做成一个查表数组。每次换相,直接查表更新PWM寄存器和GPIO状态。这样效率高,也不容易出错。

3.4 代码示例:六步换相状态机

下面是一个简单的状态机实现,用C语言写的。你可以在STM32或者任何MCU上跑。

// 六步换相状态表(上桥调制)
// 结构:{上桥A, 下桥A, 上桥B, 下桥B, 上桥C, 下桥C}
// 1 = 导通,0 = 关闭,PWM = 2(表示PWM调制)
const uint8_t commutation_table[6][6] = {
    {2, 0, 0, 1, 0, 0},  // Step 1: A上桥PWM, B下桥通
    {2, 0, 0, 0, 0, 1},  // Step 2: A上桥PWM, C下桥通
    {0, 1, 2, 0, 0, 0},  // Step 3: B上桥PWM, A下桥通
    {0, 0, 2, 0, 0, 1},  // Step 4: B上桥PWM, C下桥通
    {0, 1, 0, 0, 2, 0},  // Step 5: C上桥PWM, A下桥通
    {0, 0, 0, 1, 2, 0}   // Step 6: C上桥PWM, B下桥通
};

// 换相状态机
void commutation_step(uint8_t step) {
    if (step > 5) return;  // 防止越界
    
    // 更新PWM和GPIO
    for (int i = 0; i < 6; i++) {
        switch (commutation_table[step][i]) {
            case 0:  // 关闭
                set_mosfet_off(i);
                break;
            case 1:  // 常通
                set_mosfet_on(i);
                break;
            case 2:  // PWM调制
                set_mosfet_pwm(i, current_duty_cycle);
                break;
        }
    }
    
    // 记录当前步数
    current_step = step;
}

这段代码很简单,但很实用。你只需要在每次检测到换相信号(比如霍尔信号变化或反电动势过零点)时,调用commutation_step()函数,传入下一步的索引就行。

注意:换相时一定要加死区时间!我见过有人忘了加,结果上下桥直通,MOS管直接冒烟。死区时间一般设1~3微秒,具体看你的MOS管开关速度。

3.5 避坑指南:我踩过的几个坑

最后,分享几个我实际项目中踩过的坑,希望能帮你少走弯路。

  • 换相点不准:我曾经用反电动势法做无传感器控制,换相点总是偏。后来发现是滤波电容太大,导致过零点延迟了。解决办法是减小滤波电容,或者软件里做相位补偿。
  • PWM频率太低:有次做无人机电调,PWM频率设了8kHz,结果电机嗡嗡响。后来换成16kHz,噪音就没了。人耳对8kHz比较敏感,建议PWM频率设在16kHz以上。
  • 死区时间不够:这个前面说了,死区时间不够,MOS管直通,发热严重。我建议至少设1.5微秒,安全第一。
  • 悬空相处理不当:悬空相不是真的“什么都不做”。你得把它的上下桥都关掉,并且把ADC引脚配置成高阻态,否则会有漏电流。

好了,六步换相的内容就这些。你想想看,是不是比想象中简单?但简单归简单,细节决定成败。下一节咱们聊聊更高级的——无传感器位置检测,那才是真正考验功力的时候。


公众号:蓝海资料掘金营,微信deep3321