2、方波驱动实现:霍尔传感器的信号解读与换向逻辑

好,咱们接着聊。上一章我们把方波驱动的整体框架搭起来了,这一章要啃的,是方波驱动里最核心的「眼睛」——霍尔传感器。

说白了,没有霍尔信号,方波驱动就是个瞎子。你连转子在哪儿都不知道,怎么换向?

我个人习惯,在讲任何传感器之前,先问自己三个问题:
1. 它输出什么?
2. 我怎么读?
3. 读完了怎么用?

霍尔传感器,就是回答这三个问题的。

2.1 霍尔传感器到底在测什么?

霍尔传感器,本质上是个磁场开关。它检测的是垂直于芯片表面的磁场强度。

当磁铁的N极靠近时,输出低电平;S极靠近时,输出高电平。嗯,就这么简单。

但注意,这里有个坑——不同厂家的霍尔芯片,极性定义可能相反。我遇到过一款国产霍尔,手册上写的和实际表现完全反着来,折腾了我一整天。所以拿到新芯片,第一件事就是拿磁铁试一下,别信手册。

在无刷直流电机里,我们通常装三个霍尔传感器,间隔120度电角度。它们会输出三路方波信号,相位互差120度。

你想想看,三个霍尔,每个输出0或1,一共就有8种组合。其中6种是有效状态,对应转子在6个不同的扇区位置。剩下两种(全0和全1)是非法状态,要么是传感器坏了,要么是电机没装好。

2.2 霍尔信号的解读:从波形到扇区

咱们直接看波形,比说一万句话都管用。

假设电机匀速旋转,三个霍尔信号HA、HB、HC的波形是这样的:

HA:  __|‾‾|__|‾‾|__|‾‾|__
HB: ‾‾|__|‾‾|__|‾‾|__|‾‾
HC: _|‾‾|__|‾‾|__|‾‾|__|

注意看,每个周期内,三个信号的电平组合会变化6次。每次变化,就对应转子转过60度电角度。

我把这6种状态整理成了表格,方便你对照:

扇区 HA HB HC 转子位置(电角度)
1 1 0 1 0° ~ 60°
2 1 0 0 60° ~ 120°
3 1 1 0 120° ~ 180°
4 0 1 0 180° ~ 240°
5 0 1 1 240° ~ 300°
6 0 0 1 300° ~ 360°

这张表,建议你打印出来贴在工位上。我刚开始做电机驱动时,每次换向都要对着这张表看半天,后来背得滚瓜烂熟。

小技巧: 你可以把三个霍尔信号拼成一个3位二进制数,比如HA=1, HB=0, HC=1就是0b101=5。然后用一个switch-case语句,根据这个数值直接查表换向。这样代码跑起来飞快。

2.3 换向逻辑:从扇区到导通相

知道了转子在哪个扇区,接下来就是决定:该让哪两相通电?

方波驱动的换向逻辑,遵循一个基本原则:任何时候,只有两相绕组通电,第三相悬空。

为什么?因为这样产生的合成磁场方向最明确,转矩最大。

具体的换向表,我直接给出来:

当前扇区 导通相(正转) 导通相(反转)
1 A+ B- A- B+
2 A+ C- A- C+
3 B+ C- B- C+
4 B+ A- B- A+
5 C+ A- C- A+
6 C+ B- C- B+

注意看,正转和反转的导通相正好相反。这就是为什么改变电机转向,只需要把换向表反过来查就行。

我曾经犯过一个低级错误:换向表写对了,但PWM的占空比给错了方向。结果电机嗡嗡响就是不转,还发烫。后来用示波器一量,发现A相上管和B相下管同时导通了——这不就是短路嘛!

警告: 换向时一定要加入死区时间!上下管切换时,如果一管还没完全关断,另一管就导通了,瞬间大电流会烧毁MOSFET。我一般设1-2微秒的死区,具体看你的开关管速度。

2.4 代码实现:从霍尔读到换向

理论说完了,咱们上代码。这是我在STM32上实际跑过的片段,稍微简化了一下:

// 霍尔信号读取(假设接在PA0-PA2)
uint8_t hall_value = (GPIOA->IDR & 0x07);  // 只取低3位

// 换向表(正转)
const uint8_t commutation_table[8] = {
    0,      // 000 - 非法状态
    0b001001, // 101 - 扇区1: A+B-
    0b000110, // 100 - 扇区2: A+C-
    0b010010, // 110 - 扇区3: B+C-
    0b010100, // 010 - 扇区4: B+A-
    0b100100, // 011 - 扇区5: C+A-
    0b100001, // 001 - 扇区6: C+B-
    0       // 111 - 非法状态
};

// 执行换向
uint8_t pwm_pattern = commutation_table[hall_value];
if (pwm_pattern == 0) {
    // 非法状态,停机保护
    motor_stop();
    error_flag = 1;
} else {
    // 将pwm_pattern写入定时器比较寄存器
    TIM1->CCER = pwm_pattern;
}

这段代码的核心就两件事:读霍尔,查表换向。你看,是不是很简单?

但实际工程中,有个细节要注意:霍尔信号的抖动。

电机运行时,霍尔信号边沿会有毛刺,尤其是低速时。如果不做处理,换向会频繁抖动,导致电流波动、噪声增大。

我的做法是加一个简单的软件滤波:连续读到3次相同的霍尔值,才认为状态稳定了。代价是换向会延迟几十微秒,但对于方波驱动来说,完全能接受。

2.5 启动时的特殊处理

电机静止时,霍尔信号可能停在任意位置。这时候直接按换向表驱动,大概率会反转或者堵转。

怎么办?

我常用的方法是「三段式启动」:

  1. 定位阶段: 给任意两相通电,强制转子转到已知位置。保持0.5秒左右。
  2. 开环加速: 按照固定的换向序列,逐步提高换向频率,让电机转起来。
  3. 切入闭环: 当转速达到一定值(比如500RPM),切换到霍尔信号控制的闭环换向。

这个方法虽然土,但非常可靠。我做过一个风机项目,启动成功率100%,从来没失败过。

核心要点: 方波驱动的换向,本质上就是「根据霍尔信号查表,决定哪两相通电」。所有花里胡哨的优化,都是在这个基础上加滤波、加保护、加启动策略。

好了,这一章的内容就到这儿。霍尔信号解读和换向逻辑,是方波驱动的基石。下一章,我们会聊聊PWM调制和电流控制,让电机转得更稳、更安静。

记住,先跑通最简单的换向,再谈优化。别一上来就想搞FOC,先把方波玩明白。