第三章 STM32定时器详解:高级定时器TIM1/TIM8的互补输出、死区插入、刹车功能
各位同学,今天我们来聊聊STM32里最“高级”的定时器——TIM1和TIM8。说实话,我刚接触STM32那会儿,看到“高级定时器”这几个字,心里就犯怵。总觉得它比通用定时器复杂得多,用起来肯定很麻烦。但后来真正做项目了才发现,这玩意儿简直就是为电机控制量身定做的。
为什么这么说?你想想看,无刷直流电机驱动最核心的需求是什么?
- 需要两路互补的PWM信号来控制上下桥臂
- 上下桥臂切换时不能直通,得插入死区时间
- 遇到故障要能快速关断,保护MOS管
这三个需求,高级定时器全给你包圆了。通用定时器也能输出PWM,但要做互补输出和死区插入,你得自己写软件逻辑,费时费力还容易出bug。而TIM1/TIM8,硬件上就支持这些功能。
3.1 互补输出:一对天生的搭档
什么叫互补输出?说白了就是两路PWM信号,一路高电平的时候另一路必须是低电平,反过来也一样。这在电机驱动里太常见了——上桥臂导通时下桥臂必须关断,否则就直通烧管子。
高级定时器的每个通道都有两个输出引脚:CHx和CHxN。CHx是正常输出,CHxN是它的互补输出。你只需要配置好CHx的PWM参数,CHxN会自动生成相反的波形。
核心配置代码示例:
// 使能TIM1的互补输出
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; // 使能CH1
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; // 使能CH1N
TIM_OC1Init(TIM1, &TIM_OCInitStructure);
我在项目中遇到过一个问题:配置好互补输出后,发现CHxN引脚死活没波形。查了半天手册才发现,高级定时器的互补输出默认是禁用的,必须显式使能TIM_OutputNState。嗯,这个坑我替你们踩过了。
3.2 死区插入:给MOS管留点喘息空间
死区时间,这是电机驱动里最容易被忽视但又极其重要的参数。你想想,上桥臂关断和下桥臂导通之间,如果没有任何延迟,会发生什么?
MOS管的关断需要时间,导通也需要时间。如果上桥臂还没完全关断,下桥臂就导通了,那电源就直接通过两个MOS管短路了。这就是所谓的“直通”现象,轻则发热严重,重则直接炸管。
死区插入就是在上桥臂关断和下桥臂导通之间插入一段“空白期”,让两个管子都处于关断状态。这段空白期就是死区时间。
高级定时器的死区插入是硬件自动完成的。你只需要设置一个寄存器值,TIM1/TIM8就会自动在互补信号之间插入死区。
死区时间计算公式:
死区时间 = DTG[7:0] × Tdtg
其中Tdtg取决于死区配置位的设置,可以是tCK_INT的倍数,也可以是tCK_INT的2倍或8倍。
我个人习惯把死区时间设置在1-3微秒之间。具体多少合适,得看你用的MOS管型号和驱动电路。我曾经在一个项目中把死区设得太小(只有200纳秒),结果MOS管温升特别快,手都不敢摸。后来把死区调到2微秒,问题就解决了。
注意:死区时间不是越大越好。死区太大,会导致电机换相延迟,影响效率,甚至引起电流波形畸变。找到那个“刚刚好”的值,才是关键。
3.3 刹车功能:紧急情况下的保命符
刹车功能,英文叫Break,说白了就是紧急停止。电机运行过程中,如果出现故障——比如过流、过温、编码器丢失——你需要立刻关断所有MOS管,让电机停下来。
用软件来做这件事?不行。软件有延迟,中断响应需要时间,万一主程序卡死了呢?所以高级定时器提供了硬件刹车功能。你只需要把故障信号接到刹车输入引脚(BKIN),一旦电平触发,定时器会立即停止所有PWM输出,并且把输出引脚拉到安全状态。
刹车功能有两种模式:
| 模式 | 说明 | 应用场景 |
|---|---|---|
| 自动恢复模式 | 刹车信号消失后,PWM自动恢复输出 | 短暂故障,如瞬间过流 |
| 锁定模式 | 刹车后必须软件清除标志位才能恢复 | 严重故障,如MOS管击穿 |
我个人强烈建议在电机驱动项目中使用锁定模式。为什么?因为自动恢复模式太危险了。你想想,如果电机因为堵转导致过流,刹车后故障信号消失,PWM自动恢复,电机又转起来,结果又过流...这样反复震荡,很容易把MOS管烧掉。
刹车功能配置示例:
// 配置刹车功能
TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable; // 运行状态下空闲电平
TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable; // 空闲状态下空闲电平
TIM_BDTRInitStructure.TIM_Break = TIM_Break_Enable; // 使能刹车功能
TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High; // 刹车输入高电平有效
TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Disable; // 锁定模式
TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);
3.4 知识体系总览
说了这么多,我们来梳理一下高级定时器在电机控制中的核心逻辑。下面这张图能帮你快速理解整个体系:
从这张图可以看得很清楚:高级定时器的三个核心功能——互补输出、死区插入、刹车功能——是相互配合的。互补输出保证上下桥臂信号相反,死区插入防止直通,刹车功能应对突发故障。三者缺一不可。
3.5 实际项目中的配置顺序
讲了这么多理论,我们来点实际的。在项目中配置高级定时器,我建议按这个顺序来:
- 先配置时基:设置预分频器和自动重装载值,确定PWM频率
- 再配置输出比较:设置占空比,使能CHx和CHxN
- 然后配置死区:在BDTR寄存器中设置死区时间
- 最后配置刹车:设置刹车极性、模式,使能刹车功能
- 别忘了使能主输出:TIM_CtrlPWMOutputs(TIM1, ENABLE);
重要提醒:高级定时器有一个“主输出使能”位(MOE),在BDTR寄存器里。如果你配置了所有东西但PWM就是不出来,99%的概率是忘了使能MOE。我当年在这个坑里爬了整整一个下午。
好了,关于高级定时器的互补输出、死区插入和刹车功能,就讲到这里。这些功能是电机驱动的基础,也是STM32相比其他MCU的一大优势。掌握了它们,你离一个合格的电机驱动工程师就不远了。
公众号:蓝海资料掘金营,微信deep3321