文章目录
STM32定时器及PWM实现呼吸灯
一、STM32定时器
STM32定时器用来定时的机器,是存在于STM32单片机中的一个外设。STM32总共有8个定时器,分别是2个高级定时器(TIM1、TIM8),4个通用定时器(TIM2、TIM3、TIM4、TIM5)和2个基本定时器(TIM5、TIM6),他们都是由一个可编程的16位预分频器(TIMX_PSC)驱动的16位自动装载计数器(TIMX_CNT)构成。这三种定时器的区别如下:
通用定时器:
- 位于低速的APB1总线上(APB1)
- 16 位向上、向下、向上/向下(中心对齐)计数模式,自动装载计数器(TIMx_CNT)
- 16 位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数为 1~65535 之间的任意数值
- 4 个独立通道(TIMx_CH1~4),这些通道可以用来作为:
1、 输入捕获
2、输出比较
3、PWM 生成(边缘或中间对齐模式)
4、单脉冲模式输出 - 可使用外部信号(TIMx_ETR)控制定时器和定时器互连(可以用 1 个定时器控制另外一个定时器)的同步电路
参数配置:
为了配置和控制STM32定时器,我们可以使用相应的库函数或直接操作寄存器。以下是一些常用的配置参数: - 预分频系数:用于设置定时器的计数速度,可以根据需要进行调整。
- 计数周期:用于设置定时器的计数周期,决定定时器溢出的时间间隔。
- 工作模式:定时器可以工作在不同的模式下,如定时器模式、计数器模式、PWM模式等。
- 中断使能:可以选择是否使能定时器的中断功能,用于触发中断任务
** 工作过程:**
在选定的时钟源(可以是内部的也可以是外部的)和预分频器TIMX_PSC的驱动下,根据设置的计数模式(向上、向下、中央对齐)自动
装载计数器TIMX_CNT开始计数;如果使能了相应的事件(更新事件、触发事件、输入捕获、输出比较)则会产生相应的中断。 - 如果没有开启输入和输出,只使能了计数器计数溢出后自动装载,可以做为一个简单定时器使用,计数器自己开始周期计数。
- 如果开启了通道输入捕获,当检测到ICx信号上相应的边沿后,计数器(CNT)的当前值被锁存到捕获/比较寄存器(TIMx_CCRx)中,通过中断的方式可以读取出来假设为 n1,然后更改输入捕获的信号级性(上升沿或下降沿),当再次检测到ICx信号上相应的边沿后,计数器(CNT)的当前值再次被锁存到捕获/比较寄存器(TIMx_CCRx)中假设为 n2;n2 -n1节可算出电平的持续时间。
- 如果开启了输出控制,可以产生一个由TIMx_ARR寄存器确定频率、由TIMx_CCRx寄存器确定占空比的PWM信号。
-如果选择外部的同步时钟信号(TI1F_ED、TI1FP1、TI2FP2)作为计数器的时钟源,可以用来统计脉冲,实现脉冲频率采集功能。
二、PWM
PWM的全称是脉冲宽度调制(Pulse-width modulation),是指在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制,来等效的地获得所需要的模拟参量,常应用于电机控速等领域。
PWM频率:是指一秒钟内从高电平时间在到低电平时间,再从低电平跳到高电平的瞬间次数,也就是一秒钟内有多少个PWM的周期。f = 1/Ts.
PWM周期:是指一秒钟内从高电平时间在到低电平时间,Ts= 1/f。
PWM占空比:是指一个周期内高电平时间和总时间的比值,Ton/Ts.
PWM分辨率=占空比变化步距
相关参数计算公式:
- PWM频率=计数器地频率:Freq=CK_PSC/[(PSC+1) (ARR+1)], CK_PSC=72M
- PWM占空比=CCR/(ARR+1)
- PWM分辨率=1/(ARR+1)
占空比越大,表示靠点评持续的时间越长,灯的亮度就越大,占空比为零的时候全是低电平,灯就熄灭,占空比为100的时候灯亮度最大。所以要实现呼吸灯,就要不断地改变占空比调节灯的亮度。
三、定时器计数点灯
任务:使用STM32F103的 Tim2~Tim5其一定时器的某一个通道pin(与GPIOx管脚复用,见下图),连接一个LED,用定时器计数方式,控制LED以2s的频率周期性地亮-灭。
1、建立工程编写代码
打开Keil,建立工程,并完成相关文件的添加,具体操作在之前的文章中已经提到过,这里不再详细介绍。
该工程需要用到PWM模式电灯,另建一个文件夹,在里面添加PWM.c和PWM.h文件,代码如下:
PWM.h文件
#ifndef __PWM_H
#define __PWM_H
#include "stm32f10x.h" // Device header
void PWM_Init(void);