STM32标准库通用定时器输入捕获

这篇具有很好参考价值的文章主要介绍了STM32标准库通用定时器输入捕获。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

STM32标准库定时器输入捕获

1.输入捕获介绍

输入捕获为STM32定时器的一个功能,可以用来测量输入信号的频率和占空比。

具体原理:当输入信号经过比较捕获通道时,STM32会依据通道的极性设置决定是否触发捕获中断TIM_IT_CCx。此时定时器会将当前计数值TIMx->CNT的值保存在TIMx->CCRx中,通过计算两次捕获中断的时间差便可计算出捕获的电平时长,由此可计算出输入信号的频率、周期、占空比等信息。

在本文中,使用野火指南者开发板,配置TIM2定时器的通道4为输入通道,TIM3定时器的通道1为输出通道。

2. 输入捕获通道与定时器初始化

需要引用头文件

#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_tim.h"
void TIM2_Init()                                            // 定时器2初始化
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);     // 使能定时器2的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);    // 使能GPIOA的时钟
	
	GPIO_InitTypeDef GPIO_InitStructure;                    // 定义GPIO_InitTypeDef类型的结构体
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;      // 定义TIM_TimeBaseInitTypeDef类型的结构体
	TIM_ICInitTypeDef TIM_IC_nitStructure;                  // 定义TIM_ICInitTypeDef类型的结构体
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 ;              // 选择通道4的引脚
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;   // 设置通道4为浮空输入
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       // 设置引脚速度为50MHz
	GPIO_Init(GPIOA,&GPIO_InitStructure);                   // 初始化GPIOA
	
	TIM_TimeBaseInitStructure.TIM_Period = 1000-1;          // 设置定时器2的自动重装值,计数到1000-1
	TIM_TimeBaseInitStructure.TIM_Prescaler = 720-1;	    // 设置定时器2的预分频值,分频720-1
	TIM_TimeBaseInitStructure.TIM_ClockDivision  = TIM_CKD_DIV1;    // 设置时钟分割
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; // 设置计数器模式为向上计数
	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);      // 初始化定时器2
	
	TIM_IC_nitStructure.TIM_Channel = TIM_Channel_4;        // 选择通道4
	TIM_IC_nitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;     // 设置通道4的上升沿触发
	TIM_IC_nitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;   // 设置通道4的输入分频器
	TIM_IC_nitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; // 设置通道4映射到TI4
	TIM_IC_nitStructure.TIM_ICFilter = 0x00;                // 设置通道4的滤波器
	TIM_ICInit(TIM2,&TIM_IC_nitStructure);                  // 初始化定时器2的通道4
	
	NVIC_InitTypeDef NVIC_InitStructure;                    // 定义NVIC_InitTypeDef结构体变量
	NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;         // 选择定时器2的中断通道
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;       // 设置中断优先级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;      // 设置中断子优先级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;         // 使能中断通道
	
	NVIC_Init(&NVIC_InitStructure);                         // 初始化NVIC_InitTypeDef结构体变量
	
	TIM_ITConfig(TIM2,TIM_IT_CC4 | TIM_IT_Update ,ENABLE);  // 使能定时器2的通道4的中断和更新中断
	
	TIM_Cmd(TIM2,ENABLE);                                   // 使能定时器2
}

需要注意输入通道引脚为GPIO_Mode_IN_FLOATING模式,TIM_Period为定时器溢出值。

  • TIM_ICInitTypeDef:输入捕获通道配置结构体。

    • TIM_Channel:输入通道,可选参数为TIM_Channel_x。

    • TIM_ICPolarity:输入通道极性设置,可选参数为TIM_ICSelection_DirectTI、TIM_ICSelection_IndirectTI、TIM_ICSelection_TRC。

      • TIM_ICSelection_DirectTI:将定时器输入通道1、2、3、4依次映射到IC1、IC2、IC3、IC4。

      • TIM_ICSelection_IndirectTI:将定时器输入通道1、2、3、4依次映射到IC2、IC1、IC4、IC3。

      • TIM_ICSelection_TRC:将定时器输入通道1、2、3、4连接至TRC我暂时也不知道这个TRC是啥

    • TIM_ICFilter:输入通道滤波器设置,可选参数为0x0~0xF。决定了多少次边沿变换会触发一次输入捕获。

3. 中断函数编写

输入捕获中断与定时器中断共用一个中断NVIC。

