大数跨境
0
0

STM32F407基础教程12——定时器之输入捕获

STM32F407基础教程12——定时器之输入捕获 Easy单片机
2025-07-14
0
导读:输入捕获的基本原理、结构框图、库函数

引言

输入捕获的基本原理是捕获通道对引脚上的边沿信号(上升沿/下降沿)检测,检测到有效边沿信号则将定时器的计数器值锁存到捕获寄存器中。输入捕获可用于测量信号脉冲宽度或频率。

学习内容:

1.输入捕获通道

2.输入捕获库函数

3.输入捕获功能使用步骤

4.输入捕获应用之超声波传感器

一、输入捕获通道

通用定时器结构框图主要可分为三部分:时基单元、输入捕获(左下部分)和输出比较(右下部分)。输入捕获模块可分三部分来看:信号输入、捕获相关设置(滤波器、边沿检测、预分频)、锁存计数值(捕获寄存器)。

1.物理信号源TIx

TI1TI2TI3TI4指的是定时器通道对应的物理输入信号引脚直接连接到芯片的特定GPIO引脚

TI1:对应TIMx_CH1引脚的输入信号。

TI2:对应TIMx_CH2引脚的输入信号。

TI3:对应TIMx_CH3引脚的输入信号。

TI4:对应TIMx_CH4引脚的输入信号。

比如定时器5四个通道默认的输入引脚为

TIM5_CH1:PA0

TIM5_CH2:PA1

TIM5_CH3:PA2

TIM5_CH4:PA3

2.输入捕获通道ICxIC1IC2IC3IC4

这是定时器内部的功能模块,负责捕获计数器当前的值(TIMx_CNT)并将其锁存到捕获/比较寄存器(TIMx_CCRx)中。

注意:TIx信号不是直接等于ICx通道!可以配置IC1的输入源为TI1(即使用TIMx_CH1引脚),也可以配置IC1的输入源为TI2(即使用TIMx_CH2引脚)。

3.信号路径(捕获过程)

TIMx_CHx引脚上有输入信号,该信号对应TIx信号,TIx信号经过输入滤波器和边沿检测器生成TIxFPx信号,这个TIxFPx信号根据设置可以连接到输入捕获通道ICx,当ICx检测到其输入(TIxFPx)的指定边沿时,就会将当前的计数器值TIMx_CNT捕获到对应的捕获寄存器TIMx_CCRx中,并可产生中断或DMA请求。

说明:x=1,2,3,4。表示定时器的4个通道。

说明:

(1)滤波器。通过ICxF寄存器可设置信号的采样频率和计数事件。

当外部信号(如TI1、TI2等)存在噪声或抖动时,连续采样N次信号电平,当连续N次采样值相同时,才认为信号有效变化。采样频率见下。

2边沿检测,可设置为检测上升沿或下降沿或都检测。

3)通过CCxS寄存器可设置通道方向(输入/输出)和通道映射。

除了设置为00外都是输入模式;

IC1映射到TI1,是指IC1的输入源为TI1(即使用TIMx_CH1引脚);同理IC1映射到TI2,是指IC1的输入源为TI2(即使用TIMx_CH2引脚)。

4)分频。设置执行一次捕获需要检测的事件次数。如设置为00表示只要检测到有效边沿就执行捕获。

二、定时器输入捕获库函数

1.输入捕获初始化库函数

void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct)

参数1TIMx: x=1~5,8~14(基本定时器无捕获功能)

参数2TIM_ICInitStruct结构体指针

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取值:

TIM_Channel_1

TIM_Channel_2

TIM_Channel_3

TIM_Channel_4

成员TIM_ICPolarity取值:

TIM_ICPolarity_Rising-上升沿检测

TIM_ICPolarity_Falling-下降沿检测

TIM_ICPolarity_BothEdge-两者都检测

成员TIM_ICSelection取值:

TIM_ICSelection_DirectTI,输入通道1,2,3,4IC1,IC2,IC3,IC4一一对应

TIM_ICSelection_IndirectTI:输入通道1,2对应IC2,,IC13,4对应IC4,IC3

成员TIM_ICPrescaler取值:

TIM_ICPSC_DIV1 ,每次在捕获输入上检测到边缘时执行捕获

TIM_ICPSC_DIV2 ,每2个事件执行一次捕获

TIM_ICPSC_DIV4, 4个事件执行一次捕获

