STM32-TIM的输入捕获功能

server/2024/9/25 7:45:09/

1.熟练掌握TIM的参数配置,

2.熟练掌握输入通道的参数配置。

3.深刻理解输入捕获的原理和应用范畴。

4.理解输入捕获的原理。

一 什么是输入捕获功能

定时器输入捕获功能( input capture )是利用定时器的精准计数特性,实现对于脉冲宽度的测量的一种功能。
输入捕获功能示意图 :

结论:通过下降沿(单只电平由高电平降低到低电平的过程)和上升沿(低电平到高电平的过程)来作为判断依据。就可以测量出来低电平的持续时间和高电平的持续时间。

二 什么是定时器的输入捕获功能

2.1 定时器的输入捕获原理示意图

结论:这与上次课程 PWM 输出的硬件原理图相似,我们知道通道本质是一根线路,而线路就和引脚一样既有输入能力,又有输出能力。输出能力,就可以让定时器感知到电平变化。通过感知到的电平变化开始控制定时器计数开始和结束,进而就测量出来两个电平信号之间的时间差。
因此此功能很容易测量出有效电平的持续时间。
高低电平的产生本身可以是 定时器的 PWM 产生的,也可以是我们的超声波雷达产生的,还可以的我们红外人体感应产生的。最简答的产生来源 就是我们的KEY开关。而且还有所有的通信的接口。我们都可以使用测功能来测量。

输入捕获的硬件要求

引脚外侧:一个可以产生高低电平的器件。
引脚内部:复用功能里面必须要求定时器。

三 输入捕获功能的使用和实现

3.2 任务分配
实施项目,永远先做任务规划。
3.2.3 开始编码

3.2.4 代码展示和整理
void tim_cap_init()
{
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource0,GPIO_AF_TIM5);
//参数配置
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_TimeBaseInitStruct.TIM_ClockDivision = 0;
TIM_TimeBaseInitStruct.TIM_CounterMode =
TIM_CounterMode_Up;
TIM_TimeBaseInitStruct.TIM_Period = (5000-1);
TIM_TimeBaseInitStruct.TIM_Prescaler = (8400-1);
TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM5,&TIM_TimeBaseInitStruct);
//定时器开始工作
TIM_Cmd(TIM5,ENABLE);
//输入捕获参数
TIM_ICInitTypeDef TIM_ICInitStruct;
TIM_ICInitStruct.TIM_Channel =TIM_Channel_1;
TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_BothEdge;
TIM_ICInitStruct.TIM_ICSelection
=TIM_ICSelection_DirectTI;
TIM_ICInit(TIM5,&TIM_ICInitStruct);
//定时器都提交给nvic那些事件
TIM_ITConfig(TIM5,TIM_IT_CC1|TIM_IT_Update,ENABLE);
//中断分组
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
//中断配置
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;
NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
中断服务子函数
static uint16_t flag = 0;
static uint16_t i = 0;
void TIM5_IRQHandler()
{
if(SET==TIM_GetFlagStatus(TIM5,TIM_IT_CC1))
{
if(flag == 0)//信号开始了
{
TIM5->CCR1 = 0;
TIM_Cmd(TIM5,ENABLE);
flag = 1;
}
else //信号结束了,结算电平持续时间
{
TIM_Cmd(TIM5,DISABLE);
uint32_t cap = TIM_GetCapture1(TIM5);
cap = i*5000+cap;
printf("cap == %d\n",cap);
flag = 0;
i = 0;
}
TIM_ClearFlag(TIM5,TIM_IT_CC1);
}
//如果该信号持续时间很长,定时器会溢出,这里就散溢出次数
if(SET==TIM_GetFlagStatus(TIM5,TIM_IT_Update))
{
i++;
TIM_ClearFlag(TIM5,TIM_IT_Update);
}
}

 

输入捕获的编程步骤 
第一步,RCC开启时钟,把GPIO和TIM的时钟打开

第二步,GPIO初始化,把GPIO配置成输入模式,一般选择上拉输入或者浮空输入模式

第三步,配置时基单元,让CNT计数器在内部时钟的驱动下自增运行

第四步,配置输入捕获单元,包括滤波器、极性、直连通道还是交叉通道、分频器等参数

第五步,选择从模式的触发源,触发源选择为TI1FP1,调用库函数,给定一个参数即可

第六步,选择从模式触发后的执行操作,执行Reset操作,这里调用库函数即可

最后,调用TIM_Cmd函数,开启定时器


http://www.ppmy.cn/server/23323.html

相关文章

什么是面向对象?

谈到面向对象,我们不得不说到面向过程。因为面向对象就是从面向过程过渡而来的。 面向过程:就是将一个大的任务分成一条条小的步骤,这些步骤由一个个函数来完成。 而面向对象呢,更加注重这个任务中的参与者,需求里有…

区块链钱包开发——专业区块链开发

随着区块链技术的发展,钱包开发成为了一项至关重要的任务。本文将探讨区块链钱包开发的重要性,分析当前面临的挑战,并展望未来的发展趋势。 一、区块链钱包概述 区块链钱包是一种用于存储和管理数字货币的软件工具。它为用户提供了一个安全的…

【EMQX】使用websocket订阅EMQX数据

需求:某平台希望通过 websocket 来订阅 EMQX平台上的某些 Topic数据进行处理 1、EMQX 服务配置 前提是EMQX服务正常安装运行了,如果EMQX服务未安装的话,详见以下文章关于如何安装部署服务: 搭建自己的MQTT服务器、实现设备上云(W…

在Linux中eth0旁边的lo是什么

2024年4月24日,周三晚上 在Linux中,eth0 和 lo 分别代表不同的网络接口。 eth0 通常是指计算机上的以太网接口,用于连接到局域网或互联网。eth0 可能是通过以太网线连接到路由器或交换机的网络接口,用于进行网络通信。lo 是指本地…

clickhouse与oracle传输数据

参考 https://github.com/ClickHouse/clickhouse-jdbc-bridge https://github.com/ClickHouse/clickhouse-jdbc-bridge/blob/master/docker/README.md clickhouse官方提供了一种方式,可以实现clickhouse与oracle之间传输数据,不仅仅是oracle&#xff0…

SAP-ERP TM运输管理模块详解-3

9、定义采购数据结算 事务代码及配置路径: TCODE: SPRO 路径:IMG > 后勤执行 > 运输 > 装运成本 > 结算 > 分配采购数据。详见图9-1。 配置路径截图: 、 如图9-2所示,配置根据计划运输点Z001装运成本类型Z001…

[论文笔记]SEARCHING FOR ACTIVATION FUNCTIONS

引言 今天带来另一篇激活函数论文SEARCHING FOR ACTIVATION FUNCTIONS的笔记。 作者利用自动搜索技术来发现新的激活函数。通过结合详尽的搜索和基于强化学习的搜索,通过实验发现最佳的激活函数 f ( x ) x ⋅ sigmoid ( β x ) f(x) x \cdot \text{sigmoid}(βx…

分布式事务Seata<XA模式、AT模式>解决方案思路(针对多数据源、分库分表、微服务、微服务分库分表4种场景)

seata的xa的方式解决 保证强一致性 原理说明: 1.启动seata服务器TC(控制台7091可以查看) 2.启动spring项目 初始化TM RM,实际上TM和RM注册到TC中 3.浏览器访问执行方法,TM向TC请求开启全局事务, 返回一个全…