第2章:六步换相原理全解+STM32工程实战
前言
在上一章中,我们彻底搞懂了三相无刷电机的物理结构、磁场旋转逻辑、霍尔检测原理以及方波与FOC驱动的核心区别。从本章开始,我们正式进入工程落地实战阶段。
六步换相(方波驱动)是BLDC控制的入门核心,也是FOC控制的基础铺垫。绝大多数电机控制初学者的第一个误区就是:只会照搬换相表,不懂扇区切换逻辑,导致后续遇到电机抖动、不转、反转、高速异响、失步等问题完全无从排查。
1. 六步换相核心本质
1.1 为什么需要六步换相?
回顾上一章核心知识点:无刷电机取消了机械电刷,无法自动完成线圈电流换向,必须依靠单片机检测转子位置,主动改变定子绕组通电状态,维持旋转磁场持续转动,拖动永磁转子旋转。
三相BLDC配备3路霍尔传感器,用于实时反馈转子磁极位置。3路霍尔信号高低电平组合,天然只有6种有效状态,对应电机电气圆周的6个均等区间,我们将这6个区间定义为6个电气扇区。
单片机根据当前霍尔对应的扇区,切换对应的桥臂导通组合,完成一次换相。6个扇区循环切换,就是六步换相的完整逻辑。
1.2 为什么不是3步、12步,偏偏是6步?
3路霍尔传感器,每路输出0/1两种电平,理论上存在8种组合:000、001、010、011、100、101、110、111。
但在无刷电机硬件设计中,000和111为无效状态:
-
111:三个霍尔同时检测到N极或S极,位置模糊,无参考意义
-
000:三个霍尔无信号输出,属于异常工况
剔除2个无效状态后,仅剩6种有效霍尔组合,对应6个电气扇区,这就是六步换相的物理来源,并非人为定义的规则。
1.3 六步换相驱动核心规则
为保证磁场稳定旋转、力矩方向一致,六步换相严格遵循单时刻两相导通规则:
任意时刻,仅导通一相上桥臂、一相下桥臂,剩余一相悬空不导通
该规则的核心作用:固定电流流向、生成固定方向磁场矢量、保证转子持续同向旋转,同时避免多相导通造成的磁场紊乱、电机抖动、发热严重等问题。
2. 霍尔信号与六扇区导通表(原理推导+标准真值表)
2.1 霍尔信号定义
定义电机三路霍尔信号为 HALL_U、HALL_V、HALL_W,对应单片机三个GPIO输入引脚,高电平为1,低电平为0。六路有效信号组合均匀分布在360°电角度内,每个扇区占据60°电角度。
2.2 标准六扇区导通真值表
结合工业通用BLDC驱动标准,整理完整扇区、霍尔状态、导通桥臂、电流流向、磁场方向对应关系

