3、霍尔传感器换相:霍尔效应原理、120°与60°安装方式、霍尔信号与转子位置的关系、六步换相法详解
3.1 霍尔效应原理——从物理课到电机控制
霍尔效应,说白了就是:给一块通着电的半导体薄片加上垂直磁场,薄片两侧就会产生一个电压。这个电压叫霍尔电压,大小跟磁场强度成正比。
我当年在学校第一次看到这个实验时,觉得就是个物理现象,跟电机能有什么关系?后来做项目才明白——这个小小的电压信号,就是无刷电机换相的「眼睛」。
霍尔传感器内部其实就三个部分:
- 霍尔元件:感受磁场变化,产生微弱的霍尔电压
- 放大器:把毫伏级的信号放大到逻辑电平
- 施密特触发器:整形输出,变成干净的0/1数字信号
所以最终你看到的霍尔输出,不是模拟电压,而是高电平或低电平。电机转一圈,三个霍尔会输出一组二进制编码,告诉控制器转子现在在哪个扇区。
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个 |
| 编码顺序 | 标准格雷码顺序 | 非标准顺序 |
| 常见程度 | 主流 | 较少见 |
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;
}
}
六步换相的波形特点
六步换相产生的相电压波形是「梯形波」,不是正弦波。每个相导通120°电气角,然后关断60°。所以电机电流也不是平滑的正弦,而是有阶梯变化的梯形波。
这种波形的好处是控制简单、硬件成本低。坏处是转矩脉动大、有换相噪声。如果你做的是风机、水泵这类对噪声不敏感的应用,六步换相完全够用。但如果是伺服、机器人关节,就得考虑正弦波驱动了。
3.5 霍尔换相的知识体系
下面这张图是我自己整理的霍尔换相知识结构,帮你理清思路:
3.6 避坑指南
做霍尔换相项目,有几个坑我反复踩过,分享给你:
- 霍尔信号抖动:电机启动时,霍尔信号可能会有毛刺。我习惯在软件里做5~10ms的去抖滤波,或者用硬件施密特触发器整形。
- 换相时序错误:如果电机反转或者不转,先检查换相表是不是跟霍尔安装方式匹配。120°和60°的换相表不一样,别搞混。
- 死区时间:换相时上下桥臂不能同时导通。我一般设置1~2μs的死区时间,具体看MOS管的关断延迟。
- 启动策略:电机静止时霍尔信号可能全0或全1,无法判断位置。这时候需要「强制定位」——先给一个固定通电相,把转子拉到已知位置,再切入正常换相。
嗯,霍尔换相的内容就这些。核心就是三句话:霍尔传感器感知磁场 → 输出6个扇区编码 → MCU查表换相。把这个逻辑链刻在脑子里,后面学更高级的驱动方法就轻松多了。