uint16_t Up_Capture_Cnt,Down_Capture_Cnt,Up_Capture,Up_Capture_Cnt_Temp,Down_Capture;
uint16_t timer_cnt2,timer_cnt1 = 0;
uint16_t Get_State = 0,Get_State1 = 0;

void TIM2_IRQHandler()                              // 定时器2中断函数
{
	if(TIM_GetITStatus(TIM2,TIM_IT_Update) == SET)  // 定时器2更新中断
	{
		timer_cnt1++;                               // 定时器计数标志量1每溢出一次加一
		timer_cnt2++;                               // 定时器计数标志量2每溢出一次加一
		if(timer_cnt1 == 10000)                     // 定时器计数标志量1溢出时清零
		{
			timer_cnt1 = 0;                         // 定时器计数标志量1清零
		}
		if(timer_cnt2 == 10000)                     // 定时器计数标志量2溢出时清零
		{
			timer_cnt2 = 0;                         // 定时器计数标志量2清零
		}
	}
	if(TIM_GetITStatus(TIM2,TIM_IT_CC4) == SET)     // 定时器2输入捕获中断
	{
		switch(Get_State)                           // 判断输入捕获状态
		{
			case 0 :            
				Up_Capture_Cnt_Temp = Up_Capture_Cnt;       // 保存上一次输入捕获通道的值
				Down_Capture_Cnt =  TIM_GetCapture4(TIM2);  // 获取当前输入捕获通道的值
				Down_Capture = Down_Capture_Cnt + (timer_cnt2 * 1000) - Up_Capture_Cnt_Temp;    // 计算脉冲宽度
				timer_cnt1 = 0;                             // 定时器计数标志量1清零
				timer_cnt2 = 0;                             // 定时器计数标志量2清零
				TIM_ClearITPendingBit(TIM2,TIM_IT_CC4);     // 清除输入捕获通道的中断标志位
				TIM_OC4PolarityConfig(TIM2,TIM_ICPolarity_Falling); // 设置输入捕获通道的极性为下降沿
				Get_State = 1;                              // 设置输入捕获通道的状态为1
				break;                                      // 跳出switch语句
			case 1:         
				Up_Capture_Cnt =  TIM_GetCapture4(TIM2);    // 获取当前输入捕获通道的值
				Up_Capture = Up_Capture_Cnt + (timer_cnt1 * 1000) - Down_Capture_Cnt;           // 计算脉冲宽度
				timer_cnt1 = 0;                             // 定时器计数标志量1清零
				timer_cnt2 = 0;                             // 定时器计数标志量2清零
				TIM_ClearITPendingBit(TIM2,TIM_IT_CC4);     // 清除输入捕获通道的中断标志位
				TIM_OC4PolarityConfig(TIM2,TIM_ICPolarity_Rising);  // 设置输入捕获通道的极性为上升沿
				Get_State = 0;                              // 设置输入捕获通道的状态为0
				break;                                      // 跳出switch语句
		}
	}
	TIM_ClearITPendingBit(TIM2,TIM_IT_Update);              // 清除定时器溢出中断标志位
}

4. 中断函数代码具体逻辑解释

光看代码可能捋不清先后关系,来看下图就知道了,如图1所示:

STM32标准库通用定时器输入捕获文章来源地址https://www.toymoban.com/news/detail-838690.html

图1.采集输入捕获信号矢量图
在图中可以看到,当输入捕获通道的信号周期要长于输入捕获的通道时钟周期时,会导致第二次读取的值比第一次读取的值小,如果不使用定时器溢出次数进行辅助运算会导致算出来的是负数。之后第一次读取的值+溢出时间-第二次读取的值,得到的结果就是脉冲宽度,第二次读取的值+溢出时间-第一次读取的值,得到的就是周期中另一部分的宽度。有了这些信息,就可以得到频率、周期和占空比了。

