21:【stm32】定时器二:输入捕获

news2024/9/24 17:12:09

输出捕获

  • 1、输出捕获的简介
  • 2、输入捕获原理
    • 2.1、输入滤波
    • 2.2、信号选择
    • 2.3、CCx事件和CCx中断
  • 3、标准库编程

1、输出捕获的简介

定时器通过通道捕获输入电平的变化,而通道有CH1~CH4,这4个通道。

在这里插入图片描述

我们设定对通道CH3的输入电平进行捕获。假如CH3突然捕获到一个上升沿,然后CRR3对计数器CNT进行拍照,记录此时计数器的数值为R1,CNT的值会被拍照 入CCR3中。然后过一段时间,CH3捕获到一个下降沿,然后CRR3对计数器CNT进行拍照,记录此时计数器的数值为R2,CNT的值会被拍照 入CCR3中。而通过R2-R1就可以计算出这个电平的时间。
在这里插入图片描述
在这里插入图片描述

2、输入捕获原理

如图为:输入捕获的内部结构,其中内部结构由输入滤波器,边沿检测,信号选择器,分频器组成

在这里插入图片描述
在这里插入图片描述

2.1、输入滤波

通过RCC来的时钟信号对输入的波形进行采样,最终得出完整的波形。
在这里插入图片描述

2.2、信号选择

通道1和通道2为一组:通道1传来的边沿信号,可以通过通道2进行信号选择,通道1也可以进行通道2的信号选择。
通道3和通道4为一组:通道3传来的边沿信号,可以通过通道4进行信号选择,通道3也可以进行通道4的信号选择。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

所以计数脉宽如下:
在这里插入图片描述

在这里插入图片描述

2.3、CCx事件和CCx中断

在这里插入图片描述

3、标准库编程

在这里插入图片描述

在这里插入图片描述

//通过输入捕获功能进行超声波的测距。
/*
	超声波模块的初始化
*/
void App_SR04_Init(void)
{
	//1. 配置PA0引脚,连接超声波的Trig引脚
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	
	GPIO_InitTypeDef GPIOInitStruct;
	GPIOInitStruct.GPIO_Pin = GPIO_Pin_0;
	GPIOInitStruct.GPIO_Mode = GPIO_Mode_Out_PP;//输出推挽模式
	GPIOInitStruct.GPIO_Speed = GPIO_Speed_2MHz;
	GPIO_Init(GPIOA,&GPIOInitStruct);
	
	//1.1 配置PA8,用TIM1的通道CH1进行输入捕获
	GPIOInitStruct.GPIO_Pin = GPIO_Pin_8;
	GPIOInitStruct.GPIO_Mode = GPIO_Mode_IPD;//下拉输入
	GPIO_Init(GPIOA,&GPIOInitStruct);
	
	//2. 配置定时器
	//2.1 开启定时器TIM1的时钟
	RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM1,ENABLE);//复位
	RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM1,DISABLE);//释放
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);//使能时钟
	
	//2.2 打开预加载
	TIM_ARRPreloadConfig(TIM1,ENABLE);
	
	//2.3 配置时基单元
	TIM_TimeBaseInitTypeDef TIMInitStruct;
	TIMInitStruct.TIM_Prescaler = 71;//72倍分频,1MHz,1us计数一次
	TIMInitStruct.TIM_Period = 65535;//自动重装,因为最大为38ms,即计数38000次,所以直接配置为大于38000都行
	TIMInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//向上计数
	TIMInitStruct.TIM_RepetitionCounter = 0;//重复计数器RCR为0,因为使用的是TIM1,TIM1有RCR
	TIM_TimeBaseInit(TIM1,&TIMInitStruct);
	
	//2.4 手动启动Update事件
	TIM_GenerateEvent(TIM1,TIM_EventSource_Update);
	
	//3. 配置输入捕获
	//3.1 禁用霍尔传感器
	TIM_SelectHallSensor(TIM1,DISABLE);
	
	//3.2 配置输入滤波的分频系数为2,采样信号Fdts的分频系数
	TIM_SetClockDivision(TIM1,TIM_CKD_DIV2);
	
	//3.3 配置通道1的参数,上升沿进行拍照
	TIM_ICInitTypeDef TIMICInitStruct;
	TIMICInitStruct.TIM_Channel = TIM_Channel_1;//选择通道CH1
	TIMICInitStruct.TIM_ICFilter = 0x08;
	TIMICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising;//上升沿触发拍照
	TIMICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;//分频系数为1
	TIMICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI;//来源于通道1,所以直接输入
	TIM_ICInit(TIM1,&TIMICInitStruct);
	
	//3.4 配置通道2的参数,下降沿进行拍照
	TIMICInitStruct.TIM_Channel = TIM_Channel_2;//选择CH2
	TIMICInitStruct.TIM_ICFilter = 0x08;
	TIMICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Falling;//下降沿触发拍照
	TIMICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;//分频系数为1
	TIMICInitStruct.TIM_ICSelection = TIM_ICSelection_IndirectTI;//来源于通道1,所以间接输入
	TIM_ICInit(TIM1,&TIMICInitStruct);
	
	//4.使能通道1和通道2
	TIM_CCxCmd(TIM1,TIM_Channel_1,TIM_CCx_Enable);
	TIM_CCxCmd(TIM1,TIM_Channel_2,TIM_CCx_Enable);
}

