六步换向是将电角度0–360°分为6个60°区间,依霍尔信号状态顺序切换三相桥臂上下管导通组合,使定子磁场“拖动”转子旋转;需校准霍尔相序、消抖、插入死区、提前角补偿,并用查表法实现确定性映射。

六步换向的本质是按顺序切换三相桥臂的上下管导通状态
BLDC 电机靠定子磁场“拖着”转子永磁体旋转,而磁场方向由三相绕组(U/V/W)的电流方向决定。六步换向就是把电角度 0–360° 划成 6 个 60° 区间,每个区间固定一组导通相:总是一相上桥臂导通、一相下桥臂导通、一相悬空(高阻态),形成确定的合成磁场方向。
关键不是“算角度”,而是“知道当前转子在哪一步”。实际中不依赖绝对位置传感器(如编码器),而是用反电动势(BEMF)过零点或霍尔信号来判断换向时机。霍尔方案最常用,3 位霍尔信号 HU、HV、HW 组合出 6 种有效状态,直接对应 6 个换向扇区。
常见错误:把霍尔状态直接当换向表索引却没校准相序。比如电机顺时针转时霍尔变化是 001→011→010→110→100→101,但若硬件接线错位,序列可能错乱,导致反转或抖动。必须先实测确认霍尔状态随旋转的真实顺序。
用查表法实现换向驱动信号映射
核心是建立霍尔组合到三相上下桥臂 PWM 输出的映射关系。假设使用标准 3 相 6 管逆变器,每相有上管(UH/VH/WH)和下管(UL/VL/WL),逻辑高电平使能驱动芯片对应输出(注意:有些驱动芯片是低有效,需翻转)。
立即学习“C++免费学习笔记(深入)”;
典型映射(霍尔 HUHVHW → 上管状态 UHVHWH,下管状态 ULVLWL):
// 示例:霍尔 001 → U 上拉、W 下拉 → 电流 U→W
{0b001, {1,0,0}, {0,0,1}} // UH=1, VH=0, WH=0; UL=0, VL=0, WL=1
{0b011, {1,0,0}, {0,1,0}} // UH=1, VH=0, WH=0; UL=0, VL=1, WL=0
{0b010, {0,1,0}, {0,1,0}} // ...
{0b110, {0,1,0}, {1,0,0}}
{0b100, {0,0,1}, {1,0,0}}
{0b101, {0,0,1}, {0,0,1}}
实操建议:
- 把查表数组声明为
const,放在 flash 中,避免运行时修改 - 霍尔读取必须做消抖——用定时器采样多次(如连续 3 次相同值才更新),否则换向抖动
- 换向时刻要关断所有 PWM(插入死区后),再设置新状态,否则直通短路
- 若用 STM32 的 TIM1/8 高级定时器,可配置互补 PWM + 死区,用
MOE主输出使能控制全局开关
换向时机不准会导致堵转或异响
霍尔信号本身有安装误差(机械角度偏差)和响应延迟,直接在霍尔跳变沿换向,合成磁场会滞后于转子位置,扭矩下降,高速时尤其明显。工程中普遍采用“提前角”补偿:在霍尔边沿到来前若干微秒触发换向。
更稳健的做法是:以霍尔跳变为基准,记录两次跳变的时间间隔,估算当前电周期周期 T_elec,然后在下一个预期跳变点前 T_elec / 6(即提前 60°)执行换向——这相当于把换向点从“霍尔边沿”移到“BEMF 过零点附近”,提升效率。
容易踩的坑:
- 未启用定时器输入捕获,仅靠 GPIO 中断读霍尔,中断延迟不可控,导致换向时刻漂移
- 在中断里做复杂运算(如除法、浮点),挤占时间,错过下一个霍尔边沿
- 忘记在换向前关闭 PWM 输出(或未等死区结束),造成上下管直通,炸 MOS
C++ 实现要注意实时性与资源约束
嵌入式 C++ 不是桌面开发,不能用 std::vector、异常、RTTI 或动态内存分配。换向逻辑必须是纯函数式、无堆分配、确定执行时间。
推荐结构:
- 用
enum class HallState : uint8_t定义 6 种有效状态,显式排除非法组合(如全 0 或全 1) - 查表用
constexpr std::array构建编译期常量,避免运行时构造开销 - 换向函数签名类似
void update_commutation(HallState hs),内部只做寄存器写入和状态缓存更新 - 霍尔采样和换向决策分离:定时器中断负责采样并置标志;主循环或高优先级任务检查标志后调用换向函数
性能提示:STM32F4 在 168MHz 下,一次查表+6 个 GPIO 写入约 200ns,完全满足 20kHz 以上换向频率需求。但若混入 printf 或浮点运算,延迟立刻升至微秒级,破坏时序。
真正难的从来不是写出六步逻辑,而是让每一次换向都精准落在磁场与转子夹角最优的那几度内——这取决于霍尔安装、PCB 布线、死区设置、甚至 MOS 栅极电阻的匹配程度。


















