1)实验平台:正点原子stm32mini 开发板
2)摘自《正点原子STM32 不完全手册(HAL 库版)》关注官方微信号公众号,获取更多资料:正点原子
第十三章 PWM 输出实验
上一章,我们介绍了 STM32 的通用定时器 TIM3,用该定时器的中断来控制 DS1 的闪烁,
这一章,我们将向大家介绍如何使用 STM32 的定时器来产生 PWM 输出。在本章中,我们将使
用 TIM1 的通道 1 产生 PWM 来控制 DS0 的亮度。本章分为如下几个部分:
13.1 PWM 简介
13.2 硬件设计
13.3 软件设计
13.4 下载验证
13.1 PWM 简介
脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用
微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽
度的控制,PWM 原理如图 13.1.1 所示:
图 13.1.1 就是一个简单的 PWM 原理示意图。图中,我们假定定时器工作在向上计数 PWM
模式,且当 CNT=CCRx 时输出 1。那么就可以得到如上的 PWM
示意图:当 CNT 值小于 CCRx 的时候,IO 输出低电平(0),当 CNT 值大于等于 CCRx 的时候,
IO 输出高电平(1),当 CNT 达到 ARR 值的时候,重新归零,然后重新向上计数,依次循环。
改变 CCRx 的值,就可以改变 PWM 输出的占空比,改变 ARR 的值,就可以改变 PWM 输出的
频率,这就是 PWM 输出的原理。
STM32 的定时器除了 TIM6 和 7。其他的定时器都可以用来产生 PWM 输出。其中高级定
时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出。而通用定时器也能同时产生多达 4
路的 PWM 输出,这样,STM32 最多可以同时产生 30 路 PWM 输出!这里我们仅使用 TIM1
的 CH1 产生一路 PWM 输出。如果要产生多路输出,大家可以根据我们的代码稍作修改即可。
要使 STM32 的高级定时器 TIM1 产生 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。该寄存器
的各位描述如图 13.1.2 所示:
该寄存器的有些位在不同模式下,功能不一样,所以在图 13.1.2 中,我们把寄存器分了 2
层,上面一层对应输出时的设置而下面的则对应输入时的设置。关于该寄存器的详细说明,请
参考《STM32 参考手册》第 240 页,13.4.7 一节。这里我们需要说明的是模式设置位 OCxM,
此部分由 3 位组成。总共可以配置成 7 种模式,我们使用的是 PWM 模式,这 3 位必须设置为
110/111。这两种 PWM 模式的区别就是输出电平的极性相反。另外 CCxS 用于设置通道的方向
(输入/输出)默认设置为 0,就是设置通道作为输出使用。
接下