0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

剖析STM32-定时器3

jf_78858299 来源:汇极星科技 作者:汇极星科技 2023-04-21 15:14 次阅读

三、定时器PWM输出实验

1. 通用定时器PWM概述

PWM,英文名Pulse Width Modulation,是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就是说通过调节占空比的变化来调节信号、能量等的变化,占空比就是指在一个周期内,信号处于高电平的时间占据整个信号周期的百分比,例如方波的占空比就是50%。PWM的功能有很多种,比如控制呼吸灯、控制直流电机或者舵机等驱动原件等等,是单片机的一个十分重要的功能。

STM32单片机中,可以使用定时器的输出比较功能来产生PWM波:

即PWM模式可以产生一个由TIMx_ARR寄存器确定频率、由TIMx_CCRx寄存器确定占空比的信号。其框图如下图所示:

图片

可见,横坐标是时间变量,纵坐标是CNT计数值,CNT计数值随着时间的推进会不断经历从0到ARR,清零复位再到ARR的这一过程。这之中还有一个数值是CCRx即比较值,通过比较值和输出配置可以使之输出高低电平逻辑,这样就产生了PWM波形。通过调节ARR的值可以调节PWM的周期,调节CCRx的值大小可以调节PWM占空比。

我们以通道1为例,详细讲解PWM的工作过程,如下图所示:

图片

从最左边进入的是时钟源,由内部时钟(CNT)或者外部触发时钟(ETRF)输入,进入输入模式控制器,通过OCMR1寄存器的OC1M[2:0]位来配置PWM模式,之后进入一个选择器,由CCER寄存器的CC1P位来设置输出极性,最后由CCER寄存器的CC1E位来使能输出,然后通过OC1来输出PWM波。

CCR1:捕获比较(值)寄存器(x=1,2,3,4):设置比较值。

CCMR1: OC1M[2:0]位:对于PWM方式下,用于设置PWM模式1【110】或者PWM模式2【111】

CCER:CC1P位:输入/捕获1输出极性。0:高电平有效,1:低电平有效。

CCER:CC1E位:输入/捕获1输出使能。0:关闭,1:打开。

  1. PWM模式

PWM有PWM模式1和模式2两种模式,它们之间的区别用寄存器TIMx_CCMR1的OC1M[2:0]位来分析:

图片

表中红色框标识的地方就是PWM模式1和模式2的定义和区别,可以简单理解为:PWM模式1的情况下,当前值小于比较值为有效电平;PWM模式2的情况下,当前值大于比较值为有效电平。

理解这一点对之后的PWM配置十分重要。

下面是对PWM模式1以及向上计数配置情况的说明:

图片

** 3.相关寄存器介绍**

  • 捕获/比较寄存器1(TIMx_CCR1)

图片

这里以寄存器1举例,其它的三个寄存器(CCR2、CCR3、CCR4)都是一样的

  • 捕获比较模式寄存器1(TIMx_CCMR1)

图片

图片

可以看到,每个捕获/比较模式寄存器可以控制两个通道,这样的话每个定时器就对应两个捕获/比较模式寄存器。其最常用的位就是0C1M(OC2M)位了,这两个位是用来设置PWM模式的,有模式1和模式2两种,这就和前面所讲的对应上了。

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

图片

可以看到,位0(CC1E)和位1(CC1P)是捕获比较使能寄存器最常用的两个位,分别控制输出使能和输出极性,这就也和刚刚讲的对应上了。

  • 自动重装载寄存器(TIMx_ARR)

图片

这个寄存器不太常用,下面的库函数配置会讲解其库函数用法。

4. 定时器输出通道引脚

定时器输出PWM和定时器中断不同,定时器中断只需要开启这一外设即可工作,定时器输出PWM需要在单片机的引脚上输出实实在在的脉冲信号。

下面是定时器3的通道引脚,可以使用部分映射或者完全映射。其它定时器的引脚可以查看芯片手册。

图片

5.定时器PWM库函数配置

  • 输出库函数配置

和定时器中断实验不同,在初始化时基单元之后,还需要对输出通道进行初始化:

void TIM_OCxInit(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);

其结构体成员如下:

typedef struct
{
  uint16_t TIM_OCMode;  //PWM模式1或者模式2
  uint16_t TIM_OutputState; //输出使能 OR失能
  uint16_t TIM_OutputNState;
  uint16_t TIM_Pulse; //比较值,写CCRx
  uint16_t TIM_OCPolarity; //比较输出极性
  uint16_t TIM_OCNPolarity; 
  uint16_t TIM_OCIdleState;  
  uint16_t TIM_OCNIdleState; 
} TIM_OCInitTypeDef;

