STM32 学习笔记_TIME定时器1
STM32 systick做为系统时间使用(非简单延时)

STM32 学习笔记_定时器输出PWM

BRUCE posted @ 2012年10月01日 14:36 in STM32 , 5304 阅读

    前面写过定时器TIME的相关原理和使用,PWM其实也是在其基础上补充出来的功能。首先看定时器的框图

这是高级定时器的框图,通用定时器少了图中DTG寄存器,此寄存器是做为死区设置的,在这里暂且不管。
单单定时器应用而已,是在自动重装载寄存器与计数器所产生的中断中所应用的,而PWM输出是在其计数器后一级加入一比较器后再做输出的。多出的一级寄存器为CCRx 捕获/比较寄存器,与计数器CNT 一样同为16位的寄存器,当CNT的值小于CCRx 中的值时候输出高电平或低电平,当大于的时候反向,当然也可以设置CCRx 的值大于ARR重载寄存器的值,这样就是一个占空比为100% 或0%的输出,失去了PWM的意义。手册上说的由ARR来确定频率,这我认为的是ARR更应该定义为确定最大周期长度,而要设定频率和占空比精度的更关联的是PSC预分频寄存器,预分频寄存器把单个计数时间分得更小,就能获得同样周期的更精细的占空比千分之一或万分之一,PWM的周期也能设定得更短。所以PWM 的频率是由PSC和ARR两个寄存器所决定的,我的建议是首先初始化就设定好一个较小的PSC 值,计数器单个计数周期可达数十微秒级别的,这样便能由重载寄存器更好的控制PWM的 脉冲周期长度,短可达微秒单位,长可达毫秒。

下图为更为直接的PWM 输出关系图

ARR寄存器设定脉冲周期,CRRx设定占空比,CNT计数器最大值为ARR载入。
每组TIM有4组独立通道,图1中有表示的,CCR1、CCR2、CCR3、CCR4,即一组TIM可以输出4组 相同频率不同占空比的脉冲输出。

    PWM的控制寄存器有CCMR1、CCMR2 设定输入输出模式,CCMR1 高8位对应通道2,低8位对应通道1,CCMR2高8位对应通道4,低8位对应通道3。组要控制输出对应电平及计数方式等。
   CR2使能PWM 反向控制的输出使能。
   CCER 输出极性控制以及通道使能。
以上寄存器功能详细请看数据手册。

库函数分析:
    3.0的固件库 与PWM输出相关的设置函数是TIM_OCxInit。在原先TIM定时器的函数设定上再加上次函数的设定即可。3.0函数与2.0函数相比没了 TIM_Channel 这个数据类,转而多了个由TIM_OCInit变成了,TIM_OC1Init、TIM_OC2Init、TIM_OC3Init、TIM_OC4Init四个函数来设定。
    应用就没啥好说的,设一设,然后记得 TIM_CtrlPWMOutputs(TIMx,ENABLE); 就这样输出了。

PS:在做可调的PWM输出 最好以PSC 来改频率 CRRx改占空比。如果把PSC定死了,那么不管要修改频率还是占空比都要把ARR和CCRx 的值都重新算一遍。

 

 


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter