新手必看!STM32通用定时器-输入捕获-脉宽测量

一、用途与工作原理

  用途:用于测量信号的参数,比如周期和频率。
  工作原理:在输入捕获模式下,当捕获单元捕捉到外部信号的有效边沿(上升沿/下降 沿/双边沿)时,将计数器的当前值锁存到捕获/比较寄存器TIMx_CCR, 供用户读取。

二、输入捕获框图理解

在这里插入图片描述

  当产生捕获信号时,将计数器当前的值存到捕获/比较影子寄存器中,但是影子寄存器不能直接访问,所以捕获转移信号(capture_transfer)产生时,将影子寄存器的值存到预装载寄存器中。这是程序员就可以读取预装载寄存器的值。
  简单理解:先设置上升沿捕获,当上升沿来到后,读取当前计数器的值CNT1。再设置下降沿捕获,当下降沿到来后,读取当前计数器的值为CNT2。高电平持续时间=CNT2-CNT1。

三、脉宽测量原理

在这里插入图片描述

前提:计数器为递增计数模式。
目的:计算高电平持续时间。

实现过程:

  1. 先设置上升沿捕获。在 t1 时刻检测到上升沿,定时器上升沿/下降沿触发中断,将计数器的值清0。(开始计算计数器次数)
  2. 计数器清0后,设置下降沿捕获。在 t2 时刻检测到下降沿,记录当前计时器的值为CCRx2。在下降沿捕获前可能会有 N次溢出,则总时间= N*( ARR+1) +CCRx2

四、输入捕获配置流程

  1. 设置滤波器
  2. 选择触发边沿
  3. 选择输入通道映射
  4. 设置事件分频器-不分频
  5. 使能输入通道

五、实验

实验内容:使用TIM5的通道1来捕获按键高电平脉宽时间totalTime 。( 按键按下为高电平 )

(1) 初始化PA0。
   a. 打开GPIOA时钟
   b. 配置为复用功能
   c. 映射AF2

//1.初始化PA0引脚
	RCC->AHB1ENR |=(0x01 <<0); //开启GPIOA的时钟
	GPIOA->MODER &=~(0X03 <<0);
	GPIOA->MODER |=(0X02 <<0); //配置为复用功能
	GPIOA->AFR[0] &=(0XFu <<0);
	GPIOA->AFR[0] |=(0X02 <<0);//映射AF2 

(2) 初始化基本定时配置。
   a.打开TIM5时钟
   b.选择内部时钟源
   c.配置 CR1 、CKD、URS
   d.设置重载值
   e.设置分频值
   f.产生更新事件

	//2.初始化基本定时器配置
	RCC->APB1ENR |= 1 << 3;      //打开TIM5时钟 
	TIM5->SMCR &=~(0x07 << 0);   //选择内部时钟源
	TIM5->CR1 |= 0x01 <<2;  //计数器上溢产生更新事件
	TIM5->CR1 =0; //整体清0
	TIM5->CR1 |=(0x01 <<7);   //有影子,缓冲。
	TIM5->ARR = 99;//设定计数器主动重装值(决定PWM的频率)
	TIM5->PSC = 7199;//预分频器 0为不分频  
	TIM5->EGR |=(0x01 <<0); //产生更新事件,将上面配置更新到影子寄存器
	

(3) 初始化输入通道。
   a.设置滤波器
   b.选择触发边沿
   c. 选择输入通道映射
   d.设置事件分频器-不分频
   e.使能输入通道

	//3. 初始化输入通道
	TIM5->CCMR1 |= (0xF << 4);//设置滤波器
    TIM5->CCER |=(0x5<<1);//选择极性,输入使能
    TIM5->CCMR1 &= ~(0x3 << 0);
    TIM5->CCMR1 |=(0x1<<0);//选择输入通道映射,映射到Tl1上
    TIM5->CCMR1 &= ~ (0x3 << 2);//设置事件分频器-不分频
    TIM5->CCER |= (0x1 << 0);//使能捕获输入通道

(4) 设置更新中断和捕获中断。
   a.设置优先级
   b.使能NVIC响应
   c.使能更新中断和捕获中断- DIER
   d.使能定时器5

NVIC_SetPriority (TIM5_ IRQn, NVIC_ EncodePriority(7-2, 1, 2));//设置优先级
NVIC_EnableIRQ (TIM5_ IRQn); // 使能NVIC响应
TIM5->DIER |= (0x1 << 0) ;//使能更新中断
TIM5->DIER |= (0x1 << 1) ;//使能捕获中断
TIM5->CR1 |= (0x1 << 0) ;//使能计数器

(5) 编写TIM5 _lRQHandler中断服务函数
   {
            if(更新中断)
        {
  
         }
            else(捕获中断)
        {

        }
   }

