STM32定时器及PWM实现呼吸灯


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);
  • 6
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值