4、霍尔换相逻辑:六步换相法、霍尔状态与通电相序真值表(120°与60°)、换相时刻计算
霍尔传感器这东西,说白了就是电机的“眼睛”。它告诉你转子现在转到哪了,然后你才知道该给哪两相通电。我刚开始做无刷电机驱动时,总觉得霍尔信号就是简单的“高高低低”,结果一上电电机抖得像筛糠……后来才明白,霍尔换相逻辑里藏着不少门道。
这一节,咱们就把六步换相法、120°与60°霍尔安装方式的真值表,还有换相时刻的计算,一次性讲透。
4.1 六步换相法:为什么是六步?
无刷直流电机(BLDC)的定子绕组是三相的,但转子是永磁体。想让转子连续转起来,你得按顺序给不同的两相通电,产生旋转磁场。一个电周期内,通电状态切换6次,这就是六步换相法。
你想想看,三相绕组两两通电,一共有多少种组合?C(3,2)=3种?不对,因为通电方向还有正反。实际上,六步换相法用了6个有效状态:AB、AC、BC、BA、CA、CB(这里字母顺序表示电流方向,比如AB表示A进B出)。
核心要点:六步换相法每步只改变一相的通电状态,保证转矩脉动最小。我习惯叫它“一个换相周期走六步,一步60°电角度”。
为什么不是三步或十二步?三步的话转矩波动太大,电机转起来一顿一顿的;十二步虽然更平滑,但控制复杂度翻倍,对普通霍尔传感器来说精度也不够。六步是个很好的折中——工程上讲究“够用就好”。
4.2 霍尔状态与通电相序真值表
霍尔传感器通常安装三个,间隔120°或60°电角度。安装方式不同,霍尔状态与通电相序的对应关系也不同。我当年在项目里吃过这个亏——拿着120°的真值表去调60°的电机,结果电机反转还抖得厉害。
4.2.1 120°安装方式
120°安装是最常见的。三个霍尔传感器在空间上相隔120°电角度,转子每转过60°,就有一个霍尔状态发生变化。一个电周期内,霍尔状态组合有6种,正好对应6个换相状态。
下面是我常用的120°霍尔真值表(假设电机正转,霍尔输出高电平为1,低电平为0):
| 转子位置(电角度) | Ha | Hb | Hc | 通电相序(正转) | 通电相序(反转) |
|---|---|---|---|---|---|
| 0°~60° | 1 | 0 | 1 | A+ B- | B+ A- |
| 60°~120° | 1 | 0 | 0 | A+ C- | C+ A- |
| 120°~180° | 1 | 1 | 0 | B+ C- | C+ B- |
| 180°~240° | 0 | 1 | 0 | B+ A- | A+ B- |
| 240°~300° | 0 | 1 | 1 | C+ A- | A+ C- |
| 300°~360° | 0 | 0 | 1 | C+ B- | B+ C- |
我的习惯:把真值表做成数组存在Flash里,换相时直接查表。别在中断里算来算去,浪费时间。代码里用const关键字声明,省RAM。
4.2.2 60°安装方式
60°安装方式下,三个霍尔传感器间隔60°电角度。这时候,一个电周期内霍尔状态组合也是6种,但状态顺序和120°不一样。而且,60°安装时霍尔状态变化更频繁——转子每转过60°,有两个霍尔同时变化。
60°霍尔真值表(正转):
| 转子位置(电角度) | Ha | Hb | Hc | 通电相序(正转) |
|---|---|---|---|---|
| 0°~60° | 1 | 0 | 0 | A+ B- |
| 60°~120° | 1 | 1 | 0 | A+ C- |
| 120°~180° | 0 | 1 | 0 | B+ C- |
| 180°~240° | 0 | 1 | 1 | B+ A- |
| 240°~300° | 0 | 0 | 1 | C+ A- |
| 300°~360° | 1 | 0 | 1 | C+ B- |
注意:60°安装时,霍尔状态组合里不会出现“111”和“000”。如果读到这两个状态,要么是传感器坏了,要么是线接错了。我在现场调试时遇到过好几次,最后发现是霍尔供电线虚焊。
4.3 换相时刻计算
换相时刻说白了就是“什么时候该切换通电相序”。霍尔传感器给出的是离散的位置信号——每60°电角度才更新一次。但电机控制需要知道精确的换相点,不能等到霍尔状态变了才换相。
嗯,这里要注意:霍尔信号变化的那一瞬间,其实就是最佳的换相时刻。但问题是,从霍尔信号变化到MCU响应,再到MOS管切换,中间有延迟。如果你不补偿这个延迟,高速时换相就会滞后,电机效率下降,甚至失步。
3.3.1 基于霍尔边沿的换相
最简单的做法:在霍尔信号的上升沿或下降沿触发中断,在中断服务函数里直接换相。代码大概长这样:
// 霍尔中断服务函数(假设使用GPIO外部中断)
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
uint8_t hall_state;
// 读取当前霍尔状态
hall_state = (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);
// 查表换相
phase_table[hall_state](); // 执行对应的换相函数
}
这种做法在低速时没问题,但高速时就不够看了。为什么?因为中断响应有延迟,而且你没法精确控制换相时刻。
3.3.2 基于定时器的换相时刻计算
我个人更推荐的做法:用定时器捕获霍尔边沿的时间戳,然后预测下一个换相时刻。具体步骤:
- 记录上一次霍尔边沿的时间戳 t1
- 记录当前霍尔边沿的时间戳 t2
- 计算两次边沿的时间差 Δt = t2 - t1
- 预测下一个换相时刻 t_next = t2 + Δt
- 设置定时器在 t_next 时刻触发换相
这样做的好处是:换相时刻可以精确到微秒级,而且不受中断延迟影响。我曾在30000rpm的电机上用过这个方法,换相误差控制在±2°电角度以内。
关键公式:换相周期 T_comm = 60°电角度对应的时间 = 1 / (6 × 电机转速 × 极对数)
比如:4对极电机,转速10000rpm,则 T_comm = 1 / (6 × 10000/60 × 4) = 250μs
4.4 120°与60°安装方式的对比
我整理了一个对比表,方便你选型时参考:
| 对比项 | 120°安装 | 60°安装 |
|---|---|---|
| 霍尔间隔 | 120°电角度 | 60°电角度 |
| 每步变化霍尔数 | 1个 | 2个 |
| 状态顺序 | 格雷码顺序变化 | 非格雷码 |
| 抗干扰能力 | 较强(单边沿变化) | 较弱(双边沿变化) |
| 低速性能 | 相当 | 相当 |
| 高速性能 | 略好(换相延迟小) | 略差(换相延迟大) |
| 安装难度 | 容易 | 较难 |
我的建议:除非有特殊要求(比如需要更精细的位置检测),否则优先选120°安装。调试省心,抗干扰能力也强。60°安装我一般只在伺服电机上见到过。
4.5 霍尔换相逻辑知识体系
下面这张图把本章的核心逻辑串起来了,你可以对照着看:
这张图从霍尔传感器出发,分两条路径(120°和60°安装),经过真值表和六步换相法,最终汇聚到换相时刻计算和具体实现。你可以把它当作调试时的路线图。
4.6 避坑指南
最后,分享几个我踩过的坑:
- 霍尔信号毛刺:电机启动时,霍尔信号可能会有抖动。我习惯在硬件上加RC滤波(1kΩ+100nF),软件里再做一次去抖——连续采样3次,值一致才认。
- 换相死区:MOS管切换时,一定要加死区时间。我一般设1~3μs,具体看MOS管的关断延迟。死区太短会烧管子,太长会影响效率。
- 反转处理:真值表要同时准备正转和反转两套。我曾经偷懒只写了一套,结果客户要求反转时,电机直接卡死。
- 霍尔安装偏差:批量生产时,霍尔传感器的安装位置会有偏差。我建议在产线上做一次霍尔标定,把偏差补偿到软件里。
曾经有一次:我在调试一台大功率电机时,换相时刻算错了,导致上下桥臂直通,MOS管瞬间冒烟。从那以后,我每次上电前都会用示波器抓一下霍尔信号和相电流波形,确认换相逻辑正确再加大功率。
霍尔换相逻辑说难不难,说简单也不简单。关键是把真值表搞对,换相时刻算准,再加上一点工程经验。你按这个思路去调,基本不会出大问题。