4. 电机控制基础:直流无刷电机(BLDC)的工作原理、三相六步换向控制
好,咱们进入正题。直流无刷电机,也就是 BLDC,现在几乎无处不在——无人机、电动车、硬盘、家电……你想想看,凡是需要安静、高效、长寿命的地方,基本都有它的身影。
有刷电机靠电刷换向,磨损大、有火花。BLDC 把电刷拿掉了,换向交给电子控制器。说白了,就是用电子开关代替机械接触。我刚开始接触 BLDC 时,总觉得它很神秘,后来拆了几个电机,拿示波器一测霍尔信号,嗯,其实核心逻辑并不复杂。
4.1 BLDC 的基本结构
一个典型的 BLDC 电机,由两部分组成:
- 定子:三组线圈,星形或三角形接法。线圈通电产生旋转磁场。
- 转子:永磁体(通常是钕铁硼),跟随磁场旋转。
定子线圈不通电时,转子可以自由转动。一旦通电,定子磁场就会“拽”着转子跑。这就是最根本的原理——磁场同步。
核心要点:BLDC 的转子是永磁体,定子是电磁铁。控制定子线圈的通电顺序和时机,就能让转子持续旋转。
4.2 三相六步换向——名字听着唬人,其实就六步
“三相”指的是三组线圈:U、V、W。“六步”指的是一个电周期内,换向状态切换六次。每次切换,改变两个线圈的通电方向和组合。
我画了一张图,帮你理解这六步是怎么走的:
你看,六步走完,转子刚好转了一个电周期。对于一对极的电机,这就是机械上的一整圈。多对极的电机,电周期会重复多次。
4.3 霍尔传感器的作用——告诉控制器“转子在哪”
换向的时机很关键。早了晚了,电机都会抖、发热、效率低。怎么知道什么时候该换?靠霍尔传感器。
霍尔传感器检测转子磁极的位置。三个霍尔元件(通常相隔 120° 电角度)输出三路高低电平信号。这三路信号组合起来,就是 6 种状态(对应六步)。
我的经验:霍尔信号是方波,但上升沿和下降沿不一定很陡。我建议在软件里做一下消抖,或者用施密特触发器整形。否则换向时机容易乱,电机低速时会“咔咔”响。
霍尔信号与换向步骤的对应关系,我整理了一张表:
| 霍尔状态 (H3 H2 H1) | 对应 Step | U 相 | V 相 | W 相 |
|---|---|---|---|---|
| 001 | Step 1 | + | - | 悬空 |
| 101 | Step 2 | + | 悬空 | - |
| 100 | Step 3 | 悬空 | + | - |
| 110 | Step 4 | - | + | 悬空 |
| 010 | Step 5 | - | 悬空 | + |
| 011 | Step 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 启动问题——从零速开始
电机静止时,霍尔信号可能处于任意状态。如果直接按霍尔信号换向,转子可能不转,或者往反方向转。
怎么办?我常用的方法是强制对齐:
- 给任意两相通电,让转子转到某个固定位置。
- 读取此时的霍尔状态,作为初始状态。
- 然后按正常六步换向启动。
强制对齐的时间一般 50-200ms。时间太短,转子没到位;时间太长,线圈会发热。我一般设 100ms,配合小电流(30% 占空比),效果不错。
避坑指南:我曾经在启动时没做强制对齐,直接读霍尔状态就换向。结果电机在某个位置卡死,电流飙升,差点烧了驱动板。从那以后,我每次启动都老老实实做对齐。
4.7 总结一下
三相六步换向,说白了就是:
- 用霍尔传感器感知转子位置。
- 根据位置查表,决定哪两相通电、电流方向如何。
- 每 60° 电角度换一次相。
- 用 PWM 调节转速。
这个控制方式简单可靠,是 BLDC 控制的基础。很多高级算法(比如 FOC)也是在这个基础上发展起来的。先把六步换向跑顺了,后面学什么都有底气。