4、霍尔状态机与换向逻辑:六步换向原理、状态机设计、换向表生成

好,咱们进入霍尔传感器的核心环节——状态机与换向逻辑。

说白了,霍尔传感器就是电机的“位置眼睛”。它告诉你转子现在转到哪了。但光知道位置还不够,你得根据这个位置,决定下一步该给哪两相通电。这个决策过程,就是换向逻辑。我刚开始做无刷电机驱动时,总觉得这步很简单,不就是查个表嘛。结果第一次上电,电机咔咔响,就是不转。后来才发现,换向表的方向搞反了。嗯,从那以后,我对这张表就格外小心了。

4.1 六步换向原理

先聊聊原理。无刷直流电机(BLDC)的定子有三相绕组,通常标记为A、B、C。转子是永磁体。要让转子连续转起来,你得在定子上产生一个旋转的磁场,拉着转子跑。

怎么产生旋转磁场?很简单,每次只给两相通电,第三相悬空。这样电流从一相流入,从另一相流出,在定子上形成一个固定的磁场方向。然后每隔60°电角度,切换一次通电组合。转一圈360°,正好切换6次。这就是“六步换向”名字的由来。

核心要点:六步换向的本质,就是用6个离散的定子磁场方向,去“追赶”连续旋转的转子磁场。每一步,定子磁场都超前转子磁场一个角度,从而产生持续的转矩。

你想想看,如果定子磁场和转子磁场对齐了,那转矩就为零,电机就停了。所以换向的时机必须精准,不能早也不能晚。霍尔传感器就是干这个的——它告诉你转子磁场当前的位置,你据此决定下一步定子磁场该指向哪。

4.2 霍尔信号与扇区对应关系

三个霍尔传感器,安装在定子上,彼此相隔120°(电角度)。转子转过一圈,每个霍尔输出一个高电平和一个低电平。三个霍尔组合起来,就有2³ = 8种状态。

但转子只有6个稳定的位置状态。为什么?因为霍尔传感器的安装位置决定了,在正常的360°电角度旋转中,只会出现6种有效的二进制组合。另外两种组合(全0和全1)通常被认为是非法状态,或者对应着霍尔传感器的故障。

我习惯把这6个有效状态,对应到6个扇区。每个扇区覆盖60°电角度。比如:

扇区编号 霍尔编码 (HA, HB, HC) 转子电角度范围
1 101 0° ~ 60°
2 100 60° ~ 120°
3 110 120° ~ 180°
4 010 180° ~ 240°
5 011 240° ~ 300°
6 001 300° ~ 360°

我的经验:这张表不是固定的!它取决于霍尔传感器的安装极性(是N极输出高还是S极输出高)以及安装角度。每次拿到一个新电机,我做的第一件事就是用手慢慢转动转子,用示波器或者逻辑分析仪抓出霍尔信号的真实顺序,再生成对应的换向表。千万别偷懒直接套用别人的表。

4.3 状态机设计

有了扇区对应关系,接下来就是设计状态机。状态机的作用是:根据当前的霍尔状态,决定下一步应该执行哪一步换向。

状态机通常有6个稳定状态,对应6个扇区。每个状态包含两个信息:

  • 当前通电相序:比如A+ B-,表示电流从A相流入,B相流出。
  • 下一个状态的触发条件:也就是下一个霍尔编码。

我画一个简单的状态转移图,你一看就明白:

六步换向状态机 六步换向状态机 扇区1 101 → A+B- 扇区2 100 → A+C- 扇区3 110 → B+C- 扇区4 010 → B+A- 扇区5 011 → C+A- 扇区6 001 → C+B- 箭头方向:霍尔状态变化触发换向,每次切换步进60°电角度

这个状态机是循环的。电机正转时,状态从1→2→3→4→5→6→1。反转时,方向相反,从1→6→5→4→3→2→1。

注意:状态机必须包含非法状态处理。如果检测到霍尔编码为000或111,说明要么霍尔传感器坏了,要么转子位置异常。我一般会立即关闭PWM输出,进入安全保护模式。曾经有个项目,就是因为没处理非法状态,电机在启动瞬间霍尔信号抖动,导致误换向,直接烧了MOS管。血的教训。

4.4 换向表生成

