STM32 通用定时器的输出PWM功能 学习笔记

时间:2021-05-23 23:25:39

首先来说,你要使用PWM模式你得先选择用哪个定时器来输出PWM吧!除了TIM6、TIM7这两个普通的定时器无法输出PWM外,其余的定时器都可以输出PWM,每个通用定时器可以输出4路PWM,高级定时器TIM1、TIM8每个可输出7路PWM。选好定时器及通道后,下一步就是要使能定时器的时钟。先贴代码,再对每条代码做详细分析。

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高(也就是选择有效电平,这里是高电平为有效电平)
TIM_OC2Init(TIM3, &TIM_OCInitStructure);   //根据T指定的参数初始化外设TIM3 OC2
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIM3在CCR2上的预装载寄存器,即TIM3_CCR2的预装载值在更新事件到来时才能被传送至当前寄存器中。
TIM_Cmd(TIM3, ENABLE);  //使能TIM3

这6句话就把PWM的通道配置好了,现在来解释每一条代码:
为什么选择的是PWM2模式呢?为什么不选择PWM1模式呢?两者又有什么区别呢?
下面我们就一探究竟,PWM1和PWM2模式是由CCMRx的OCxM来决定的,因为我们选择的是是通道2,所以设置的是OC2M,再看相关介绍OCxM[2:0]:

110:PWM模式1- 在向上计数时,一旦TIMx_CNT<TIMx_CCRx时通道为有效电平,否则为无效电平;
在向下计数时,一旦TIMx_CNT>TIMx_CCRx时通道x为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。

111:PWM模式2- 在向上计数时,一旦TIMx_CNT<TIMx_CCRx时通道为无效电平,否则为有效电平;
在向下计数时,一旦TIMx_CNT>TIMx_CCRx时通道x为有效电平,否则为无效电平。

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; 这句就是用来选有效电平,HIGH就代表1为有效电平。

TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIM3在CCR2上的预装载寄存器,
即TIM3_CCR2的预装载值在更新事件到来时才能被传送至当前寄存器中。
这句话是说,CCR2中的预装载值何时被传送到当前的CNT寄存器中,这里我们选择的是当更新事件到来的时候才装载,
追踪寄存器的设置可知,原来设置的是CCMR1的OC2PE,其实还有一种方式是立即装载看手册:
OC1PE:输出比较1预装载使能(Output compare 1 preload enable)  位3 
0:禁止TIMx_CCR1寄存器的预装载功能,可随时写入TIMx_CCR1寄存器,并且新写入的数值立即起作用。
1:开启TIMx_CCR1寄存器的预装载功能,读写操作仅对预装载寄存器操作,
TIMx_CCR1的预装载值在更新事件到来时被传送至当前寄存器中。

TIM_OC1PreloadConfig(),TIM_ARRPreloadConfig();这两个函数控制的是ccr1和arr的预装在使能,使能和失能的区别就是:
使能的时候这两个储存期的读写需要等待有更新事件发生时才能被改变(比如计数溢出就是更新时间)。失能的时候可以直接进行读写而没有延迟。


另外在运行当中想要改变pwm的频率和占空比调用:TIM_SetAutoreload();TIM_SetCompare1()这两个函数就可以了。
学习后发现stm32的定时器功能确实很强大,小总结一下方便以后使用的时候做参考。
Stm32定时器一共分为三种:tim1和tim8是高级定时器,6和7是基本定时器,2—5是通用定时器。从名字就可以看得出来主要功能上的差异。
今天我主要是用定时器做pwm输出,所以总结也主要是针对pwm方面的。先大致说下通用和高级定时器的区别。通用的可以输出四路pwm信号互不影响。高级定时器可以输出三对互补pwm信号外加ch4通道,也就是一共七路。所以这样算下来stm32一共可以生成4*5+7*2=30路pwm信号。接下来还有功能上的区别:通用定时器的pwm信号比较简单,就是普通的调节占空比调节频率(别的不常用到的没去深究);高级定时器的还带有互补输出功能,同时互补信号可以插入死区,也可以使能刹车功能,从这些看来高级定时器的pwm天生就是用来控制电机的。