电机控制COM事件

1、电机控制中 COM(Commutation)事件的作用

  STM32 的高级定时器(如 TIM1/TIM8)在 PWM 模式(特别是带死区控制的互补 PWM)下,直接修改 PWM 寄存器(如 CCRx)可能会导致瞬时短路(例如上下管同时导通)

  COM 事件(换相事件)是 STM32 高级定时器(如 TIM1/TIM8)在 电机控制(BLDC/PMSM) 中的关键功能,主要用于 安全切换 PWM 输出状态,避免硬件冲突(如上下管直通)
  1.1、核心作用:安全换相
  在无刷直流电机(BLDC) 或 永磁同步电机(PMSM) 控制中,换相(Commutation)是指切换电机绕组的通电顺序,使转子持续旋转。

  当触发 COM 事件时,定时器硬件会在 下一个 PWM 周期开始时 同步更新所有 PWM 通道的配置(包括使能状态、占空比、极性等),确保换相过程中不会出现上下管直通(Shoot-Through)。
  COM 事件的作用是确保 PWM 输出的同步更新,防止以下问题:
    上下管直通(Shoot-Through):高侧和低侧 MOS 管同时导通,导致短路烧毁驱动电路。
    PWM 信号不同步:直接修改 PWM 占空比或通道使能可能导致信号跳变不一致,引起电流震荡或电机抖动。

  如果没有 COM 事件:
    直接修改 PWM 寄存器可能会立即生效,导致:
      当前 PWM 周期内出现电平冲突(如高侧和低侧 MOSFET 短暂同时导通)。
      电机驱动电路损坏或电流尖峰。
  1.2、COM 事件的工作机制
  (1)硬件同步更新
    STM32 高级定时器(TIM1/TIM8)支持 影子寄存器(Shadow Register) 和 预装载(Preload) 功能。
    当 COM 事件触发时,所有待更新的 PWM 配置(如 CCRx 占空比、通道使能状态、死区时间等)会在 下一个 PWM 周期开始时 同步生效,而不是立即修改。
  (2)避免 PWM 信号冲突
    无 COM 事件:直接修改 CCRx 或 CHx 使能状态可能导致 PWM 信号在 当前周期中间 跳变,可能引起:
      高侧和低侧 MOS 管短暂同时导通(直通)。
      电机相电流突变,导致转矩波动或噪声。
    有 COM 事件:所有 PWM 修改会在 下一个周期边界 统一生效,确保换相安全。

  1.3、典型应用场景
  (1)六步换相(BLDC 控制)
    霍尔传感器检测转子位置,触发换相。
    硬件自动换相(HAL_TIMEx_ConfigCommutationEvent + TIM_COMMUTATION_TRGI):
      定时器自动管理 COM 事件,无需软件干预。
      软件换相(手动调用 HAL_TIM_GenerateEvent):
      需显式触发 COM 事件,确保 PWM 同步更新。
  (2)FOC(磁场定向控制)
    在 PMSM 控制中,COM 事件用于同步更新 PWM 占空比(CCRx),确保电流采样和 PWM 调制对齐。
  1.4、代码示例分析

