电机控制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(灵活控制换相时机)。
混合模式:某些应用可能同时使用两种方式,如硬件触发为主,软件触发用于故障恢复。