3、霍尔传感器换相:霍尔效应原理、120°与60°安装方式、霍尔信号与转子位置的关系、六步换相法详解

3.1 霍尔效应原理——从物理课到电机控制

霍尔效应,说白了就是:给一块通着电的半导体薄片加上垂直磁场,薄片两侧就会产生一个电压。这个电压叫霍尔电压,大小跟磁场强度成正比。

我当年在学校第一次看到这个实验时,觉得就是个物理现象,跟电机能有什么关系?后来做项目才明白——这个小小的电压信号,就是无刷电机换相的「眼睛」。

霍尔传感器内部其实就三个部分:

  • 霍尔元件:感受磁场变化,产生微弱的霍尔电压
  • 放大器:把毫伏级的信号放大到逻辑电平
  • 施密特触发器:整形输出,变成干净的0/1数字信号

所以最终你看到的霍尔输出,不是模拟电压,而是高电平或低电平。电机转一圈,三个霍尔会输出一组二进制编码,告诉控制器转子现在在哪个扇区。

一个小技巧:霍尔传感器对磁场方向敏感。N极靠近输出高电平,S极靠近输出低电平。记住这个极性关系,后面分析信号表时就不会乱。

3.2 120°与60°安装方式——两种常见的布局

三个霍尔传感器怎么放?市面上主流就两种:120°电气角安装和60°电气角安装。

注意我说的是「电气角」,不是机械角。电机转一圈对应360°机械角,但电气角跟电机极对数有关。比如4对极的电机,一圈就是4×360°=1440°电气角。霍尔传感器之间的间隔,是按电气角算的。

120°安装方式

三个霍尔传感器彼此相隔120°电气角。这是最常见的方案,占市场80%以上。我做过的大部分项目都用的这种。

  • 每个霍尔信号占180°电气角(高电平90°,低电平90°)
  • 三个信号组合起来,每60°电气角变化一次状态
  • 一圈共6个状态,对应6个扇区

60°安装方式

三个霍尔传感器彼此相隔60°电气角。这种方案相对少见,但有些电机厂商为了特定性能会采用。

  • 信号占空比不再是50%,高电平占120°,低电平占60°
  • 同样每60°变化一次状态,一圈也是6个状态
  • 但状态编码顺序跟120°安装不同
对比项 120°安装 60°安装
霍尔间隔 120°电气角 60°电气角
信号占空比 50%(高/低各90°) 66.7%(高120°/低60°)
状态数量 6个 6个
编码顺序 标准格雷码顺序 非标准顺序
常见程度 主流 较少见
注意:60°安装的电机,如果按120°的换相表去驱动,电机要么不转,要么剧烈抖动。我曾经在调试一个进口电机时踩过这个坑,查了两天才发现是安装方式搞错了。

3.3 霍尔信号与转子位置的关系

三个霍尔传感器,输出三个二进制信号:Ha、Hb、Hc。每个信号只有0或1两种状态,所以总共2³=8种组合。但有效状态只有6个,剩下两个(000和111)是非法状态——正常情况下不会出现。

以120°安装为例,转子转一圈,霍尔信号的变化规律是这样的:

扇区 电气角度 Ha Hb Hc
1 0°~60° 1 0 1
2 60°~120° 1 0 0
3 120°~180° 1 1 0
4 180°~240° 0 1 0
5 240°~300° 0 1 1
6 300°~360° 0 0 1

你想想看,这个表其实就是一张「转子位置查找表」。MCU只要读到Ha、Hb、Hc的值,就能知道转子当前在哪个扇区,然后决定该给哪两相通电。

这里有个关键点:霍尔信号只能告诉你转子在哪个60°扇区,不能告诉你精确位置。所以霍尔换相是「离散位置控制」,精度就是±30°电气角。如果要求更高精度,就得用编码器了。

核心理解:霍尔传感器把连续的转子位置,离散成了6个扇区。每个扇区对应一组固定的换相逻辑。这就是六步换相法的物理基础。

3.4 六步换相法详解

六步换相法,也叫「梯形波驱动」或「120°导通方式」。名字听着复杂,其实逻辑很简单:每60°电气角切换一次通电相,每次只有两相导通,一相悬空。

我习惯把六步换相理解成一个「接力赛」:A相跑一段,换B相,再换C相,循环接力。每一棒跑60°,六棒跑完一圈。

换相逻辑表(以120°安装、正转为例)

