4. 电机控制基础:直流无刷电机(BLDC)的工作原理、三相六步换向控制

好,咱们进入正题。直流无刷电机,也就是 BLDC,现在几乎无处不在——无人机、电动车、硬盘、家电……你想想看,凡是需要安静、高效、长寿命的地方,基本都有它的身影。

有刷电机靠电刷换向,磨损大、有火花。BLDC 把电刷拿掉了,换向交给电子控制器。说白了,就是用电子开关代替机械接触。我刚开始接触 BLDC 时,总觉得它很神秘,后来拆了几个电机,拿示波器一测霍尔信号,嗯,其实核心逻辑并不复杂。

4.1 BLDC 的基本结构

一个典型的 BLDC 电机,由两部分组成:

  • 定子:三组线圈,星形或三角形接法。线圈通电产生旋转磁场。
  • 转子:永磁体(通常是钕铁硼),跟随磁场旋转。

定子线圈不通电时,转子可以自由转动。一旦通电,定子磁场就会“拽”着转子跑。这就是最根本的原理——磁场同步。

核心要点:BLDC 的转子是永磁体,定子是电磁铁。控制定子线圈的通电顺序和时机,就能让转子持续旋转。

4.2 三相六步换向——名字听着唬人,其实就六步

“三相”指的是三组线圈:U、V、W。“六步”指的是一个电周期内,换向状态切换六次。每次切换,改变两个线圈的通电方向和组合。

我画了一张图,帮你理解这六步是怎么走的:

三相六步换向流程图 三相六步换向流程图 Step 1 U+ V- W悬空 Step 2 U+ V悬空 W- Step 3 U悬空 V+ W- Step 4 U- V+ W悬空 Step 5 U- V悬空 W+ Step 6 U悬空 V- W+ 说明: • 每个 Step 对应一个 60° 电角度区间。 • 每次只切换一个线圈的状态(从悬空变为通电,或改变电流方向)。 • 六个 Step 完成一个完整的电周期,转子旋转 360° 电角度。 • 对于一对极的电机,一个电周期对应机械旋转 360°;多对极则按比例折算。

你看,六步走完,转子刚好转了一个电周期。对于一对极的电机,这就是机械上的一整圈。多对极的电机,电周期会重复多次。

4.3 霍尔传感器的作用——告诉控制器“转子在哪”

换向的时机很关键。早了晚了,电机都会抖、发热、效率低。怎么知道什么时候该换?靠霍尔传感器。

霍尔传感器检测转子磁极的位置。三个霍尔元件(通常相隔 120° 电角度)输出三路高低电平信号。这三路信号组合起来,就是 6 种状态(对应六步)。

我的经验:霍尔信号是方波,但上升沿和下降沿不一定很陡。我建议在软件里做一下消抖,或者用施密特触发器整形。否则换向时机容易乱,电机低速时会“咔咔”响。

霍尔信号与换向步骤的对应关系,我整理了一张表:

霍尔状态 (H3 H2 H1) 对应 Step U 相 V 相 W 相
001Step 1+-悬空
101Step 2+悬空-
100Step 3悬空+-
110Step 4-+悬空
010Step 5-悬空+
011Step 6悬空-+

注意,霍尔状态是循环的。每次霍尔信号变化,就触发一次换向。这就是“霍尔换向”的基本逻辑。

4.4 六步换向的代码实现——以 STM32 为例

我习惯用状态机来实现换向。每次霍尔中断来了,读一次霍尔值,查表,更新 PWM 输出。

// 霍尔状态到换向表的映射
const uint8_t hall_to_step[8] = {
    0,  // 000 - 无效
    1,  // 001 - Step 1
    2,  // 010 - Step 5
    3,  // 011 - Step 6
    4,  // 100 - Step 3
    5,  // 101 - Step 2
    6,  // 110 - Step 4
    0   // 111 - 无效
};

// 换向表:每个 Step 对应的三相 PWM 输出
// 格式:{U相, V相, W相}  0=悬空, 1=高, 2=低
const uint8_t step_pwm[7][3] = {
    {0, 0, 0},  // 无效
    {1, 2, 0},  // Step 1
    {1, 0, 2},  // Step 2
    {0, 1, 2},  // Step 3
    {2, 1, 0},  // Step 4
    {2, 0, 1},  // Step 5
    {0, 2, 1}   // Step 6
};

// 霍尔中断服务函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
    uint8_t hall_val;
    uint8_t step;
    
    // 读取三个霍尔引脚
    hall_val = (HAL_GPIO_ReadPin(HALL3_GPIO_Port, HALL3_Pin) << 2) |
               (HAL_GPIO_ReadPin(HALL2_GPIO_Port, HALL2_Pin) << 1) |
                HAL_GPIO_ReadPin(HALL1_GPIO_Port, HALL1_Pin);
    
    // 查表得到当前 Step
    step = hall_to_step[hall_val];
    
    if (step == 0) {
        // 无效状态,关闭所有 PWM
        // 我个人习惯在这里加一个错误计数器
        return;
    }
    
    // 更新 PWM 输出
    set_motor_pwm(step_pwm[step][0], step_pwm[step][1], step_pwm[step][2]);
}

注意:霍尔信号在换向瞬间可能会有抖动。我曾经遇到过电机高速运行时,霍尔信号出现毛刺,导致换向表查错,电机突然抖动。解决方案是:在中断里加一个 5-10μs 的消抖延时,或者用硬件滤波。

4.5 换向时序与 PWM 调制

六步换向只是基础。实际控制中,我们还需要调节转速。怎么调?通过 PWM 调制。

在每个 Step 内,对通电的两个线圈施加 PWM 信号。占空比越大,平均电压越高,转速越快。占空比为零,电机停转。

常见的调制方式有两种:

  • 上管 PWM,下管常通:简单,但下管一直导通,发热大。
  • 上下管互补 PWM:效率高,但需要加死区时间,防止上下管直通。

我个人更推荐第二种。虽然代码复杂一点,但电机发热小,效率高。死区时间一般设 1-2μs,具体看 MOSFET 的开关速度。

4.6 启动问题——从零速开始

电机静止时,霍尔信号可能处于任意状态。如果直接按霍尔信号换向,转子可能不转,或者往反方向转。

怎么办?我常用的方法是强制对齐:

  1. 给任意两相通电,让转子转到某个固定位置。
  2. 读取此时的霍尔状态,作为初始状态。
  3. 然后按正常六步换向启动。

强制对齐的时间一般 50-200ms。时间太短,转子没到位;时间太长,线圈会发热。我一般设 100ms,配合小电流(30% 占空比),效果不错。

避坑指南:我曾经在启动时没做强制对齐,直接读霍尔状态就换向。结果电机在某个位置卡死,电流飙升,差点烧了驱动板。从那以后,我每次启动都老老实实做对齐。

4.7 总结一下

三相六步换向,说白了就是:

  • 用霍尔传感器感知转子位置。
  • 根据位置查表,决定哪两相通电、电流方向如何。
  • 每 60° 电角度换一次相。
  • 用 PWM 调节转速。

这个控制方式简单可靠,是 BLDC 控制的基础。很多高级算法(比如 FOC)也是在这个基础上发展起来的。先把六步换向跑顺了,后面学什么都有底气。