STM32定时器翻转模式详解:多路频率和占空比PWM生成

在STM32定时器配置中,我们知道可以将定时器配置为PWM输出模式,也叫输出比较模式,通过修改ARR寄存器中的值可以改变PWM周期,通过修改CCR寄存器中的值可以修改,PWM的占空比,但是这种普通的PWM输出模式较为单一,能输出PWM的定时器有4个通道,这种方式只能够产生4路周期相等的PWM,也就是频率都一直,虽然可以改变CCR寄存器的值来调节不同占空比,但是在一些特殊应用上也会存在弊端。例如控制多台步进电机加减速等,这时候就需要多路不同频率的PWM来进行控制了,因此用普通的输出比较模式不能实现多路不同频率PWM波。

阅读过STM32官方手册的就知道,定时器还有一种模式,翻转模式,就是将定时器输出模式设置为TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;

首先说一下TIM_OCMode_Toggle到底是什么,我们知道普通的PWM输出高低电平是根据CNT计数器中的值和CCR进行比较,若CNT<CCR则输出一种状态电平,当CNT介于CCR和ARR之间时,输出另一种状态电平。而TIM_OCMode_Toggle模式说白了就是当CNT=CCR时,输出引脚的电平会进行翻转,乍一看好像和普通的PWM输出没什么区别,但是可以通过TIM_OCMode_Toggle模式进入中断后重新设置CCR寄存器中的值,到这里可能会有点搞不懂了,为什么进入中断重新设置CCR寄存器中的值就可以改变PWM周期、占空比呢?这个中断又是什么时候进入的呢?

接下来逐一进行讲解,TIM_OCMode_Toggle模式什么时候进入中断,中断源又是什么?当CNT计数值=CCR时,会进入比较中断(在这里中断源是TIM_IT_CC1/2/3/4),也就是说当CNT计数值从0开始一直计数到CCR时,会触发TIM_IT_CC中断源,并进入中断,进入中断后我们该做的事情就是修改CCR寄存器中的值。我们先将此时的CCR寄存器中的值放入到一个变量中(TIM_GetCapture2(TIM2)),再在这个变量的基础上加上相同的数,同时赋给CCR寄存器中TIM_SetCompare3(TIM2),那么在下一次CNT=CCR时又会进行翻转电平。

我们举一个例子:若一开始定时器ARR为65535,CCR为9999,那么当CNT从0开始一直加到9999,我们假设电平为低电平,当加到9999时,会通过TIM_IT_CC中断源进入TIM中断(这个中断源只有当CNT计数值到CCR时才会触发)在中断服务函数中,我们将当前CCR的值放入capture这个变量中,再在capture值的基础上再加上相同的数(9999),同时作为新的CCR赋给定时器,这里叫CCR_NEW,CCR_NEW=9999+9999=19998。在CNT从9999计数19998时,此时CNT=CCR_NEM,又会进行翻转变为高电平,此时又会进入中断,在在CCR_NEW的基础上加上9999,以此类推,因此可以实现在一个周期内有多个脉冲出现,且占空比为50%。画一个图就更清楚了。

379147914d03419485f30f6aabb2148d.jpeg

 

 

 

物联沃分享整理
物联沃-IOTWORD物联网 » STM32定时器翻转模式详解:多路频率和占空比PWM生成

发表评论