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 基于定时器的换相时刻计算

我个人更推荐的做法:用定时器捕获霍尔边沿的时间戳,然后预测下一个换相时刻。具体步骤:

  1. 记录上一次霍尔边沿的时间戳 t1
  2. 记录当前霍尔边沿的时间戳 t2
  3. 计算两次边沿的时间差 Δt = t2 - t1
  4. 预测下一个换相时刻 t_next = t2 + Δt
  5. 设置定时器在 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°安装方式 120°真值表 60°真值表 六步换相法 换相时刻计算 基于霍尔边沿换相 基于定时器预测换相 核心:霍尔状态 → 查真值表 → 确定通电相序 → 计算换相时刻 → 执行换相

这张图从霍尔传感器出发,分两条路径(120°和60°安装),经过真值表和六步换相法,最终汇聚到换相时刻计算和具体实现。你可以把它当作调试时的路线图。

4.6 避坑指南

最后,分享几个我踩过的坑:

  • 霍尔信号毛刺:电机启动时,霍尔信号可能会有抖动。我习惯在硬件上加RC滤波(1kΩ+100nF),软件里再做一次去抖——连续采样3次,值一致才认。
  • 换相死区:MOS管切换时,一定要加死区时间。我一般设1~3μs,具体看MOS管的关断延迟。死区太短会烧管子,太长会影响效率。
  • 反转处理:真值表要同时准备正转和反转两套。我曾经偷懒只写了一套,结果客户要求反转时,电机直接卡死。
  • 霍尔安装偏差:批量生产时,霍尔传感器的安装位置会有偏差。我建议在产线上做一次霍尔标定,把偏差补偿到软件里。

曾经有一次:我在调试一台大功率电机时,换相时刻算错了,导致上下桥臂直通,MOS管瞬间冒烟。从那以后,我每次上电前都会用示波器抓一下霍尔信号和相电流波形,确认换相逻辑正确再加大功率。

霍尔换相逻辑说难不难,说简单也不简单。关键是把真值表搞对,换相时刻算准,再加上一点工程经验。你按这个思路去调,基本不会出大问题。