void TIM5_IRQHandler (void)
{
	static u16 updateNum = 0;  //进入更新中断的次数
	static u8 updateFlag = 0;  //更新标志
	u32 totalTime = 0 ;        //总时间
	u16 curTime = 0;      //记录当前时间

	if (TIM5->SR & (0x1 << 0)) //更新中断
	{
	   TIM5->SR &= ~(0x1 << 0); //清除更新中断标志
	   if(updateFlag ==1) updateNum ++;  //记录N个溢出时间次数
	}
	
	else if (TIM5->SR & (0x1 << 1)) //捕获中断
	{
	    TIM5->SR &= ~(0x1 << 1);  //清除捕获中断标志
		if(KEY1 == 1) // 上升沿-按键按下
		  {  TIM5->CNT = 0;
	     	 updateFlag = 1; //开始记录更新事件的次数
		  }
	    else //按键松开
		{
		  curTime = TIM5->CNT; //按键 松开的时间节点
		  totalTime =updateNum *100 +curTime; //得到总时间
		  updateFlag = 0; //清除记录更新事件标志
		  updateNum = 0; //更新事件次数清零方便下一次记录
	    }

    }
}
  • 13
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: STM32 HAL定时器输入捕获是指使用HAL库中的函数来实现对定时器输入捕获功能。 在使用HAL定时器输入捕获功能前,首先需要配置DMA(直接内存存取)通道,以实现数据的传输。然后,需要配置TIM(定时器)通道,使其工作在输入捕获模式下。 在捕获模式下,HAL库提供了一系列的函数来实现对输入信号的捕获。例如,可以使用HAL_TIM_IC_Start_DMA函数,将输入信号的数据传输到指定的缓冲区中。 在捕获输入信号后,可以使用HAL_TIM_IC_GetCapturedValue函数来获取输入信号的捕获值。捕获值表示定时器捕获输入信号时的计数值,可以用来计算输入信号的频率或等信息。 此外,还可以设置输入信号的极性,例如上升沿触发或下降沿触发。可以使用HAL_TIM_IC_ConfigChannel函数来配置输入信号通道的极性。 在使用完输入捕获功能后,需要及时释放资源,以避免占用过多的系统资源。可以使用HAL_TIM_IC_Stop_DMA函数停止DMA传输,并使用HAL_TIM_IC_Stop函数停止输入捕获功能。 总之,STM32 HAL定时器输入捕获功能通过配置定时器通道和DMA通道,并使用相应的HAL库函数,可以实现对输入信号的捕获,并获取相关信息。这种功能在许多应用中都有广泛的应用,例如测量输入信号的频率、,或者用作外部触发等。 ### 回答2: STM32的HAL定时器输入捕获是一种功能强大的特性,可以实现对外部信号的捕获、计数、测量和时间戳等操作。 使用HAL库进行定时器输入捕获,首先需要初始化相应的定时器,并设置捕获通道的模式和极性。然后,可以通过HAL库提供的相应函数,比如HAL_TIM_IC_Start()开始捕获操作。捕获操作可根据设定的边沿触发,根据捕获到的外部信号的上升沿或下降沿来进行计数或测量。 在捕获到外部信号的边沿后,可以使用HAL库提供的HAL_TIM_IC_GetCapture()函数获取捕获到的值。这个值可以用来计算信号的频率、周期或等参数。同时,还可以使用HAL_TIM_IC_GetPulse()获取两次捕获之间的时间间隔,从而获得时间戳。 定时器输入捕获还有一些其他功能,如捕获计数器的值、溢出情况等,这需要根据具体应用需求选择合适的函数进行操作。 总的来说,STM32的HAL定时器输入捕获提供了一种方便且灵活的方式,用于处理外部信号的捕获测量。使用HAL库提供的函数,可以轻松地实现对外部信号的捕获、计数、测量和时间戳等操作。参考官方文档和例程,可以更深入地了解和使用这一功能。 ### 回答3: STM32 HAL库提供了一种简便的方法来实现定时器输入捕获功能。定时器输入捕获是一种可以测量外部信号的时间间隔的功能。 首先,需要配置一个定时器实例来执行输入捕获。可以使用CubeMX来配置定时器,并生成HAL库的初始化代码。在生成的代码中,可以看到定时器初始化的函数以及HAL_TIM_IC_Init()函数。 在初始化定时器后,可以通过调用HAL_TIM_IC_Start()函数来启动输入捕获功能。此时,定时器将会开始计时,并且可以捕获外部信号的时间间隔。 为了配置输入捕获通道,可以调用HAL_TIM_IC_ConfigChannel()函数。此函数接受三个参数:定时器的句柄、输入捕获通道号以及输入捕获通道的配置。 然后,可以通过调用HAL_TIM_IC_Start_IT()函数来启动输入捕获中断。这将使得当捕获到一个信号时,会触发一个中断,以便用户可以在中断服务程序中对信号进行处理。 当输入捕获中断触发后,可以通过HAL_TIM_IC_CaptureCallback()函数来处理捕获的信号。在这个函数中,可以获取捕获到的时间值。 最后,需要在HAL库的主循环中调用HAL_TIM_IC_IRQHandler()函数,以便处理输入捕获中断。 总结起来,STM32 HAL库提供了一种简便的方法来实现定时器输入捕获功能。通过配置和启动定时器,并使用相应的函数来配置和启动输入捕获通道以及中断,可以实现对外部信号的时间测量

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值