2、霍尔传感器与换相:从物理原理到6步换相法
霍尔传感器,说白了就是无刷电机控制里最常用的位置检测器件。它便宜、可靠、响应快,在电动自行车、无人机、工业风扇里随处可见。我最早接触霍尔换相是在做一款低压伺服项目时,当时被霍尔信号的抖动折腾得不轻——嗯,这个坑后面会细说。
2.1 霍尔效应原理
霍尔效应的核心其实很简单:通电导体在磁场中会产生横向电压。你想想看,当电流流过霍尔元件,外部磁场垂直穿过它,洛伦兹力会把载流子推向一侧,于是在元件两侧就出现了电势差——这个电势差就叫霍尔电压。
霍尔电压的大小由三个因素决定:
- 磁场强度:磁场越强,电压越大
- 通过电流:电流越大,电压越大
- 元件厚度:越薄越灵敏
在实际的无刷电机里,霍尔传感器被安装在定子上,转子上的永磁体旋转时,N/S极交替扫过霍尔元件。霍尔元件输出的是数字信号——高电平代表检测到N极,低电平代表检测到S极。说白了,它就是个磁性开关。
2.2 三霍尔布局与120°电气角
一个霍尔只能告诉你当前是N还是S,但电机需要知道转子在哪个扇区。所以无刷电机里通常装三个霍尔传感器,彼此间隔120°电气角。
为什么是120°?因为三相绕组也是120°对称分布,三个霍尔刚好把360°电气周期分成6个扇区,每个扇区60°。这样,在任何时刻,三个霍尔的状态组合都能唯一确定转子位置。
我习惯把三个霍尔命名为HA、HB、HC。它们输出的信号组合有6种有效状态:
| 扇区 | HA | HB | HC | 转子位置范围(电气角) |
|---|---|---|---|---|
| 1 | 1 | 0 | 1 | 0° - 60° |
| 2 | 1 | 0 | 0 | 60° - 120° |
| 3 | 1 | 1 | 0 | 120° - 180° |
| 4 | 0 | 1 | 0 | 180° - 240° |
| 5 | 0 | 1 | 1 | 240° - 300° |
| 6 | 0 | 0 | 1 | 300° - 360° |
注意,000和111这两个状态在正常运行时不会出现——如果出现了,要么是霍尔坏了,要么是电机卡死。我在调试时就用这个规律快速排查过霍尔故障。
2.3 6步换相法(梯形控制)
有了霍尔信号,接下来就是怎么驱动电机了。6步换相法,也叫梯形控制,是最经典的控制方式。
它的思路是:在每个60°扇区内,只给两相通电,第三相悬空。通电的两相中,一相流入电流(高边MOS导通),另一相流出电流(低边MOS导通)。这样在定子上产生一个旋转磁场,拉着转子跑。
6步换相法的换相表如下(以常见的正转为例):
| 扇区 | 霍尔状态 (HA,HB,HC) | A相 | B相 | C相 |
|---|---|---|---|---|
| 1 | 1,0,1 | H | L | Z |
| 2 | 1,0,0 | H | Z | L |
| 3 | 1,1,0 | Z | H | L |
| 4 | 0,1,0 | L | H | Z |
| 5 | 0,1,1 | L | Z | H |
| 6 | 0,0,1 | Z | L | H |
(H=高边导通,L=低边导通,Z=悬空)
每次换相,其实就是根据霍尔信号的变化,切换MOS管的导通组合。我习惯在代码里用一个查表数组来实现,这样换相延迟只有几个时钟周期。
2.4 霍尔信号时序图
理解了原理,我们来看看霍尔信号在时间轴上是怎样的。下面这张SVG图展示了电机匀速旋转时,三个霍尔信号和相电流的对应关系。
从时序图里你能看到:
- 三个霍尔信号是互差120°的方波
- 每个扇区内,只有一个霍尔信号发生变化
- 换相发生在霍尔信号的上升沿或下降沿
我刚开始做霍尔换相时,犯过一个低级错误:直接用霍尔信号的边沿触发中断,然后在中断里换相。结果电机高速运行时,中断太频繁,CPU忙不过来。后来我改用定时器轮询+边沿检测,才解决了这个问题。
2.5 霍尔换相的代码实现
下面是一个简化的霍尔换相代码框架,我用的是C语言风格,实际移植时根据你的MCU调整:
// 霍尔换相表(正转)
const uint8_t commutation_table[8] = {
0b000, // 0: 无效状态
0b001, // 1: A-H, B-L, C-Z
0b010, // 2: A-H, B-Z, C-L
0b011, // 3: A-Z, B-H, C-L
0b100, // 4: A-L, B-H, C-Z
0b101, // 5: A-L, B-Z, C-H
0b110, // 6: A-Z, B-L, C-H
0b000 // 7: 无效状态
};
// 霍尔信号读取
uint8_t read_hall_state(void) {
uint8_t hall = 0;
hall |= (HAL_GPIO_ReadPin(HA_PORT, HA_PIN) << 2);
hall |= (HAL_GPIO_ReadPin(HB_PORT, HB_PIN) << 1);
hall |= (HAL_GPIO_ReadPin(HC_PORT, HC_PIN) << 0);
return hall;
}
// 换相执行
void commutation_step(uint8_t hall_state) {
uint8_t pattern = commutation_table[hall_state];
// 根据pattern设置MOS管
set_mosfet(pattern);
}
// 主循环或定时器中断中调用
void motor_control_loop(void) {
uint8_t hall = read_hall_state();
if (hall != 0 && hall != 7) { // 排除无效状态
commutation_step(hall);
}
}
这段代码的核心就是那个换相表。你只要保证霍尔信号的映射关系和你的硬件接线一致,换相逻辑就完成了。我习惯在调试阶段把hall_state通过串口打印出来,对照表格验证——这个方法帮我快速定位过两次接线错误。
2.6 霍尔换相的局限性
霍尔传感器虽然好用,但也不是万能的。我个人总结了几点:
- 精度有限:只能提供60°分辨率的位置信息,不适合高精度控制
- 受温度影响:霍尔元件有温漂,高温下信号可能不稳定
- 安装要求高:三个霍尔的安装角度必须精确,否则换相时序会偏移
- 高速受限:电机转速太高时,霍尔信号的边沿可能跟不上
如果你做的是伺服驱动器或者需要低速平稳运行的设备,霍尔换相可能不够用。这时候就要上编码器了——这也是我们后面章节的重点。