扇区 霍尔编码 (Ha Hb Hc) 通电相 电流方向
1 101 A+ B- A→B
2 100 A+ C- A→C
3 110 B+ C- B→C
4 010 B+ A- B→A
5 011 C+ A- C→A
6 001 C+ B- C→B

你看这个表,规律很明显:霍尔编码每变化一次,就换一次相。换相顺序是固定的,正转按1→2→3→4→5→6循环,反转就反过来。

代码实现示例

下面是一个典型的霍尔换相中断服务函数,我在STM32上用过很多次:

// 霍尔换相中断服务函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    uint8_t hall_code;
    
    // 读取三个霍尔引脚状态
    hall_code = (HAL_GPIO_ReadPin(HALL_A_GPIO_Port, HALL_A_Pin) << 2) |
                (HAL_GPIO_ReadPin(HALL_B_GPIO_Port, HALL_B_Pin) << 1) |
                HAL_GPIO_ReadPin(HALL_C_GPIO_Port, HALL_C_Pin);
    
    // 查表换相
    switch(hall_code)
    {
        case 0b101:  // 扇区1
            // A相上桥臂PWM,B相下桥臂导通
            set_pwm_duty(TIM_CHANNEL_1, duty);
            HAL_GPIO_WritePin(B_LOW_GPIO_Port, B_LOW_Pin, GPIO_PIN_SET);
            HAL_GPIO_WritePin(C_LOW_GPIO_Port, C_LOW_Pin, GPIO_PIN_RESET);
            break;
        case 0b100:  // 扇区2
            // A相上桥臂PWM,C相下桥臂导通
            set_pwm_duty(TIM_CHANNEL_1, duty);
            HAL_GPIO_WritePin(C_LOW_GPIO_Port, C_LOW_Pin, GPIO_PIN_SET);
            HAL_GPIO_WritePin(B_LOW_GPIO_Port, B_LOW_Pin, GPIO_PIN_RESET);
            break;
        // ... 其他扇区类似
        default:
            // 非法状态,关闭所有输出
            break;
    }
}
经验之谈:霍尔换相中断要尽量快,我一般控制在5微秒以内。因为换相瞬间电流变化剧烈,如果中断响应慢了,电机会出现明显的转矩脉动。另外,建议在换相时刻做一次电流采样,用于电流环控制。

六步换相的波形特点

六步换相产生的相电压波形是「梯形波」,不是正弦波。每个相导通120°电气角,然后关断60°。所以电机电流也不是平滑的正弦,而是有阶梯变化的梯形波。

这种波形的好处是控制简单、硬件成本低。坏处是转矩脉动大、有换相噪声。如果你做的是风机、水泵这类对噪声不敏感的应用,六步换相完全够用。但如果是伺服、机器人关节,就得考虑正弦波驱动了。

3.5 霍尔换相的知识体系

下面这张图是我自己整理的霍尔换相知识结构,帮你理清思路:

霍尔传感器换相知识体系 霍尔效应原理 120° 电气角安装 60° 电气角安装 霍尔信号 → 转子位置(6个扇区) 六步换相法:每60°切换一次,两相通电一相悬空 应用:风机、水泵、电动工具 局限:转矩脉动、换相噪声 核心:霍尔信号 → 扇区判断 → 换相逻辑 → 电机旋转 每60°电气角触发一次换相,一圈6步

3.6 避坑指南

做霍尔换相项目,有几个坑我反复踩过,分享给你:

  • 霍尔信号抖动:电机启动时,霍尔信号可能会有毛刺。我习惯在软件里做5~10ms的去抖滤波,或者用硬件施密特触发器整形。
  • 换相时序错误:如果电机反转或者不转,先检查换相表是不是跟霍尔安装方式匹配。120°和60°的换相表不一样,别搞混。
  • 死区时间:换相时上下桥臂不能同时导通。我一般设置1~2μs的死区时间,具体看MOS管的关断延迟。
  • 启动策略:电机静止时霍尔信号可能全0或全1,无法判断位置。这时候需要「强制定位」——先给一个固定通电相,把转子拉到已知位置,再切入正常换相。
曾经踩过的坑:有一次我做高速电机(30000rpm),霍尔换相中断频率太高,CPU忙不过来,导致换相延迟。后来我把换相逻辑从中断里移出来,用定时器触发,才解决问题。高速应用一定要算好中断负载。

嗯,霍尔换相的内容就这些。核心就是三句话:霍尔传感器感知磁场 → 输出6个扇区编码 → MCU查表换相。把这个逻辑链刻在脑子里,后面学更高级的驱动方法就轻松多了。