TIM_ICPSC_DIV8, 8个事件执行一次捕获

成员TIM_ICFilter取值:0x00~0x0F

0x00:无预分频器,每检测到有效信号便执行捕获

0x01:每发生2个事件执行一次捕获

2.获取通道的捕获值

uint32_t TIM_GetCapturex(TIM_TypeDef* TIMx)

比如获取定时器5通风1的捕获值:

TIM_GetCapture1(TIM5)

三、定时器输入捕获功能使用步骤

1RCC_APBxPeriphClockCmd(RCC_APBxPeriph_TIMx, ENABLE)//使能定时器/GPIO口时钟

2配置定时器引脚,选择引脚、模式等

3配置时基单元,设置重装载值、预分频值、计数模式等

4配置输入捕获结构体,调用TIM_ICInit(TIMx, &TIM_ICInitStruct)函数完成初始化

5)配置NVIC

6调用TIM_ITConfig(TIMx, TIM_IT_CCx,NewState)函数,使能相应的中断

7调用TIM_Cmd(TIMx,ENABLE)使能定时器

8调用TIM_GetCapturex(TIMx)读取捕获值

举例:使用定时器5,通道1,开启中断

void TIM5_InputCapture(){    GPIO_InitTypeDef GPIO_InitStruct;    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;    NVIC_InitTypeDef NVIC_InitStructure;    TIM_ICInitTypeDef TIM_ICInitStruct;    /*1-开定时器和GPIO口时钟*/    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);     /*2-配置定时器输入引脚*/    GPIO_PinAFConfig(GPIOA,GPIO_PinSource1,GPIO_AF_TIM5);//复用功能配置    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1; //选择A0引脚    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; //复用功能模式//  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz; //输出速度//  GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;   //推挽输出    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_DOWN; // 下拉    GPIO_Init(GPIOA, &GPIO_InitStruct);     /*3-时基配置*/  TIM_TimeBaseStructure.TIM_Period = 0xFFFFFFFF;//自动重装载ARR值  TIM_TimeBaseStructure.TIM_Prescaler = 84-1;//预分频PSC值  TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;//1分频  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数模式  TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure);//完成初始化   /*4-配置输入捕获功能*/  TIM_ICInitStruct.TIM_Channel = TIM_Channel_1;//通道1  TIM_ICInitStruct.TIM_ICFilter = 0x00;//无滤波   TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising;//上升沿检测   TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;//不分频   TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_IndirectTI;  TIM_ICInit(TIM5,&TIM_ICInitStruct);   /*5-配置NVIC*/  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//设置中断分组  NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;//选择TIM2中断通道  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//设置抢占优先级  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;//设置相应优先级  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//中断使能  NVIC_Init(&NVIC_InitStructure);//NVIC初始化  /*6-开启通道1捕获中断*/  TIM_ITConfig(TIM5, TIM_IT_CC1,ENABLE);  /*7-使能定时器*/  TIM_Cmd(TIM5,ENABLE);}

四、输入捕获应用之超声波传感器

超声波传感器检测到信号返回时,ECHO引脚会输出高电平,高电平持续的时间就是超声波从发射到返回的时间。在上一篇文章中是利用外部中断来计算高电平时间,当ECHO上升沿时,此时启动定时器开始计时;当ECHO下降沿时,此时停止定时器计数,根据定时器计数值和计数频率来计算时间。

本文利用输入捕获功能来计算时间,检测到上升沿时,读取定时器的计数值;检测到下降沿时,读取定时器的计数值。根据两个计数值的差值和计数频率来计算时间。

代码就不贴出来了,工程文件供大家下载。

通过网盘分享的文件:STM32F407工程模板 - 超声波-输入捕获.rar

链接: https://pan.baidu.com/s/1dj7E94RoIOP0ReFtL706lQ 提取码: XTLG

【声明】内容源于网络
0
0
Easy单片机
本公众号专注于单片机技术开发领域。用于记录和分享单片机开发相关技术知识,学习笔记,设计示例和基础教程。包括C/C++、51单片机、STM32单片机、PCB设计等。
内容 62
粉丝 0
Easy单片机 本公众号专注于单片机技术开发领域。用于记录和分享单片机开发相关技术知识,学习笔记,设计示例和基础教程。包括C/C++、51单片机、STM32单片机、PCB设计等。
总阅读3
粉丝0
内容62