笔记12:定时器输出PWM波

一. PWM概述

  1. PWM:是英文“Pulse Width Modulation” 的缩写,简称脉宽调制,就是对脉冲宽度的控制。
  2. 定时器的各路输出与其对应的IO口
    STM32F4 的定时器除了 TIM6 和 7。其他的定时器都可以用来产生 PWM 输出。其中高级定时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出。而通用定时器也能同时产生多达 4路的 PWM 输出!
    下图就是定时器各路输出对应的IO口。从图中可以看出,一路有可能对应多个IO。
    在这里插入图片描述
    二.工作原理
    在这里插入图片描述
    由上图我们可以看到:在利用定时器输出PWM波时,在定时器的计数器后增加了捕捉/比较寄存器。
    在这里插入图片描述
    由上图可以看到,计数器的值CNT首先与设定的CCRX的值进行比较,然后输出一个信号OCX_REF,其中,可以看到,输出模式是由TIMX_CCMRX寄存器的OCXM[2:0]位控制,可以决定是CNT>CCRX输出高电平还是CNT<CCRX输出高电平。
    以图中通道1为例:
    在这里插入图片描述
    上图中的有效状态又由另外一个位控制:

在这里插入图片描述
其中CCRX的值通过TIMX_CCRx设定:
在这里插入图片描述
当信号到达输出使能电路时:通过TIMX_CCER寄存器的CCXE位决定是否要输出或者捕获该信号。
在这里插入图片描述

在这里插入图片描述
由图中可以看出:改变CCRX的值就可以改变占空比,改变ARR的值就可以改变PWM波的周期和频率。由图可见:CCRX的值不得大于ARR的值,否则就不能输出正常的PWM波了。
总结:
在这里插入图片描述
其中APRE位是当ARR的值改变后什么时候生效的问题:ARPE=1,ARR立即生效;APRE=0,ARR下个比较周期生效。
对于正点原子STM32F4开发板来讲:使能预装载寄存器和使能自动重装载的预装载寄存器通过一下两句函数操作:
void TIM_OCxPreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);(OC后面的X值对应通道值)

void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);
三.PWM输出库函数
void TIM_OCxInit(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
在这里插入图片描述
红色字体为通用定时器的参数,其他参数都是高级定时器(TIM1和TIM8的参数)。
第一次初始化好之后,如若想要改变CCRX的值,可以调用这个函数:
void TIM_SetCompareX(TIM_TypeDef* TIMx, uint16_t Comparex);(Compare后面的X对应哪一个通道),就可以改变输出的PWM波的占空比了。ARR则是在定时器初始化的时候设置的。

猜你喜欢

转载自blog.csdn.net/weixin_46468790/article/details/107727805