1.PWM 简介
STM32 的定时器除了 TIM6 和 7。其他的定时器都可以用来产生 PWM 输出。
其中高级定
时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出。而通用定时器也能同时产生多达 4
路的 PWM 输出,这样,STM32 最多可以同时产生 30 路 PWM 输出!
要使 STM32 的高级定时器 TIM2产生 PWM 输出,除了上一章介绍的几个寄存器(ARR、
PSC、CR1 等)外,我们还会用到 4 个寄存器(通用定时器则只需要 3 个) ,来控制 PWM 的输
出。这四个寄存器分别是:捕获/比较模式寄存器(TIMx_CCMR1/2) 、捕获/比较使能寄存器
(TIMx_CCER) 、捕获/比较寄存器(TIMx_CCR1~4)以及刹车和死区寄存器(TIMx_BDTR) 。
首先是
捕获/比较模式寄存器(TIMx_CCMR1/2),该寄存器总共有 2 个,TIMx _CCMR1
和 TIMx _CCMR2。TIMx_CCMR1 控制 CH1 和 2,而 TIMx_CCMR2 控制 CH3 和 4。该寄存器
的各位描述如图:
于该寄存器的详细说明,请
参考《STM32 参考手册》第 240 页,13.4.7 一节。
设置位 OCxM,
此部分由 3 位组成。总共可以配置成 7 种模式,我们使用的是 PWM 模式,这 3 位必须设置为
110/111。这两种 PWM 模式的区别就是输出电平的极性相反。另外 CCxS 用于设置通道的方向
(输入/输出)默认设置为 0,就是设置通道作为输出使用。
接下来,我们介绍
捕获/比较使能寄存器(TIMx_CCER),该寄存器控制着各个输入输出通
道的开关。该寄存器的各位描述如图:
该寄存器比较简单,我们这里只用到了 CC1E 位,该位是输入/捕获 1 输出使能位,要想
PWM 从 IO 口输出,这个位必须设置为 1,所以我们需要设置该位为 1。该寄存器更详细的介
绍了,请参考《STM32 参考手册》第 244 页,13.4.9 这一节。
最后,我们介绍一下
捕获/比较寄存器(TIMx_CCR1~4),该寄存器总共有 4 个,对应 4 个
输通道 CH1~4。因为这 4 个寄存器都差不多,我们仅以 TIMx_CCR1 为例介绍,该寄存器的各
位描述如图 :
在输出模式下,该寄存器的值与 CNT 的值比较,根据比较结果产生相应动作。利用这点
我们通过修改这个寄存器的值,就可以控制 PWM 的输出脉宽了。
我们使用的是 TIM2
的通道2和3,所以我们需要修改 TIM2_CCR2和
TIM2_CCR3
以实现脉宽控制。
如果是通用定时器,则配置以上三个寄存器就够了,但是如果是
高级定时器,则还需要配
置:刹车和死区寄存器(TIMx_BDTR),该寄存器各位描述如图 :
该寄存器,我们只需要关注最高位:MOE 位,要想
高级定时器的 PWM 正常输出,则必须
设置 MOE 位为 1,否则不会有输出。注意:通用定时器不需要配置这个。其他位我们这里就不
详细介绍了,请参考《STM32 参考手册》第 248 页,13.4.18 这一节。
2.配置步骤
1 ) 开启 TIM2 时钟,配置 PA1、2为复用输出。
要使用 TIM2, 我们必须先开启 TIM2的时钟,
这里我们还要配置 PA1、2 为复用输出(当然还要时能 PORTA 的时钟) ,这是因为 TIM2_CH2 通
道将使用 PA1的复用功能作为输出。库函数使能 TIM2 时钟的方法是:
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);