Bootstrap

八、stm32-TIM定时器(PWM)

一、固件库模板

见博客:stm32f103c8t6新建固件库模板(可自取)

二、准备资料

  1. 固件库模板
  2. MDK5开发环境
  3. stm32f103数据手册
  4. STM32定时器
  5. 利用固件库模板点灯工程(下面第三行,手动狗头)

实验程序已经发布到百度网盘,本文末有链接可以自取

STM32定时器查看这篇博客STM32定时器
stm32f103数据手册
一、利用固件库模板点灯(附模板及案例程序

三、 PWM简介

脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调试。是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。广泛应用在从测量、通信到功率控制与变换的许多领域中。

在这里插入图片描述

例如上图中,图b)是微处理输出的数字信号,实际上他接到电机等功率设备上时,效果相当于图a)。这就是PWM调制。例如输出占空比为50%,频率为10Hz的脉冲,高电平为3.3V.则其输出的模拟效果相当于输出一个1.65V的高电平。

脉冲调制有两个重要的参数,第一个就是输出频率频率越高,则模拟的效果越好。第二个就是占空比。占空比就是改变输出模拟效果的电压大小。占空比越大则模拟出的电压越大

STM32 的定时器除了 TIM6 和 7。其他的定时器都可以用来产生 PWM 输出。其中高级定时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出。而通用定时器也能同时产生多达 4路的 PWM 输出,这样, STM32 最多可以同时产生 30 路 PWM 输出!这里我们仅利用 TIM2 的CH2 产生一路 PWM 输出。如果要产生多路输出,大家可以根据我们的代码稍作修改即可。

我们首先通过对 PWM 相关的寄存器进行讲解,大家了解了定时器 TIM2 的 PWM 原理之后,我们再讲解怎么使用库函数产生 PWM 输出。

要使 STM32 的通用定时器 TIMx 产生 PWM 输出,除了上一章介绍的寄存器外,七、stm32-TIM定时器(通用定时器中断),我们还会用到 3 个寄存器 ,来控制 PWM 的。这三个寄存器分别是 :捕获/比较模式寄存器(TIMx_CCMR1/2)、捕获/比较使能寄存器(TIMx_CCER)、捕获/比较寄存器(TIMx_CCR1~4)。
接下来我们简单介绍一下这三个寄存器。

1. 捕获/比较模式寄存器(TIMx_CCMR1/2)

该寄存器总共有 2 个, TIMx _CCMR1 和TIMx _CCMR2。 TIMx_CCMR1 控制 CH1 和 2,而 TIMx_CCMR2 控制 CH3 和 4。
在这里插入图片描述
在这里插入图片描述
该寄存器的有些位在不同模式下,功能不一样,所以我们把寄存器分了2层,上面一层对应输出而下面的则对应输入。这里我们需要说明的是模式设置位 OCxM,此部分由 3 位组成。总共可以配置成 7 种模式,我们使用的是 PWM 模式,所以这 3 位必须设置为 110/111。这两种PWM 模式的区别就是输出电平的极性相反。

2. 捕获/比较使能寄存器(TIMx_CCER)

该寄存器控制着各个输入输出通道的开关。
在这里插入图片描述

该寄存器比较简单,我们这里只用到了 CC2E 位,该位是输入/捕获 2 输出使能位,要想PWM 从 IO 口输出,这个位必须设置为 1,所以我们需要设置该位为 1。该寄存器更详细的介绍,请参考《STM32 参考手册》。

3. 捕获/比较寄存器(TIMx_CCR1~4)

该寄存器总共有 4 个,对应 4 个输通道 CH1~4。因为这 4 个寄存器都差不多,我们仅以 TIMx_CCR1 为例介绍,
在这里插入图片描述
在输出模式下,该寄存器的值与 CNT 的值比较,根据比较结果产生相应动作。利用这点,我们通过修改这个寄存器的值,就可以控制 PWM 的输出脉宽了。 本章我们使用的是 TIM2 的通道 2,所以我们需要修改 TIM2_CCR2 以实现脉宽控制 LED 的亮度。

四、PWM呼吸灯实验

1.硬件设计

  1. 指示灯 LED(PC13)
  2. 定时器 TIM2

我们要利用 TIM2 的 CH2 输出 PWM 来控制 LED 的亮度,但是 TIM2_CH2 默认是接在 PA1上面的,而我们的 LED 接在 PC13 上面,只能用飞线把 PA1 飞到 PC13 上来实现了

2.软件设计

  1. TIM2 时钟使能。

  2. 初始化 TIM2,设置 TIM2 的 ARR 和 PSC。

  3. 设置 TIM2_CH2 的 PWM 模式,使能 TIM2 的 CH2 输出。

  4. 使能 TIM2。

  5. 修改 TIM2_CCR2 来控制占空比。

2.1 复制工程 (复制点亮LED工程)

一、利用固件库模板点灯(附模板及案例程序)

2.2 新建timer文件(打开工程,导入路径)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.3 编写代码

led.c(同点灯文件)

stm32f103c8t6自

;