2. 换相算法核心实现:状态机设计、换相表构建、PWM占空比映射、死区时间插入
换相算法,说白了就是让电机转子跟着磁场转。你想想看,无刷直流电机没有电刷,那怎么知道什么时候该给哪一相通电?答案就是靠换相算法。这一章,我带你手把手把核心逻辑搭起来。
2.1 状态机设计:换相的灵魂骨架
换相的本质是一个有限状态机。每个状态对应一组功率管的开关组合。六步换相法,就是六个状态循环跑。
我个人习惯把状态机拆成三部分:
- 状态跳转条件:霍尔信号边沿触发,或者无传感器下的反电动势过零点
- 状态动作:更新PWM占空比、切换上下桥臂
- 状态保护:非法状态检测、超时复位
我在项目中遇到过一个问题:霍尔传感器安装有偏差,导致状态跳转提前或滞后。后来我加了一个软件滤波,连续三次采样一致才跳转,问题就解决了。
核心原则:状态机必须在一个确定的时间窗口内完成跳转,否则电流波形会畸变。我一般把状态切换放在PWM周期起始中断里做,保证确定性。
2.2 换相表构建:从霍尔到功率管的映射
换相表本质上是一张查找表。输入是霍尔信号组合,输出是六路PWM的控制字。我见过有人用if-else写,代码又长又容易出错。用查表法,清晰且高效。
以三相无刷电机为例,霍尔信号有6个有效组合(另外2个是非法状态)。换相表长这样:
| 霍尔值 (H3 H2 H1) | 上桥臂导通 | 下桥臂导通 | 换相状态编号 |
|---|---|---|---|
| 101 | U | V | 0 |
| 100 | U | W | 1 |
| 110 | V | W | 2 |
| 010 | V | U | 3 |
| 011 | W | U | 4 |
| 001 | W | V | 5 |
代码实现很简单:
// 换相表:索引为霍尔值,内容为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映射和死区。我每次都是这么干的,效率最高。