// 修改 PWM 占空比和通道使能
__HAL_TIM_SET_COMPARE(&htimx_BLDCM, TIM_CHANNEL_1, duty);
HAL_TIM_PWM_Start(&htimx_BLDCM, TIM_CHANNEL_1);
通过 HAL_TIM_PWM_Start/Stop 和 __HAL_TIM_SET_COMPARE 修改了 PWM 通道的开关状态和占空比,但这些修改默认是异步的(可能立即生效,取决于定时器的配置)。
// 触发 COM 事件,同步更新 PWM 状态
HAL_TIM_GenerateEvent(&htimx_BLDCM, TIM_EVENTSOURCE_COM);
为什么需要 HAL_TIM_GenerateEvent?
即使已经修改了 PWM 参数,这些修改可能 不会立即生效(取决于 ARPE 预装载配置)。
COM 事件强制同步,确保所有 PWM 修改在下一个周期安全生效。
HAL_TIM_GenerateEvent(&htimx_BLDCM, TIM_EVENTSOURCE_COM) 会强制定时器在 下一个 PWM 周期边界 同步应用所有 pending 的配置变更,确保:
  新的 PWM 状态(如通道 1 开启、通道 3 关闭)同时生效。
  死区时间(Dead Time)被正确插入,避免上下管直通。

  1.5、硬件换相 vs. 软件换相
  硬件自动换相(如 HAL_TIMEx_ConfigCommutationEvent + 霍尔传感器触发):
    硬件会自动管理 COM 事件,无需手动调用 HAL_TIM_GenerateEvent。
  软件手动换相(如你的代码):
    需要 显式触发 COM 事件,因为软件直接操作 PWM 寄存器时,硬件无法自动同步状态。

  1.6、为什么已经换向了还要触发 COM 事件
  因为 HAL_TIM_PWM_Start/Stop 和 __HAL_TIM_SET_COMPARE 只是修改了寄存器的值,而 COM 事件是让这些修改安全生效的同步信号。
  类似于“提交”操作,确保所有变更在下一个 PWM 周期开始时同时应用。
  如果不触发 COM 事件:换相可能会在 PWM 周期中间生效,导致驱动电路异常或电机抖动。

  1.7、硬件触发 COM 事件的生成时机
  (1)霍尔信号边沿检测
    霍尔传感器(H1/H2/H3)的信号通过 定时器的输入捕获(TIMx_IC) 或 外部中断(EXTI) 被检测到。
    当 霍尔信号状态变化(例如 001 → 011)时,定时器会检测到 跳变沿(上升沿/下降沿)。
  (2)触发信号(TRGI)生成
    霍尔信号的变化会被映射到定时器的 内部触发输入(TIxFPx 或 ITRx),例如:
    如果霍尔传感器连接至 TIMx_CH1/CH2/CH3,则霍尔跳变会触发 TI1FP1/TI2FP2/TI3FP3。
    如果使用 TIMx_ETR 引脚,则可通过外部信号触发。
  (3)硬件自动触发 COM 事件
    当 TRGI 信号有效 时,定时器硬件会自动:
      锁存当前的霍尔状态(存储到 TIMx_CCRx 或 TIMx_SMCR)。
      生成 COM 事件(TIM_EVENTSOURCE_COM)。
      在下一个 PWM 周期边界 同步更新 PWM 输出(避免直通)。

  1.8、COM事件的执行顺序

  在 STM32 的 硬件触发换相(Hardware Commutation) 模式下,当 COM 事件配置为硬件触发(TIM_COMMUTATION_TRGI) 并与 霍尔传感器触发 连接时,事件的执行顺序如下:
  1.8.1、关键执行顺序
  (1)霍尔信号跳变触发硬件中断
    霍尔传感器信号变化(例如 H1/H2/H3 从 001 → 011)。
    定时器输入捕获(IC)检测到跳变,触发 HAL_TIM_IC_CaptureCallback 中断。
  (2)硬件自动生成 COM 事件
    在 HAL_TIM_IC_CaptureCallback 执行之前,硬件会 先自动生成 COM 事件(如果配置了 TIM_COMMUTATION_TRGI)。
    COM 事件会在 下一个 PWM 周期边界 同步更新 PWM 输出(避免上下管直通)。
  (3)进入 HAL_TIM_IC_CaptureCallback 执行换相控制
    在 COM 事件 已生成但未生效(等待 PWM 周期边界)时,CPU 会执行 HAL_TIM_IC_CaptureCallback,进行换相逻辑处理(如计算新占空比、更新 CCRx 等)。
  (4)PWM 同步更新
    在 下一个 PWM 周期开始时,硬件会自动应用 COM 事件,同步更新所有 PWM 通道状态(占空比、使能/关闭等)。

  1.8.2、关键点

  COM 事件优先于中断回调
    硬件检测到霍尔跳变后,先生成 COM 事件,再进入 HAL_TIM_IC_CaptureCallback。
    确保 PWM 状态变更的同步性,避免换相过程中的信号冲突。
  PWM 更新时机
    COM 事件触发的 PWM 更新 不会立即生效,而是在 下一个 PWM 周期边界 同步应用。
    在 HAL_TIM_IC_CaptureCallback 中修改的 CCRx 也会在同一个周期边界生效(需使能 ARPE 预装载)。

  1.9、关键配置选项

  1.10、总结
  COM 事件 = PWM 同步更新机制,确保换相安全,避免硬件冲突(如上下管直通)。
  必须使用 COM 事件的场景:
    手动修改 PWM 占空比或通道使能时(如六步换相)。
    需要避免上下管直通的场合(如 BLDC 驱动)。
    硬件自动换相(如霍尔触发) 可省去手动触发 COM 事件,但需正确配置定时器。
    通过合理使用 COM 事件,可以显著提高电机控制的可靠性和稳定性。

