微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 硬件工程师文库 > stm32定时器输入捕获

stm32定时器输入捕获

时间:09-13 来源:互联网 点击:

  系统滴答定时器一般用来提供"心跳"作用,而STM32定时器最基本功能也是定时,可以设置不同时间长度的定时。定时器除了最基本的定时功能外,定时器与GPIO有挂钩使得它可以发挥强大的作用,比如可以输出不同频率、不同占空比的方波信号、PWM信号,同时做为输入捕获功能时,可以测量脉冲宽度、实现电容按键检测等等。

  一、输入捕获概念

  输入捕获模式可以用来测量脉冲宽度或者测量频率。STM32 的定时器,除了 TIM6 和 TIM7,其他定时器都有输入捕获功能。 STM32的输入捕获,简单的说就是通过检测 TIMx_CHx (定时器X的通道X)上的 边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定时器的值(TIMx_CNT) 存放到对应的通道的捕获/比较寄存器(TIMx_CCRx)里面,完成一次捕获。同时还可以配置捕获时是否触发中断/DMA 等。

  本文使用 TIM2_CH1 来捕获高电平脉宽,也就是要先设置输入捕获为上升沿检测,记录发生上升沿的时候 TIM2_CNT 的值。然后配置捕获信号为下降沿捕获,当下降沿到来时,发生捕获,并记录此时的 TIM2_CNT 值。这样,前后两次 TIM2_CNT 之差,就是高电平的脉宽,同时 TIM2 的计数频率我们是知道的,从而可以计算出高电平脉宽的准确时间。

  至于为什么TIM2_CH1来测量WK_UP的脉宽。。看图:

  显然,TIM_CH1是连在PA0上的。

  二、输入捕获流程:

  例如,要配置向上计数器在T12输入端的上升沿计数,使用下列步骤:

  1、配置TIMx_CCMR1寄存器CC2S=’01’,配置通道2检测TI2输入的上升沿

  2、配置TIMx_CCMR1寄存器的IC2F[3:0],选择输入滤波器带宽(如果不需要滤波器,保持 IC2F=0000即无滤波器,以fDTS 采样)

  3、配置TIMx_CCER寄存器的CC2P=’0’,选定上升沿极性

  4、 配置TIMx_SMCR寄存器的SMS=’111’,选择定时器外部时钟模式1

  5、 配置TIMx_SMCR寄存器中的TS=’110’,选定TI2作为触发输入

  6、 设置TIMx_CR1寄存器的CEN=’1’,启动计数器

  当上升沿出现在TI2,计数器计数一次,且TIF标志被设置。 在TI2的上升沿和计数器实际时钟之间的延时,取决于在TI2输入端的重新同步电路。

  三、输入捕获程序设计步骤:

  1)开启 TIM5 时钟和 GPIOA 时钟,配置 PA0 为下拉输入。

  要使用 TIM5,我们必须先开启 TIM5 的时钟。这里我们还要配置 PA0 为下拉输入,因为 我们要捕获 TIM5_CH1 上面的高电平脉宽,而 TIM5_CH1 是连接在 PA0 上面的。所以要进行GPIO_Init();

  2)初始化 TIM5,设置 TIM5 的 ARR 和 PSC。

  在开启了 TIM5 的时钟之后,我们要设置 ARR 和 PSC 两个寄存器的值来设置输入捕获的自动重装载值和计数频率。这在库函数中是通过 TIM_TimeBaseInit 函数实现的

  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

  TIM_TimeBaseStructure.TIM_Period = arr; //设定计数器自动重装值

  TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置预分频值

  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_div1; //TDTS = Tck_tim

  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//TIM 向上计数模式

  TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); //根据指定的参数初始化 Tim5

  3)设置 TIM5 的输入比较参数,开启输入捕获

  输入比较参数的设置包括映射关系,滤波,分频以及捕获方式等。这里我们需要设置通道 1 为输入模式,且 IC1 映射到 TI1(通道 1)上面,并且不使用滤波(提高响应速度)器,上升沿捕 获。库函数是通过 TIM_ICInit 函数来初始化输入比较参数的:

  void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct);

  同样,我们来看看参数设置结构体 TIM_ICInitTypeDef 的定义:

  typedef struct

  {

  uint16_t TIM_Channel;  //用来设置通道

  uint16_t TIM_ICPolarity;  //用来设置输入信号的有效捕获极性

  uint16_t TIM_ICSelection;    //

  uint16_t TIM_ICPrescaler;

  uint16_t TIM_ICFilter;

  } TIM_ICInitTypeDef;

  参数 TIM_Channel 很好理解,用来设置通道。我们设置为通道 1,为 TIM_Channel_1。

  参数 TIM_ICPolarit 是用来设置输入信号的有效捕获极性,这里我们设置为 TIM_ICPolarity_Rising,上升沿捕获。

  同时库函数还提供了单独设置通道 1 捕获极性的函数为:

  TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling);

这表示通道 1 为上升沿捕获

上一篇:功率因数表
下一篇:stm32定时器优先级

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top