换向表,本质上是一个查找表(LUT)。输入是当前的霍尔编码,输出是三相桥臂的开关状态。

三相桥臂,每相有两个开关管:上管(High Side)和下管(Low Side)。我用一个字节来表示开关状态,比如:

  • bit 0: A相下管
  • bit 1: A相上管
  • bit 2: B相下管
  • bit 3: B相上管
  • bit 4: C相下管
  • bit 5: C相上管

那么,A+B-的通电组合,就是A相上管导通,B相下管导通,其他全关。对应的二进制就是:0b001001,也就是0x09。

下面是一个完整的换向表示例(正转):

霍尔编码 通电相序 桥臂状态 (二进制) 桥臂状态 (十六进制)
101 A+B- 001001 0x09
100 A+C- 010001 0x11
110 B+C- 010010 0x12
010 B+A- 000110 0x06
011 C+A- 000101 0x05
001 C+B- 001010 0x0A

在代码里,我通常用一个数组来存储这个表:

// 换向表,索引为霍尔编码(0-7),值为桥臂控制字
// 非法状态(0和7)赋值为0,表示关闭所有开关
const uint8_t commutation_table[8] = {
    0x00, // 000: 非法状态,关闭
    0x0A, // 001: C+B-
    0x06, // 010: B+A-
    0x05, // 011: C+A-
    0x09, // 100: A+C-
    0x09, // 101: A+B-
    0x12, // 110: B+C-
    0x00  // 111: 非法状态,关闭
};

我的习惯:我会在代码里同时准备正转和反转两张表。反转表其实就是把正转表的通电相序反过来,比如A+B-变成B+A-。这样在需要反转时,直接切换表的指针就行,不用修改状态机逻辑。另外,我会在初始化时做一次表校验,确保每个有效霍尔编码都能映射到一个非零的桥臂状态,防止数组越界或者空指针。

4.5 换向时机与PWM配合

有了换向表,是不是每次霍尔信号变化,就立刻切换桥臂状态?理论上是的。但实际工程中,有几个细节要注意。

第一,消抖。霍尔信号在换向瞬间可能会有毛刺。我一般会在检测到霍尔边沿后,启动一个10~50微秒的定时器,等信号稳定后再读取。这叫“去抖延时”。

第二,PWM同步。换向操作最好在PWM周期的起始点执行,也就是在定时器上溢中断里做。这样可以避免在PWM周期的中间突然改变占空比,导致电流波形出现毛刺。

第三,死区时间。换向时,同一相的上管和下管不能同时导通。在切换桥臂状态时,必须先关闭当前导通的管子,等待一个死区时间(通常几百纳秒到几微秒),再打开目标管子。这个死区时间由硬件定时器生成,但软件层面也要确保换向逻辑不会产生“直通”指令。

实战建议:我习惯在换向中断服务函数里,只做两件事:读取霍尔状态,查表得到新的桥臂控制字。然后把这个控制字写入一个全局变量。真正的PWM更新,在PWM中断里完成。这样把换向逻辑和PWM输出解耦,代码更清晰,也更容易调试。

4.6 换向性能评估

换向做得好不好,直接体现在电机的运行品质上。我一般用三个指标来衡量:

  • 换向延迟:从霍尔信号变化到桥臂状态切换的时间。这个延迟越小越好,最好控制在几微秒以内。延迟大了,电机会有顿挫感,效率也会下降。
  • 换向噪声:换向瞬间,电流突变会产生电磁噪声。好的换向逻辑应该配合PWM策略,让电流过渡平滑。我常用的方法是“提前换向”或者“滞后换向”,根据负载情况动态调整换向角度。
  • 换向可靠性:在高速运转时,霍尔信号可能会因为干扰而丢失或者多出脉冲。状态机需要有容错能力,比如连续几次检测到同一个非法状态才触发保护,而不是一次就停机。

嗯,关于霍尔状态机和换向逻辑,核心内容就这些。说白了,就是一张表加一个状态机。但就是这张表,决定了电机能不能转、转得顺不顺。我建议你拿到一个新电机后,花点时间手动测出霍尔顺序,亲手生成换向表,然后上电验证。这个过程虽然繁琐,但能帮你建立起对换向逻辑的直觉。以后遇到问题,你就能快速定位是表错了,还是状态机逻辑有bug。