/*
	定时器的中断函数,由上面的定时器初始化得,PSC = 71,则分频72倍,72MHz/72 = 1MHz
	1MHz代表1s/1000000 = 0.000001s = 1us,所以没间隔1us计数一次。
*/
float App_SR04(void)//计数距离
{
	//1. 先清除CCxIF标志位的值
	TIM_ClearFlag(TIM1,TIM_FLAG_CC1);//清除通道CH1的标志位
	TIM_ClearFlag(TIM1,TIM_FLAG_CC2);//清除通道CH1的标志位
	
	//2. 清除CNT的值
	TIM_GenerateEvent(TIM1,TIM_EventSource_Update);

	//3. 打开定时器
	TIM_Cmd(TIM1,ENABLE);
	
	//4. 向Trig引脚发送一个10us的脉冲
	GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET);
	PAL_DelayUs(10);
	GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);
	
	//5.等待测量完成
	while(TIM_GetFlagStatus(TIM1,TIM_FLAG_CC1) == RESET);
	while(TIM_GetFlagStatus(TIM1,TIM_FLAG_CC2) == RESET);
	
	//6. 关闭定时器
	TIM_Cmd(TIM1,DISABLE);
	
	//7. 计数距离
	int time;
	time = (TIM_GetCapture2(TIM1) - TIM_GetCapture1(TIM1));//us*10的负6次方换算成s
	float distance = time * 1e-6 * 340 / 2 ;
	return distance;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2074032.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java排序算法详解

在Java编程中,排序算法是数据处理和算法设计中的基础且重要的部分。它们广泛应用于各种场景,如数据库管理、数据分析、图形界面排序等。掌握几种常见的排序算法对于提升程序效率和优化性能至关重要。本文将详细解析几种经典的Java排序算法,包…

OpenGL笔记二十之深度检测概念

OpenGL笔记二十之深度检测概念 —— 2024-08-25 晚上 bilibili赵新政老师的教程看后笔记 code review! 文章目录 OpenGL笔记二十之深度检测概念1.课程PPT截图2.运行3.代码 1.课程PPT截图 2.运行 3.代码 关键部分 main.cpp #include <iostream>#include "glfra…

【逐行注释】三维EKF的MATLAB代码|附下载链接

文章目录 程序概况源代码与注释运行结果代码块解析 程序概况 基于MATLAB的EKF&#xff08;扩展卡尔曼滤波&#xff09;代码解析。状态转移和观测都是非线性的&#xff0c;也就是说会涉及到雅克比矩阵的求解。我尽量将模型设计复杂一点&#xff0c;便于拿到手以后改成自己想要的…

C++类和对象(2)——拷贝构造函数

拷贝构造函数的语法 拷贝构造函数是构造函数的重载&#xff0c; 用于这种情况&#xff1a;用已经构造好的对象去给另一个对象初始化。 int main() {Date d1(2024, 8, 1);Date d2(d1);//用d1初始化d2return 0; } 我们以Date类为例子讲解一下。 class Date { public://全缺省…

.NET周刊【8月第3期 2024-08-18】

国内文章 Roslyn 简单实现代码智能提示补全功能 https://www.cnblogs.com/lindexi/p/18365261 相信有很多伙伴热衷于编写 IDE 应用&#xff0c;在 dotnet 系下&#xff0c;通过 Roslyn 友好的 API 和强大的能力&#xff0c;实现一个代码智能提示是非常简单的事情。本文将和大…

【互动直播】支付能力视角与年龄的调节作用—推文分享—2024-08-25

【今天的关键词是&#xff1a;“interaction” AND “live commerce”】 第一篇&#xff1a;通过信息技术的可供性&#xff08;IT affordance&#xff09;视角&#xff0c;直播电商的实用、社交和享乐三个维度的IT可供性如何影响购买意愿&#xff1b; 第二篇&#xff1a;研究…

凭借着“16连射”造就一个游戏角色的诞生

一、高桥名人的冒险岛起源 大约在 1986 年&#xff0c;Hudson 的所有人都很喜欢一款名为《神奇男孩》的街机游戏&#xff0c;公司内部有人建议将其改编成 Famicom 游戏。因此&#xff0c;副总裁和高桥名人去查看角色和游戏的开发情况&#xff0c;当他们查看正在构建的角色时&am…

C++类和对象的基础介绍(1)

类的定义 C类的关键字是class&#xff0c;学过c的朋友们可能会觉得和结构体struct有点像。 在C中struct也可以定义类&#xff0c;但和class定义的有所区别。 我们还是推荐使用class。 类里面会有成员变量、成员函数的定义和声明、构造函数、拷贝构造函数、析构函数、运算符…