2.3 换相逻辑核心要点
电机正向旋转时,扇区按照 1→2→3→4→5→6→1 循环切换;反向旋转时,扇区逆向循环切换。每一次扇区切换,就是一次换相动作,磁场矢量步进60°电角度,宏观表现为电机持续旋转。
3. 死区时间(DeadTime)深度解析
3.1 死区时间存在的必要性
三相全桥驱动电路中,同一相的上下MOS管为互补导通模式。由于MOS管存在开关延迟、结电容充放电特性,关闭管子不会瞬间截止,打开管子不会瞬间导通。
如果无延时直接切换互补PWM,会出现上下管短暂同时导通的情况,造成电源母线直通短路,瞬间烧毁MOS管、驱动芯片甚至电源。
为规避该风险,在互补PWM切换过程中,需要插入一段无输出的空白延时时间,这段时间就是死区时间。
3.2 死区时间参数选择标准
-
常规MOS管驱动:死区时间设置 1~3μs
-
高速开关、大功率MOS管:死区时间设置 3~5μs
-
死区过小:无法规避直通风险,存在炸管隐患
-
死区过大:有效导通时间缩短、电机力矩下降、低速抖动加剧、发热增加
3.3 STM32高级定时器死区机制
STM32的TIM1/TIM8高级定时器自带硬件死区生成功能,无需软件延时,硬件自动插入死区,时序精准、无误差、不占用CPU资源,是BLDC驱动的唯一优选方案。
4. STM32CubeMX 完整工程配置(标准适配BLDC)
4.1 基础配置
主控芯片:STM32F103C8T6(通用性价比方案,适配所有入门BLDC项目)
系统时钟:72MHz(标准主频,保证PWM精度与响应速度)
4.2 定时器PWM配置(TIM1)
核心配置参数(工程通用标准):
-
定时器:TIM1(高级定时器,支持互补PWM+硬件死区)
-
时钟分频:不分频,72MHz全速运行
-
计数模式:中心对齐模式1(电机驱动最优模式,谐波最小)
-
PWM频率:10kHz(兼顾噪音、响应、发热的通用频率)
-
预分频值:0,自动重装载值:7199 → 72MHz/(7199+1)=10kHz
-
输出通道:CH1/CH2/CH3 三路PWM,对应U/V/W上桥臂
-
互补通道:CH1N/CH2N/CH3N 三路互补PWM,对应U/V/W下桥臂
-
死区时间:100(对应2.7μs,适配常规MOS管)
4.3 霍尔引脚GPIO配置
HALL_U、HALL_V、HALL_W 配置为上拉输入模式,避免悬空电平干扰,保证霍尔信号采集稳定。
4.4 中断配置
开启TIM1更新中断,用于定时执行换相逻辑,保证控制周期稳定,避免CPU阻塞导致的换相延迟。
5. 工程代码(HAL库)
5.1 定时器PWM+死区初始化代码
本代码为CubeMX自动生成版本,适配六步换相。
// TIM1 PWM初始化 三路互补PWM+硬件死区
void MX_TIM1_Init(void)
{
htim1.Instance = TIM1;
htim1.Init.Prescaler = 0; // 预分频0,72MHz时钟
htim1.Init.CounterMode = TIM_COUNTERMODE_CENTERALIGNED1; // 中心对齐,优化谐波
htim1.Init.Period = 7199; // 自动重装载值,10kHz PWM频率
htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim1.Init.RepetitionCounter = 0;
htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; // 开启自动重装载缓存
if (HAL_TIM_PWM_Init(&htim1) != HAL_OK)
{
Error_Handler();
}
// PWM通道基础配置
sConfigOC.OCMode = TIM_OCMODE_PWM1; // PWM1模式,低电平有效导通
sConfigOC.Pulse = 0; // 初始占空比0,电机静止
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; // 主通道高电平有效
sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH; // 互补通道高电平有效
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; // 关闭快速模式,保证时序稳定
sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;// 空闲状态主通道低电平
sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;// 空闲状态互补通道低电平
// 配置三路PWM通道
if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
{
Error_Handler();
}
if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
{
Error_Handler();
}
if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
{
Error_Handler();
}
// 死区与刹车功能配置
sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
sBreakDeadTimeConfig.DeadTime = 100; // 硬件死区2.7μs,防上下管直通
sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_ENABLE; // 开启自动输出
if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK)
{
Error_Handler();
}
// 启动三路主PWM与互补PWM
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2);
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_3);
HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_1);
HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_2);
HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_3);
}
5.2 霍尔信号读取函数
读取三路霍尔GPIO电平,组合为0~7的数值,用于匹配扇区换相表,代码简洁高效、无冗余运算。
// 读取霍尔组合状态,返回值0~7
uint8_t BLDC_Read_Hall(void)
{
uint8_t hall_state = 0;
// 读取三路霍尔电平,位运算组合状态
hall_state |= HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) << 2; // HALL_U 高位
hall_state |= HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1) << 1; // HALL_V 中位
hall_state |= HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_2); // HALL_W 低位
return hall_state;
}
5.3 核心换相表与换相执行函数
换相表经过工程校准,过滤无效霍尔状态,精准匹配6个扇区,实现稳定换相。占空比可自由调节,控制电机转速。
// 霍尔状态映射扇区表 索引0~7 对应无效/有效扇区
uint8_t hall_sector_table[8] = {0,6,2,3,4,1,5,0};
uint16_t bldc_pwm_duty = 3600; // PWM占空比 0~7199 50%占空比
// BLDC六步换相核心执行函数
void BLDC_SixStep_Commute(void)
{
uint8_t hall_val = BLDC_Read_Hall(); // 读取当前霍尔状态
uint8_t sector = hall_sector_table[hall_val]; // 解析当前扇区
// 每次换相前清零所有PWM,避免残留电平导致抖动
TIM1->CCR1 = 0;
TIM1->CCR2 = 0;
TIM1->CCR3 = 0;
// 根据扇区执行对应导通逻辑
switch(sector)
{
case 1: TIM1->CCR1 = bldc_pwm_duty; break; // 扇区1: U+ W-
case 2: TIM1->CCR1 = bldc_pwm_duty; break; // 扇区2: U+ V-
case 3: TIM1->CCR2 = bldc_pwm_duty; break; // 扇区3: V+ W-
case 4: TIM1->CCR2 = bldc_pwm_duty; break; // 扇区4: V+ U-
case 5: TIM1->CCR3 = bldc_pwm_duty; break; // 扇区5: W+ U-
case 6: TIM1->CCR3 = bldc_pwm_duty; break; // 扇区6: W+ V-
default: break; // 无效状态,停止输出,保护电机
}
}
5.4 中断周期调用(稳定控制核心)
将换相函数放入定时器中断,固定10kHz控制周期,保证换相时序均匀、转速稳定,避免主循环卡顿影响控制精度。
// TIM2定时中断 10kHz 执行换相逻辑
void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
BLDC_SixStep_Commute(); // 周期性执行六步换相
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
}
}
5.5 主函数调用逻辑
int main(void)
{
// 底层初始化
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM1_Init();
MX_TIM2_Init();
HAL_TIM_Base_Start_IT(&htim2); // 开启定时中断
while (1)
{
// 主循环空转,所有控制由中断完成,保证时序稳定
}
}
6. 工程常见问题与精准解决方案
6.1 电机抖动不转
-
问题原因:霍尔引脚接反、换相表不匹配、死区时间过大、占空比过低
-
解决方案:核对霍尔引脚定义、校准换相表、微调死区时间、提高启动占空比
6.2 电机反转
-
问题原因:三相绕组接线顺序错误
-
解决方案:任意调换两相电机接线,或逆向修改换相表循环顺序
6.3 高速异响、发热严重
-
问题原因:死区时间过大、PWM频率过低、换相延迟
-
解决方案:优化死区参数、提升PWM频率、保证中断优先级
6.4 电机启动失步
-
问题原因:启动占空比太小、力矩不足、霍尔信号干扰
-
解决方案:设置阶梯启动占空比,逐步升压,增加霍尔信号滤波
7. 本章总结
本章拆解了六扇区的物理来源、导通逻辑、死区保护机制,完成了STM32全套配置与可商用工程代码开发。
通过本章学习,你不再是机械照搬换相代码,而是能够理解:换相时机、磁场变化、硬件保护、故障排查的全流程逻辑。
同时我们也明确了六步换相的短板:磁场跳跃式旋转、力矩脉动大、噪音高、高速性能差,这也是我们后续学习FOC控制的核心意义。
更多推荐



所有评论(0)