2、定时器内部触发的触发源,硬件触发COM事件

  TIM1 和 TIM8 从模式控制寄存器 (TIMx_SMCR)
  TIM1&TIM8 slave mode control register
  偏移地址: 0x08
  复位值: 0x0000

  从定时器响应,主定时器触发com事件。

3、配置COM事件(HAL_TIMEx_ConfigCommutationEvent)

  HAL_TIMEx_ConfigCommutationEvent 是 STM32 HAL库中的一个函数,主要用于配置定时器的换相事件(Commutation Event),这在电机控制应用中特别重要。
  3.1、主要功能
  换相事件配置:
    设置定时器在特定时刻产生换相信号
    用于控制无刷直流电机(BLDC)或永磁同步电机(PMSM)的换相时序
  硬件自动换相:
    允许定时器硬件自动管理电机换相过程
    减少CPU干预,提高换相精度和实时性
  相关功能配置:
    配置换相预装功能
    设置换相延迟
    管理换相中断和DMA请求
  3.2、典型应用场景
  该函数通常用于:
    六步换相控制的无刷电机驱动
    需要精确时序控制的功率电子应用
    需要硬件自动换相功能的高级电机控制

HAL_StatusTypeDef HAL_TIMEx_ConfigCommutationEvent(
TIM_HandleTypeDef *htim,
uint32_t InputTrigger,
uint32_t CommutationSource
);
参数说明:
htim:定时器句柄指针
InputTrigger:输入触发源选择
CommutationSource:换相源选择(内部或外部)

  这个函数是STM32高级定时器(如TIM1、TIM8等)特有的功能,标准定时器通常不支持此功能。

  3.3、换相源选择

  配置 HAL_TIMEx_ConfigCommutationEvent 函数时,TIM_COMMUTATION_TRGI 和 TIM_COMMUTATION_SOFTWARE 是两种不同的换相触发方式,主要区别如下:
  (1) TIM_COMMUTATION_TRGI(硬件触发换相)
    特点
    外部信号触发:换相事件由外部输入信号(如霍尔传感器、编码器或外部中断)触发。
    自动响应:定时器硬件自动检测触发信号(TRGI),并立即执行换相,无需 CPU 干预。
    低延迟:由于是硬件触发,换相响应速度快,适用于高速电机控制。
    适用于传感器控制:常用于无刷直流电机(BLDC)的霍尔传感器换相或编码器反馈控制。

    配置方式

HAL_TIMEx_ConfigCommutationEvent(
&htim1, // 定时器句柄(如 TIM1, TIM8)
TIM_TS_ITR2, // 输入触发源(如内部触发 ITRx 或外部引脚 TIx)
TIM_COMMUTATION_TRGI // 换相触发方式:硬件触发
);

  输入触发源(InputTrigger)需正确配置,如:

TIM_TS_ITR0~TIM_TS_ITR3(内部触发,来自其他定时器)
TIM_TS_TI1F_ED(外部引脚 TI1 边沿检测)
TIM_TS_TI2FP2(外部引脚 TI2 滤波后信号)

  (2)TIM_COMMUTATION_SOFTWARE(软件触发换相)
    特点
    软件控制:换相事件由软件调用 HAL_TIMEx_CommutationEvent() 触发。
    灵活性高:换相时机完全由程序控制,适用于开环控制或复杂算法(如 FOC)
    依赖 CPU:需要 CPU 参与,可能引入微小延迟,不适合超高速电机。
    适用于无传感器控制:如通过反电动势(BEMF)检测的软件换相。
    配置方式

HAL_TIMEx_ConfigCommutationEvent(
&htim1, // 定时器句柄
TIM_TS_NONE, // 软件触发时无硬件触发源,触发源不起作用,可以是任意的
TIM_COMMUTATION_SOFTWARE // 换相触发方式:软件触发
);

  使用时需手动触发换相:

HAL_TIMEx_CommutationEvent(&htim1); // 软件触发换相

  3.4、如何选择?
  高速 BLDC 电机(如无人机电调)→ TIM_COMMUTATION_TRGI(硬件触发,低延迟)。
  无传感器 FOC 控制(如变频器)→ TIM_COMMUTATION_SOFTWARE(灵活控制换相时机)。
  混合模式:某些应用可能同时使用两种方式,如硬件触发为主,软件触发用于故障恢复。

 

posted @ 2025-06-21 13:00  孤情剑客  阅读(420)  评论(0)    收藏  举报