4、霍尔信号解读:120°与60°相位差,如何从霍尔信号判断转子位置?
好,咱们接着聊霍尔信号。上一节我讲了霍尔元件怎么装,这一节咱们重点说说——信号出来以后,怎么看?
很多新手拿到三根霍尔线,一测波形,三个方波,相位差要么120°,要么60°。嗯,这里要注意:这两种情况,对应的电机内部结构完全不同。搞混了,换相时序就全乱套了。
4.1 120° 与 60° 的本质区别
说白了,这个角度差不是霍尔元件自己决定的,而是三个霍尔元件在定子上的安装位置决定的。
- 120° 相位差:三个霍尔元件彼此相隔 120° 电角度。这是最常见的配置。我做过的大部分无人机电机、电动工具电机,都是这种。
- 60° 相位差:三个霍尔元件彼此相隔 60° 电角度。这种配置在一些老式硬盘电机、特定伺服电机里见过。
你想想看,120° 和 60° 差了整整一倍。那它们对应的转子位置表,能一样吗?当然不一样。
核心结论:120° 配置下,任意时刻只有一个霍尔信号跳变沿;60° 配置下,有时两个霍尔信号同时跳变。这是判断两种配置最直接的方法。
4.2 如何从波形判断是 120° 还是 60°?
我在项目中遇到过好几次这种情况:客户拿来一个电机,说霍尔信号不对,让我帮忙看看。我第一件事就是拿示波器,夹上三根霍尔线,看波形。
怎么判断?很简单:
- 看跳变沿是否重叠:如果三个霍尔信号的上升沿和下降沿,彼此之间永远不重叠,那就是 120° 配置。
- 看是否有同时跳变:如果某两个霍尔信号同时出现上升沿或下降沿,那就是 60° 配置。
举个例子。120° 配置下,一个完整的电周期(360° 电角度)里,霍尔信号组合会变化 6 次,每次只变 1 位。而 60° 配置下,同样 6 次变化,但其中有 2 次是 2 位同时变化。
我的小技巧:用示波器的余晖模式,或者直接看逻辑分析仪的波形图。一眼就能看出有没有重叠的跳变沿。别用肉眼盯着数字示波器的刷新看,太累。
4.3 120° 配置的转子位置表
好,假设你确认了是 120° 配置。那接下来,怎么从霍尔信号知道转子当前在哪个扇区?
咱们先约定一下:三个霍尔信号分别叫 Ha、Hb、Hc。输出高电平为 1,低电平为 0。那么一个电周期内,霍尔状态会按以下顺序循环:
| 扇区 | 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° |
注意看,这个表里没有 000 和 111 这两个状态。为什么?因为 120° 配置下,这三个霍尔信号永远不会同时为 0 或同时为 1。如果你读到了 000 或 111,那大概率是霍尔元件坏了,或者线断了。
我曾经踩过的坑:有一次调试,霍尔信号读出来全是 000。我查了半天电路,最后发现是霍尔供电的 5V 线虚焊了。嗯,从那以后我每次上电第一件事,就是先测霍尔供电电压。
4.4 60° 配置的转子位置表
60° 配置的表就有点不一样了。它会出现 000 和 111 这两个状态。具体如下:
| 扇区 | 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° |
| 7 | 0 | 0 | 0 | 特殊状态(换相过渡) |
| 8 | 1 | 1 | 1 | 特殊状态(换相过渡) |
你看,60° 配置下,000 和 111 是合法的过渡状态。它们出现在两个扇区切换的瞬间,持续时间很短。我个人习惯是在代码里把这俩状态当作无效状态处理,直接忽略,等下一个稳定状态再更新位置。
4.5 核心逻辑:一张图看懂
下面这张图,是我自己总结的霍尔信号解读流程。每次做新项目,我都会先按这个思路走一遍:
4.6 代码实现:从霍尔值到扇区
好了,理论讲完了,咱们看看代码怎么写。我个人习惯用一个简单的查表法,又快又稳。
// 120° 配置:霍尔值到扇区的映射表
// 索引是霍尔值(Ha, Hb, Hc 拼成的3位二进制数)
// 值为扇区编号(1~6),0表示无效状态
const uint8_t hall_to_sector_120[8] = {
0, // 000 - 无效
5, // 001 - 扇区5
3, // 010 - 扇区3
4, // 011 - 扇区4
1, // 100 - 扇区1
6, // 101 - 扇区6
2, // 110 - 扇区2
0 // 111 - 无效
};
// 60° 配置:霍尔值到扇区的映射表
const uint8_t hall_to_sector_60[8] = {
7, // 000 - 过渡状态
5, // 001 - 扇区5
3, // 010 - 扇区3
4, // 011 - 扇区4
1, // 100 - 扇区1
6, // 101 - 扇区6
2, // 110 - 扇区2
8 // 111 - 过渡状态
};
// 读取霍尔值,返回扇区编号
uint8_t get_sector_from_hall(uint8_t hall_value) {
// hall_value 是 Ha, Hb, Hc 拼成的值
// 例如:Ha=1, Hb=0, Hc=1 → hall_value = 0b101 = 5
uint8_t sector = hall_to_sector_120[hall_value & 0x07];
// 如果读到0,说明可能是60°配置,或者霍尔故障
if (sector == 0) {
sector = hall_to_sector_60[hall_value & 0x07];
// 如果还是0,那就是真的故障了
if (sector == 0) {
// 报错:霍尔信号异常
return 0;
}
}
return sector;
}
我的建议:实际项目中,别在中断里做这个查表。我一般是在霍尔信号变化时触发中断,在中断里只记录最新的霍尔值,然后在主循环或者定时器里做查表和换相。这样能避免中断嵌套导致的问题。
4.7 避坑指南
最后,分享几个我踩过的坑:
- 霍尔信号抖动:电机启动瞬间,霍尔信号可能会有毛刺。我习惯在软件里加一个 10~50μs 的去抖滤波,别一读到变化就立刻换相。
- 上电初始位置:电机刚上电时,转子可能停在任意位置。这时候霍尔信号是有效的,直接读就能知道初始扇区。但要注意,如果电机在转动中突然断电再上电,霍尔信号可能不准,需要重新校准。
- 霍尔线序:不同厂家的霍尔线颜色定义不一样。我见过红色是 5V,也见过红色是信号线。拿到新电机,第一件事就是拿万用表量一下,别信颜色。
嗯,这一节的内容就到这儿。霍尔信号解读,说白了就是一张表的事。但表怎么来的、怎么用、怎么避坑,才是真正值钱的经验。