到了这里,关于STM32标准库通用定时器输入捕获的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32定时器(输入捕获)

     上一章讲了输出比较的内容,输出比较就是定时器自增,同时和CCR比较,按照自己设置的比较要求,输出REF高低电平,这一章我们讲下面结构图输出比较左边部分,也就是 输入捕获 首先,介绍一下输入捕获 IC(input capture)输入捕获,输入捕获模式下,当通道输入引脚出现

    2024年02月09日
    浏览(15)
  • stm32 定时器输入捕获实验

    目录 一,简介 二,配置过程  一,设置输入捕获滤波器​ 二,设置输入极性 三,设置输入捕获映射通道  四,设置输入捕获分频器  五,设置中断  ​三,寄存器 四,库函数 五,一般步骤   六,软件部分 输入捕获模式可以用来测量脉冲宽度或者测量频率 原理图 如图  

    2024年01月21日
    浏览(31)
  • STM32 定时器输入捕获2——捕获高电平时长

            由上图我们可以知道,高电平时间=t2-t1。在代码中,可以记录此时t1的时间然后再记录t2的时间,t2-t1,就是我们所想要的答案。         但是,还有更简单一点点的,当到达t1的时候,我们把定时器清零,然后直接读出t2,就是这个高电平的时间。 1.当TIM3的TIM_F

    2024年01月18日
    浏览(24)
  • STM32 定时器输入捕获3——捕获超长高电平

            第一章:https://blog.csdn.net/m0_73671341/article/details/134773615?spm=1001.2014.3001.5501         第二章:https://blog.csdn.net/m0_73671341/article/details/134938332?spm=1001.2014.3001.5501         从第一章的定时器捕获我们可以知道,即使把定时器捕获时长设置到最大也只有65.536ms,而第二章就

    2024年01月18日
    浏览(20)
  • STM32定时器输入捕获测量高电平时间

    本篇内容要求读者对STM32通用定时器有一点理解,如有不解,请看 夜深人静学32系列15——通用定时器 输入捕获是STM32通用定时器的一种功能,可以捕获特定引脚的电平变化(上升沿/下降沿) 对于一个变化的信号。只需要测量上升沿与下降沿的时间间隔,即可计算出高电平的

    2024年02月21日
    浏览(19)
  • STM32F4_定时器输入捕获详解

    目录 1. 输入捕获简介 2. 输入捕获框图 3. 输入捕获模式 4. 相关寄存器 4.1 TIMx_ARR、TIMx_PSC 4.2 捕获/比较寄存器1:TIMx_CCMR1 4.3 捕获/比较使能寄存器 TIMx_CCER 4.4 中断使能寄存器 TIMx_DIER 5. 库函数配置输入捕获高电平脉冲宽度 6. 实验程序 6.1 main.c 6.2 IntputCapture.c 6.3 IntputCapture.h    

    2024年02月04日
    浏览(21)
  • STM32CubeMX系列06——定时器(定时、PWM、输入捕获)

    ==== 文章汇总(有代码汇总) ==== 正点原子Mini板,主控 STM32F103RCT6. 定时器简介 这里主要讨论通用定时器(系统嘀嗒定时器、看门狗定时器、RTC定时器不考虑在内) 对于STM32F103RCT6 单片机: 2个基本定时器。分别是 TIM6 、 TIM7 。只能16位向上计数、没有IO口,没有捕获和比较通

    2024年02月01日
    浏览(27)
  • STM32 HAL库 STM32CubeMX -- TIM(定时器输入捕获)

    输入捕获可以对 输入的信号的上升沿、下降沿或者双边沿进行捕获 ,常用的有 测量输入信号的脉宽 和 测量PWM 输入信号的频率 和 占空比 这两种。 输入捕获的原理 就是,当捕获到信号的跳变沿的时候,把计数器CNT 的值锁存到捕获寄存器CCR 中,把前后两次捕获到的CCR 寄存

    2023年04月14日
    浏览(69)
  • STM32标准库通用定时器PWM生成

    STM32通用定时器生成的PWM波形周期为 (STM32主频)/((TIM_Period+1)*(TIM_Prescaler+1)) TIM_OCMode:PWM的模式,有两种模式:TIM_OCMode_PWM1和TIM_OCMode_PWM2 TIM_OCMode_PWM1。向上计数时,一旦TIMx_CNT TIMx_CCR1时通道1为有效电平,否则为无效电平;在向下计数时,一旦TIMx_CNT TIMx_CCR1时通道1为无效电平(

    2024年03月09日
    浏览(39)
  • STM32 HAL库定时器输入捕获SlaveMode脉宽测量

    📓SlaveMode模式简介 ✨SlaveMode复位模式:在发生一个触发输入事件时,计数器和它的预分频器能够重新被初始化;同时,如果TIMx_CR1寄存器的URS位为低,还会产生一个更新事件UEV;然后所有的预装载寄存器(TIMx_ARR, TIMx_CCRx)都会被更新。 🔖当所测频率低于最小定时器捕获频率

    2024年02月16日
    浏览(20)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包