2. 换相算法核心实现:状态机设计、换相表构建、PWM占空比映射、死区时间插入

换相算法,说白了就是让电机转子跟着磁场转。你想想看,无刷直流电机没有电刷,那怎么知道什么时候该给哪一相通电?答案就是靠换相算法。这一章,我带你手把手把核心逻辑搭起来。

2.1 状态机设计:换相的灵魂骨架

换相的本质是一个有限状态机。每个状态对应一组功率管的开关组合。六步换相法,就是六个状态循环跑。

我个人习惯把状态机拆成三部分:

  • 状态跳转条件:霍尔信号边沿触发,或者无传感器下的反电动势过零点
  • 状态动作:更新PWM占空比、切换上下桥臂
  • 状态保护:非法状态检测、超时复位

我在项目中遇到过一个问题:霍尔传感器安装有偏差,导致状态跳转提前或滞后。后来我加了一个软件滤波,连续三次采样一致才跳转,问题就解决了。

核心原则:状态机必须在一个确定的时间窗口内完成跳转,否则电流波形会畸变。我一般把状态切换放在PWM周期起始中断里做,保证确定性。

2.2 换相表构建:从霍尔到功率管的映射

换相表本质上是一张查找表。输入是霍尔信号组合,输出是六路PWM的控制字。我见过有人用if-else写,代码又长又容易出错。用查表法,清晰且高效。

以三相无刷电机为例,霍尔信号有6个有效组合(另外2个是非法状态)。换相表长这样:

霍尔值 (H3 H2 H1) 上桥臂导通 下桥臂导通 换相状态编号
101UV0
100UW1
110VW2
010VU3
011WU4
001WV5

代码实现很简单:

// 换相表:索引为霍尔值,内容为PWM控制字
const uint16_t commutation_table[8] = {
    0x0000, // 000: 非法
    0x0024, // 001: W-V
    0x0018, // 010: V-U
    0x0000, // 011: 非法
    0x000C, // 100: U-W
    0x0006, // 101: U-V
    0x0003, // 110: V-W
    0x0000  // 111: 非法
};

小技巧:换相表里把非法状态映射到全关断,这样即使霍尔信号异常,也不会烧管子。我曾经因为霍尔线序接反,查表查到了非法状态,幸好有这个保护。

2.3 PWM占空比映射:让电机转得稳

换相只是告诉电机「该哪相通电了」,但转多快,由PWM占空比决定。占空比映射,就是把速度指令换算成实际的PWM比较值。

我常用的映射方式有两种:

  • 线性映射:占空比 = (目标转速 / 最大转速) × 100%。简单,但低速时扭矩不足。
  • 带补偿的映射:考虑反电动势影响,低速时适当提高占空比。我一般加一个查表补偿,效果比纯线性好很多。

实际代码里,我习惯把占空比和换相状态绑定在一起更新:

void motor_commutate(uint8_t hall_value, uint16_t duty_cycle) {
    uint16_t pwm_word = commutation_table[hall_value & 0x07];
    // 将占空比写入对应通道
    TIM1->CCR1 = (pwm_word & 0x01) ? duty_cycle : 0;
    TIM1->CCR2 = (pwm_word & 0x02) ? duty_cycle : 0;
    TIM1->CCR3 = (pwm_word & 0x04) ? duty_cycle : 0;
}

注意:占空比突变会导致电流冲击。我建议每次换相时,占空比不要一步到位,而是用斜坡函数平滑过渡。否则电机可能会「咯噔」一下。

2.4 死区时间插入:防止上下桥臂直通

死区时间,是功率管换相时的「安全间隔」。上下桥臂不能同时导通,否则就是短路。我刚开始做电机驱动时,觉得死区时间越小越好,结果炸过一次MOS管。嗯,从那以后我再也不敢忽视死区了。

死区时间的设置原则:

  • 最小值:大于功率管的关断延迟 + 开通延迟
  • 典型值:500ns ~ 2μs,看MOS管规格
  • 最大值:不能影响换相时序,否则电流波形畸变

在STM32等MCU上,死区时间由定时器的刹车和死区寄存器配置:

// 以STM32 TIM1为例,设置1μs死区时间
TIM1->BDTR = TIM_BDTR_DTG_0 | (100 - 1); // 假设时钟频率100MHz,死区1μs

避坑指南:我曾经在高速电机上把死区设成2μs,结果换相窗口被压缩,效率下降5%。后来我根据MOS管的datasheet重新计算,改成800ns,问题解决。死区不是越大越安全,够用就好。

2.5 本章知识体系总览

下面这张图,把换相算法的四个核心模块串起来了。你可以把它当作调试时的路线图。

换相算法核心模块关系图 换相算法核心模块关系图 换相算法 状态机设计 换相表构建 PWM占空比映射 死区时间插入 霍尔信号边沿触发 状态跳转与保护 非法状态检测 霍尔值→PWM控制字 6个有效组合 2个非法组合保护 速度指令→占空比 线性/补偿映射 斜坡平滑过渡 防止上下桥臂直通 500ns~2μs典型值 根据MOS管规格调整 四个模块协同工作,缺一不可

状态机是大脑,决定什么时候换;换相表是地图,告诉你怎么换;PWM映射是油门,控制转多快;死区是安全带,防止出事故。这四个模块配合好了,电机才能转得顺、转得稳。

调试建议:先把状态机和换相表调通,用示波器看相电流波形。波形对称了,再调PWM映射和死区。我每次都是这么干的,效率最高。