初始化实例:

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //PWM模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure. TIM_Pulse=100;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
TIM_OC2Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC2

设置比较值函数

void TIM_SetCompareX(TIM_TypeDef* TIMx, uint16_t Compare2);
  • 使能输出比较预装载
  • void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
    
  • 使能自动重装载的预装载寄存器允许位
void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);

输出配置步骤

① 使能定时器3和相关IO口时钟。

使能定时器3时钟:RCC_APB1PeriphClockCmd();

     使能GPIOB时钟:RCC_APB2PeriphClockCmd();

② 初始化IO口为复用功能输出。函数:GPIO_Init();

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

③ 这里我们是要把PB5用作定时器的PWM输出引脚,所以要重映射配置,

所以需要开启AFIO时钟。同时设置重映射。

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

    GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);

④ 初始化定时器:ARR,PSC等:TIM_TimeBaseInit();

⑤ 初始化输出比较参数:TIM_OC2Init();

⑥ 使能预装载寄存器:TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);

⑦ 使能定时器。TIM_Cmd();

⑧ 不断改变比较值CCRx,达到不同的占空比效果:TIM_SetCompare2();

6.实例

我们使用STM32单片机的定时器TIM3的PWM功能,输出占空比可变的PWM波,用来驱动LED灯,从而达到LED亮度由暗变亮,又从亮变暗,如此循环。代码如下:

//timer.c源文件


#include "timer.h"
#include "led.h"
#include "usart.h"




//TIM3 PWM部分初始化 
//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM3_PWM_Init(u16 arr,u16 psc)
{  
  GPIO_InitTypeDef GPIO_InitStructure;
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  TIM_OCInitTypeDef  TIM_OCInitStructure;




  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);  //使能定时器3时钟
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB  | RCC_APB2Periph_AFIO, ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟


  GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射  TIM3_CH2->PB5    


   //设置该引脚为复用输出功能,输出TIM3 CH2的PWM脉冲波形  GPIOB.5
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //TIM_CH2
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO


   //初始化TIM3
  TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
  TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 
  TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位


  //初始化TIM3 Channel2 PWM模式   
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
  TIM_OC2Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC2


  TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM3在CCR2上的预装载寄存器


  TIM_Cmd(TIM3, ENABLE);  //使能TIM3




}
//timer.h头文件


#ifndef __TIMER_H
#define __TIMER_H
#include "sys.h"




void TIM3_PWM_Init(u16 arr,u16 psc);
#endif
//main.c源文件


#include "led.h"
#include "delay.h"
#include "sys.h"
#include "timer.h"




 int main(void)
{    
   u16 led0pwmval=0;
  u8 dir=1;  
  delay_init();         //延时函数初始化    
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);    //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
  uart_init(115200);   //串口初始化为115200
   LED_Init();           //LED端口初始化
   TIM3_PWM_Init(899,0);   //不分频。PWM频率=72000000/900=80Khz
     while(1)
  {
     delay_ms(10);   
    if(dir)led0pwmval++;
    else led0pwmval--;


     if(led0pwmval>300)dir=0;
    if(led0pwmval==0)dir=1;                     
    TIM_SetCompare2(TIM3,led0pwmval);       
  }   
 }

总结

本章从STM32定时器的原理、寄存器介绍、定时器配置以及定时器的几个常用的功能(如定时器中断、定时器输出比较PWM波形)的使用方法来教大家掌握定时器这一外设。希望读者能够仔细学习,掌握这一重要的外设。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 微控制器
    +关注

    关注

    48

    文章

    6812

    浏览量

    147652
  • 定时器
    +关注

    关注

    23

    文章

    3148

    浏览量

    112046
  • GPIO
    +关注

    关注

    16

    文章

    1135

    浏览量

    50580
