2、霍尔传感器与换相:从物理原理到6步换相法

霍尔传感器,说白了就是无刷电机控制里最常用的位置检测器件。它便宜、可靠、响应快,在电动自行车、无人机、工业风扇里随处可见。我最早接触霍尔换相是在做一款低压伺服项目时,当时被霍尔信号的抖动折腾得不轻——嗯,这个坑后面会细说。

2.1 霍尔效应原理

霍尔效应的核心其实很简单:通电导体在磁场中会产生横向电压。你想想看,当电流流过霍尔元件,外部磁场垂直穿过它,洛伦兹力会把载流子推向一侧,于是在元件两侧就出现了电势差——这个电势差就叫霍尔电压。

霍尔电压的大小由三个因素决定:

  • 磁场强度:磁场越强,电压越大
  • 通过电流:电流越大,电压越大
  • 元件厚度:越薄越灵敏

在实际的无刷电机里,霍尔传感器被安装在定子上,转子上的永磁体旋转时,N/S极交替扫过霍尔元件。霍尔元件输出的是数字信号——高电平代表检测到N极,低电平代表检测到S极。说白了,它就是个磁性开关。

我的经验:霍尔元件的安装位置非常关键。我见过不少新手把霍尔焊歪了,结果换相时序全乱。安装时一定要保证霍尔面与转子磁钢的间隙在0.5-1.5mm之间,太近会磁饱和,太远信号太弱。

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管的导通组合。我习惯在代码里用一个查表数组来实现,这样换相延迟只有几个时钟周期。

关键点:6步换相法的本质是方波驱动。相电压波形是梯形的,所以叫梯形控制。它的优点是实现简单、成本低;缺点是转矩脉动大、噪音大。但对于大多数工业应用来说,完全够用。

2.4 霍尔信号时序图

理解了原理,我们来看看霍尔信号在时间轴上是怎样的。下面这张SVG图展示了电机匀速旋转时,三个霍尔信号和相电流的对应关系。

霍尔信号与6步换相时序图 霍尔信号与6步换相时序图 时间 t 扇区1 扇区2 扇区3 扇区4 扇区5 扇区6 HA HB HC I_A (示意) 每个扇区60°电气角,霍尔信号变化触发换相,换相点对应相电流的切换

从时序图里你能看到:

  • 三个霍尔信号是互差120°的方波
  • 每个扇区内,只有一个霍尔信号发生变化
  • 换相发生在霍尔信号的上升沿或下降沿

我刚开始做霍尔换相时,犯过一个低级错误:直接用霍尔信号的边沿触发中断,然后在中断里换相。结果电机高速运行时,中断太频繁,CPU忙不过来。后来我改用定时器轮询+边沿检测,才解决了这个问题。

避坑指南:霍尔信号在换相瞬间会有抖动,尤其是低速时。我曾经被这个坑害惨了——电机在启动时频繁误换相,导致剧烈抖动。解决方案是加入软件消抖,比如连续采样3次一致才认为信号有效。

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°分辨率的位置信息,不适合高精度控制
  • 受温度影响:霍尔元件有温漂,高温下信号可能不稳定
  • 安装要求高:三个霍尔的安装角度必须精确,否则换相时序会偏移
  • 高速受限:电机转速太高时,霍尔信号的边沿可能跟不上

如果你做的是伺服驱动器或者需要低速平稳运行的设备,霍尔换相可能不够用。这时候就要上编码器了——这也是我们后面章节的重点。

我的建议:霍尔换相最适合成本敏感、对噪音和转矩脉动要求不高的应用。比如电动自行车、风扇、水泵。如果你的项目需要静音运行,可以考虑正弦波控制,但那是另一个话题了。