前言

在上一章中,我们彻底搞懂了三相无刷电机的物理结构、磁场旋转逻辑、霍尔检测原理以及方波与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控制的核心意义。

 

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