2. 换相原理:直流无刷电机(BLDC)的换相逻辑、六步换相法、霍尔传感器与编码器的关系
好,咱们进入正题。上一章聊了编码器的基础,这一章得把换相这件事彻底讲透。你想想看,BLDC 电机为什么叫「无刷」?说白了,就是把传统直流电机的机械电刷和换向器,换成了电子开关。那电子开关什么时候开、什么时候关?这就是换相逻辑要干的事。
我个人习惯把换相理解成「接力赛」——每一相绕组在正确的时间点通电,产生旋转磁场,拉着转子跑。跑偏了,电机就抖;跑慢了,效率就低。我在项目中遇到过好几次,换相时序偏了那么几微秒,电机噪音直接飙升,电流波形也乱七八糟。
2.1 六步换相法:BLDC 的经典换相逻辑
六步换相法,也叫 120° 导通方式。名字听着复杂,其实就一句话:每个电周期内,逆变器的六个功率管按固定顺序导通,每次只有两相导通,第三相悬空。
为什么是六步?因为三相绕组,每相有正、负、悬空三种状态,组合起来刚好六种有效状态。每一步转子转过 60° 电角度,六步就是 360°。
核心要点:六步换相的本质是「位置-开关」映射表。知道转子位置,就知道该导通哪两个功率管。
咱们看一个具体的换相顺序表。假设电机是星形连接,霍尔传感器按 120° 间隔安装:
| 步序 | 霍尔信号 (H3 H2 H1) | 导通相 (A B C) | 电流方向 |
|---|---|---|---|
| 1 | 001 | A+ / B- | A → B |
| 2 | 101 | A+ / C- | A → C |
| 3 | 100 | B+ / C- | B → C |
| 4 | 110 | B+ / A- | B → A |
| 5 | 010 | C+ / A- | C → A |
| 6 | 011 | C+ / B- | C → B |
这张表,就是六步换相的「圣经」。每次霍尔信号跳变,就触发一次换相。换相顺序不能错,错了电机就反转或者卡死。
我的经验:调试初期,我习惯用逻辑分析仪同时抓霍尔信号和 PWM 驱动波形。对照这张表,一眼就能看出换相点对不对。曾经有一次,霍尔线序接反了,电机死活转不起来,查了半小时才发现是 H1 和 H3 对调了。
2.2 霍尔传感器:最直接的换相依据
霍尔传感器,说白了就是三个开关。转子磁极扫过霍尔元件时,输出高低电平。三个霍尔组合起来,就是 6 种状态,正好对应六步换相。
霍尔传感器的安装位置很讲究。通常按 120° 电角度间隔贴在定子上。为什么是 120°?因为三相绕组也是 120° 对称,这样霍尔信号刚好和反电动势过零点对齐。
但霍尔传感器有个硬伤——分辨率太低。一个电周期只有 6 个位置点,60° 电角度才更新一次。低速时还好,高速时换相延迟会越来越明显。我做过一个高速吹风机的项目,电机跑到 10 万转,霍尔信号已经严重滞后,换相点偏了十几度,效率掉了 8%。
注意:霍尔传感器只能提供离散的位置信息。在两次霍尔跳变之间,转子位置是未知的。如果负载突变,换相可能跟不上,导致失步。
2.3 编码器:霍尔传感器的升级替代
编码器能解决霍尔传感器的痛点。它提供连续的位置信息,分辨率可以做到几千甚至几万线每圈。这意味着,换相点可以精确到 1° 甚至 0.1° 电角度。
那编码器和霍尔传感器到底是什么关系?我画了一张图,你看完就明白了:
从图上能看出来,编码器不是替代霍尔传感器,而是升级。霍尔传感器提供的是「离散位置」,编码器提供的是「连续位置」。有了连续位置,换相点可以精确计算,不再依赖固定的 60° 跳变。
2.4 编码器换相的核心逻辑
用编码器换相,逻辑其实更简单:
- 初始化:上电后,先找到转子初始位置。编码器输出的是相对位置,需要一次「对零」操作。
- 实时跟踪:编码器每产生一个脉冲,就更新一次转子位置角度。
- 换相触发:当转子位置达到预设的换相角度时,立即切换功率管状态。
这里有个关键点——换相角度不是固定的。霍尔传感器只能在 60° 倍数点换相,但编码器可以在任意角度换相。这意味着,你可以做「提前换相」或「滞后换相」来优化效率。
高级技巧:在高速运行时,我会把换相角度提前 5°~15°(电角度),补偿电流建立时间。这个角度需要根据电机参数和转速动态调整,我习惯用查表法,提前标定好不同转速下的最佳换相角。
下面是一段伪代码,展示编码器换相的核心逻辑:
// 编码器换相主循环
while (motor_running) {
// 读取编码器位置
position = encoder_read();
// 计算电角度(假设编码器线数为 N,极对数为 P)
elec_angle = (position % (N / P)) * (360 / (N / P));
// 判断是否需要换相
if (elec_angle >= next_commutation_angle) {
// 执行换相
commutation_table[current_step].apply();
// 更新下一步换相角度
current_step = (current_step + 1) % 6;
next_commutation_angle = (current_step * 60) + advance_angle;
// 角度归一化
if (next_commutation_angle >= 360) {
next_commutation_angle -= 360;
}
}
}
这段代码看着简单,但实际工程里坑不少。我曾经在一个项目里,编码器位置读取用了中断,结果中断优先级设低了,被其他任务打断,导致换相延迟。后来改成 DMA 读取,问题才解决。
避坑指南:编码器换相对实时性要求极高。换相延迟超过 10μs,高速时就会明显影响效率。建议用硬件定时器触发换相,或者用独立核跑换相任务,别和主控任务混在一起。
2.5 霍尔传感器与编码器的混合使用
有些场合,我会把霍尔传感器和编码器一起用。霍尔传感器负责初始位置检测和低速换相,编码器负责高速换相和速度闭环。这种方案在伺服驱动器里很常见。
为什么这么搞?因为编码器上电时不知道绝对位置,需要「找零」。霍尔传感器能直接给出 60° 精度内的绝对位置,配合编码器的细分,就能快速确定转子位置。
| 工作阶段 | 使用传感器 | 换相方式 | 说明 |
|---|---|---|---|
| 上电初始 | 霍尔传感器 | 六步换相 | 快速确定转子位置,启动电机 |
| 低速运行 (<500 RPM) | 霍尔 + 编码器 | 六步换相 + 插值 | 霍尔提供基准,编码器做细分 |
| 中高速运行 (>500 RPM) | 编码器 | 连续换相 | 完全依赖编码器,霍尔做备份 |
| 故障模式 | 霍尔传感器 | 六步换相 | 编码器故障时降级运行 |
这种混合方案,说白了就是「取长补短」。霍尔传感器便宜、可靠、能提供绝对位置;编码器精度高、响应快。两者配合,既能保证启动可靠性,又能保证高速性能。
我的习惯:在混合模式下,我会用霍尔信号做「换相校验」。编码器算出的换相点,和霍尔信号跳变点对比,如果偏差超过 10°,就触发报警。这招帮我抓出过好几次编码器安装松动的问题。
2.6 换相逻辑的工程实现要点
最后,总结几个我在工程中踩过的坑和总结的经验:
- 换相死区时间:上下桥臂切换时,必须插入死区时间(通常 0.5μs~3μs),防止直通短路。死区时间太长会失真,太短会炸管。
- 换相电流尖峰:换相瞬间,相电流会产生尖峰。我习惯在换相前提前关断 PWM,等换相完成再重新开启,能有效抑制尖峰。
- 编码器线数选择:对于 BLDC 换相,编码器线数不是越高越好。线数太高,中断频率过高,CPU 负担重。一般 1000~2500 线/圈就够用。
- 换相角度补偿:不同转速下,最佳换相角度不同。我建议做一张转速-角度补偿表,运行时查表插值。
嗯,换相原理这部分就聊到这。你记住一句话:换相的本质是位置与开关的映射。霍尔传感器给你 6 个离散点,编码器给你一条连续曲线。用好了,电机就能跑得又稳又高效。