迈巴赫S480升级大柏林音响31个喇叭8个座椅震动加上后排按摩座椅更加舒适

迈巴赫 S480 改装大柏林音响的改装案例&#xff1a; 改装前的车辆音响系统&#xff1a; 迈巴赫 S480 原车配备了 15 个喇叭的小柏林音响系统。 改装方案&#xff1a; 1. 扬声器升级&#xff1a;将原车的小柏林音响全部拆下&#xff0c;更换为大柏林的扬声器。大柏林音响系统…

SCMsafe链四方参展2024第三届医药供应链创新大会

024年8月22日-24日&#xff0c;由智慧医药主办&#xff0c;多家行业协会、研究机构、生产、流通及供应链公司协办的2024第三届医药供应链创新大会在杭州召开。 会议以“正在遇见的革命”为主题&#xff0c;聚焦生产、流通及终端医药供应链热点、痛点政策和市场话题&#xff0c;…

opencv实战项目十五:钢材表面缺陷检测

文章目录 前言一、算法实现流程&#xff1a;二&#xff0c;算法详解&#xff1a;2.1 二值化与去噪2.2 形态学处理 三&#xff0c;整体代码实现&#xff1a; 前言 随着科技的不断进步&#xff0c;自动化和智能化在工业生产中的应用越来越广泛。在钢材生产过程中&#xff0c;钢材…

认知杂谈33

今天分享 有人说的一段争议性的话 I I 《说话影响命运&#xff0c;得小心》 嘿&#xff0c;你想想看&#xff0c;咱平常不经意说的那些话&#xff0c;就像小种子一样。你可能没当回事&#xff0c;可说不定啥时候&#xff0c;这些话就会在生活里生根发芽&#xff0c;最后生活…

继承—构造函数—引用等

继承时&#xff0c;数据成员&#xff0c;函数成员全盘接收&#xff0c;如果碰见同名成员屏蔽基类成员。 1&#xff0c;无论采取什么继承方式&#xff0c;基类中所有数据成员都将继承到派生类 2&#xff0c;在类型的继承层次里&#xff0c;保护属性当作共有属性使用 3&#x…

Xv6驱动(一):PLIC

PLIC内存布局 #define PLIC 0x0c000000L #define PLIC_PRIORITY (PLIC 0x0) #define PLIC_PENDING (PLIC 0x1000) #define PLIC_SENABLE(hart) (PLIC 0x2080 (hart) * 0x100) #define PLIC_SPRIORITY(hart) (PLIC 0x201000 (hart) * 0x2000) #define PLIC_SCLAIM(hart) …

前端算法 ==== 栈的好戏还要继续!| 1047. 删除字符串中的所有相邻重复项

目录 解题 思路 题外话 给出由小写字母组成的字符串 S&#xff0c;重复项删除操作会选择两个相邻且相同的字母&#xff0c;并删除它们。 在 S 上反复执行重复项删除操作&#xff0c;直到无法继续删除。 在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。 输入&a…

E-Prime2中同时识别大小写字母与中文支持设置

识别大小写 起因是在学习Eprime过程中发现&#xff0c;一开始只设置了键盘反应为q&#xff0c;然后当键盘为大写状态时&#xff0c;按Q不会响应&#xff0c;后来看到可以同时设置Qq&#xff0c;并且也能读取&#xff0c;简单试了一下&#xff0c;发现有必要在其他地方也这么设…

Multi-class Token Transformer for Weakly Supervised Semantic Segmentation

code&#xff1a;https://github.com/xulianuwa/MCTformer 摘要 本文提出了一种基于Transformer的新框架&#xff0c;用于学习类别特定的对象定位图&#xff0c;并将其作为弱监督语义分割&#xff08;WSSS&#xff09;的伪标签。受到标准视觉Transformer中单类别token的关注区…

SpringBoot天猫商城基于前后端分离+SpringBoot+BootStrap、Vue.js、JQuery+JPA+Redis

SpringBoot天猫商城整站 一、项目介绍和演示 SPRINGBOOT天猫整站&#xff0c;基于 前后端分离思想&#xff0c; 由于该商城高并发的特点&#xff0c;后端框架便使用了方便维护的 SpringM VC、SpringBoot框架&#xff0c;而前端框架则选择了主流的BootStrap、Vue.js&#xff0c;…

虚拟机扩展分区

1、删除快照后 先扩展 虚拟机空间 2、 创建分区 rootlocalhost /]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 200G 0 disk ├─sda1 8:1 0 500M 0 part /boot └─sda2 8:2 0 99.5G 0 part ├─VolGroup-lv_root (dm-0) 249:0 0 50G 0 lvm / ├─VolGroup-lv…

网络防火墙的主要功能及其弊端

防火墙&#xff08;Firewall&#xff09;&#xff0c;也称防护墙&#xff0c;是由Check Point 创立者Gil Shwed于1993 年发明并引入国际互联网。 它是一种位于内部网络与外部网络之间的网络安全系统。是一项信息安全的防护系统&#xff0c;依照特定的规则&#xff0c;允许或是限…