收藏 人收藏

    评论

    相关推荐

    STM32-系统滴答定时器

    1.1 定时器的理解作用:定时 需要条件:计数+初始值 + 时钟 + 计数方向1.2 系统滴答定时器的介绍《M3-M4权威指南 第9章》-
    发表于 03-03 15:46

    STM32-通用定时器

    1.1.1 STM32F407定时器的介绍一共有14个定时器1. 基本定时器(2个):定时2. 通用定时
    发表于 03-03 15:48

    STM32-定时器输入捕获实验(捕获PWM方波的频率和占空比)精选资料分享

    STM32-定时器输入捕获实验(捕获PWM方波的频率和占空比)一、输入捕获模式在输入捕获模式下,当检测到ICx信号上相应的边沿后,计数的当前值被锁存到捕获/比较寄存(TIMx_CC
    发表于 08-17 09:09

    STM32通用定时器学习笔记

    STM32-通用定时器学习笔记一、通用定时器学习stm32f103ze定时器(16位)分类高级定时器
    发表于 08-19 08:48

    stm32定时器中断程序

    STM32定时器是个强大的模块,定时器使用的频率也是很高的,定时器可以做一些基本的定时,还可以做PWM输出或者输入捕获功能。 以下是进行
    发表于 10-12 16:59 1.3w次阅读

    STM32-基本定时器TIM6-TIM7基本定时功能

     STM32中一共有11个定时器,其中2个高级控制定时器,4个普通定时器和2个基本定时器,以及2个看门狗
    发表于 11-27 18:55 1.1w次阅读
    <b class='flag-5'>STM32-</b>基本<b class='flag-5'>定时器</b>TIM6-TIM7基本<b class='flag-5'>定时</b>功能

    STM32-通用定时器基本定时功能资料下载

    电子发烧友网为你提供STM32-通用定时器基本定时功能资料下载的电子资料下载,更有其他相关的电路图、源代码、课件教程、中文资料、英文资料、参考设计、用户指南、解决方案等资料,希望可以帮助到广大的电子工程师们。
    发表于 04-12 08:44 4次下载
    <b class='flag-5'>STM32-</b>通用<b class='flag-5'>定时器</b>基本<b class='flag-5'>定时</b>功能资料下载

    STM32定时器-基本定时器

    目录定时器分类基本定时器功能框图讲解基本定时器功能时钟源计数器时钟计数器自动重装载寄存器定时时间的计算定时器初始化结构体详解实验
    发表于 11-23 18:21 28次下载
    <b class='flag-5'>STM32</b><b class='flag-5'>定时器</b>-基本<b class='flag-5'>定时器</b>

    STM32——高级定时器、通用定时器、基本定时器的区别

    STM32——高级定时器、通用定时器、基本定时器的区别
    发表于 11-26 15:21 109次下载
    <b class='flag-5'>STM32</b>——高级<b class='flag-5'>定时器</b>、通用<b class='flag-5'>定时器</b>、基本<b class='flag-5'>定时器</b>的区别

    STM32-通用定时器-PWM输出

    1 通用定时器PWM概述1.1STM32定时器输出通道引脚这里以TIM3为例来讲解。STM32的通用定时器分为TIM2、TIM3、TIM4、
    发表于 11-26 15:36 22次下载
    <b class='flag-5'>STM32-</b>通用<b class='flag-5'>定时器</b>-PWM输出

    STM32-通用定时器-定时器中断

    1STM32定时器STM32F103ZET6一共有8个定时器,其中分别为:高级定时器(TIM1、TIM8);通用
    发表于 11-26 15:36 16次下载
    <b class='flag-5'>STM32-</b>通用<b class='flag-5'>定时器</b>-<b class='flag-5'>定时器</b>中断

    STM32---定时器知多少

    STM32定时器知多少这里写目录标题STM32---定时器知多少定时器的分类定时器的工作原理
    发表于 11-30 14:36 19次下载
    <b class='flag-5'>STM32</b>---<b class='flag-5'>定时器</b>知多少

    STM32定时器学习---基本定时器

    STM32F1系列的产品,除了互联网产品外,工作8个,3种定时器,其中一种就是基本定时器。那么STM32单片机的基本定时器如何操作以及编程呢
    发表于 12-02 14:06 27次下载
    <b class='flag-5'>STM32</b><b class='flag-5'>定时器</b>学习---基本<b class='flag-5'>定时器</b>

    剖析STM32-定时器1

    定时器作为微控制器不可缺少的外设,在STM32中也是如此。相信不少初学者学到定时器的时候对STM32的学习热情就大打折扣甚至想要放弃了,因为这一部分知识确实比较复杂。但是,如果你在之前
    的头像 发表于 04-21 15:14 1391次阅读
    <b class='flag-5'>剖析</b><b class='flag-5'>STM32-</b><b class='flag-5'>定时器</b>1

    剖析STM32-定时器2

    定时器作为微控制器不可缺少的外设,在STM32中也是如此。相信不少初学者学到定时器的时候对STM32的学习热情就大打折扣甚至想要放弃了,因为这一部分知识确实比较复杂。但是,如果你在之前
    的头像 发表于 04-21 15:14 920次阅读