stm32使用定时器功能之高精度定时(微秒级)、输入捕获以及超声波测距

一、定时器功能之高精度定时(微秒级)
我们常用的延时函数中无论是HAL_Delay还是vTaskDelay()函数都是毫秒级的定时,我们可以借助定时器实现一个微秒级更高精度的延时函数。这个定时器不会影响FreeRtos的任务切换
在这里插入图片描述
这里就是用定时器的计数功能来实现定时
前面我们设置了Tim2的分频值为72/(71+1) = 1MHz,也就是1000000Hz,那么频率就是1/1000000 = 1us,也就是1us(1微秒)计数一次,前面我们设置的ARR自动重载的值为999,也就是999+1 = 1000us会重新加载CNT的值为0
1、原理:
t_old原计数值 与 t_now当下计数值之间不可以超过一个溢出周期的前提下。
因为原计数与当下计数值之间在不存在延时操作的情况下,不可能出现超过一个溢出周期的。
在这里插入图片描述
上面就是两种延时周期的运算方式
配置TIM2时钟,用它的基本计数功能就可以,不需要去管通道,因为通道是做PWM或者输入捕获的,我们这里只需要它最基本的定时计数,前面的章节我们用TIM2还做了PWM,占用了通道,但是这不影响基本计数定时功能
在这里插入图片描述

//实现更高精度的延时函数(微秒级)
void tim2_u_delay(uint32_t us)
{HAL_TIM_Base_Start(&htim2);//启用定时器基本计数功能。//1.获取ARR自动装载寄存器中的值:uint32_t load_ARR = __HAL_TIM_GET_AUTORELOAD(&htim2);//2.获取一个起始检测点的计数值:uint32_t t_start_CNT = __HAL_TIM_GET_COUNTER(&htim2);//3.检测周期:uint32_t t_current_CNT = 0;uint32_t ticks = 0;while (true){/* 检测 */t_current_CNT = __HAL_TIM_GET_COUNTER(&htim2);if(t_current_CNT >= t_start_CNT){ticks += (t_current_CNT - t_start_CNT);}else{ticks += (load_ARR) - t_start_CNT + 1 + t_current_CNT;}//更新起始点start:t_start_CNT = t_current_CNT;if(ticks >= us){break;}}}

二、输入捕获

1、输入捕获原理
在这里插入图片描述

当定时器启动输入捕获模式,当外部信号出现变化时,此时会记录计数器CNT的值,并保存到CCR1,此时会发生中断,可以在中断回调函数中读取出CCR1此时的值,也就是读取出CNT计数器的值,这个时间和ARR的值相比看一下占用周期的比例,就可以完整的得出外部信号的波形
举例使用:监测脉冲宽度,也就是记录脉冲的时间
在这里插入图片描述
这里将一个信号分两次接入chn1和chn2,chn1捕获上升沿,chn2捕获下降沿,这样分别捕获的时间会再CCR1和CCR2中,上面的计算公式中的分辨率就是计数器CNT的频率,这里假设PSC出来的是1MHZ,也就是1秒1000000次,设置ARR为1000,CNT只是记录前面的PSC频率的计数,此时1MHZ,1/1000000 = 1us,也就是1us记录一次,这里的分辨率就是1us
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述通道1和通道2是一对,通道3和通道4是一对,这样一对中,一个通道监测上升沿,一个通道监测下降沿,就可以判断一个高电平的时长

2、典型应用

1、 脉宽测量:通过捕获信号的上升沿和下降沿,可以测量信号的高电平或低电平持续时间。
3、周期测量:通过两次上升沿或下降沿之间的时间差,可以测量信号的周期。
4、频率测量:通过周期测量,可以计算出信号的频率。

3、输入捕获HAL库接口函数API:

1.启动输入捕获:HAL_TIM_IC_Start

HAL_StatusTypeDef HAL_TIM_IC_Start(TIM_HandleTypeDef *htim, uint32_t Channel);
HAL_StatusTypeDef HAL_TIM_IC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel);
1功能:启动定时器通道的输入捕获功能:
2功能:启动定时器通道的输入捕获功能并且开启捕获中断。
参数:
htim:即要启动的定时器的句柄。
Channel:启动输入捕获的通道是哪个。返回值:HAL_OK: 操作成功。HAL_ERROR: 操作失败。HAL_BUSY: 定时器资源忙

2.停止输入捕获:HAL_TIM_IC_Stop

HAL_StatusTypeDef HAL_TIM_IC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel);
HAL_StatusTypeDef HAL_TIM_IC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel);
1.功能:停止定时器通道的输入捕获功能:
2功能:停止定时器通道的输入捕获功能并且关闭捕获中断。
参数:
htim:即要停止的定时器的句柄。
Channel:停止输入捕获的通道是哪个。
返回值:HAL_OK: 操作成功。HAL_ERROR: 操作失败。HAL_BUSY: 定时器资源忙

3.输入捕获配置通道:HAL_TIM_IC_ConfigChannel,相应的输入参数也可直接在CubMX直接配置。

HAL_StatusTypeDef HAL_TIM_IC_ConfigChannel(TIM_HandleTypeDef *htim, TIM_IC_InitTypeDef *sConfig, uint32_t Channel);
功能:配置输入捕获通道
参数:
htim: 指向 TIM_HandleTypeDef 结构体的指针,该结构体包含了定时器的配置信息。
sConfig: 指向 TIM_IC_InitTypeDef 结构体的指针,该结构体用于配置输入捕获通道的参数。
Channel: 要配置的定时器通道。可以是 TIM_CHANNEL_1, TIM_CHANNEL_2, TIM_CHANNEL_3, 或 TIM_CHANNEL_4。TIM_IC_InitTypeDef 结构体用于设置输入捕获通道的参数,主要包括:
ICPolarity: 输入捕获极性。可以是 TIM_ICPOLARITY_RISING(上升沿)或 TIM_ICPOLARITY_FALLING(下降沿),或者 TIM_ICPOLARITY_BOTHEDGE(两边缘)。
ICSelection: 输入捕获选择。可以是 TIM_ICSELECTION_DIRECTTI(直接输入)或 TIM_ICSELECTION_INDIRECTTI(间接输入)。
ICPrescaler: 输入捕获预分频器。可以是 TIM_ICPSC_DIV1(无分频),TIM_ICPSC_DIV2(除2),TIM_ICPSC_DIV4(除4),或 TIM_ICPSC_DIV8(除8)。
ICFilter: 输入捕获滤波器值,用于过滤输入信号中的噪声。
返回值HAL_OK: 配置成功。HAL_ERROR: 配置失败。

4.当捕获成功之后的中断回调函数,直接重写这个函数就可以:

__weak void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
//此函数是捕获之后的中断回调函数,是一个弱函数。
//当捕获发生后,可以重新定义相应的逻辑。
//注意:此中断回调函数,需要要执行HAL_TIM_IC_Start_IT时才会被调用。

5、超声波测距驱动(输入捕获实例)

在这里插入图片描述
原理:启动超声波就是给Trig引脚通10us的高电平,然后超声波左侧就会发出,这个超声波的频率是40KHZ,发出8个周期,也就是0.2ms,超声波发出之后,Echo引脚就会自动拉高电平,当超声波回来以后,也就是右侧的接收超声波的8个周期完成,echo就会把电平拉低
实际就是超声波发出后,echo拉高电平,超声波接收完成,echo拉低电平,此时只需要监测echo处于高电平的时间就可以计算出距离
距离=声速(340m/s)*传播时间 / 2

echo可以维持最大38ms,也就是超出了量程,飞了
在这里插入图片描述通道1选择上升沿直接监测,通道2选择下降沿间接监测,就可以获取出Echo处于高电平的周期
1、选择通道捕获模式
在这里插入图片描述
在这里插入图片描述
通道1选择输入直接捕获模式,通道2选择输入间接捕获模式
2、选择边沿监测模式
在这里插入图片描述
在这里插入图片描述
通道1选择上升沿监测,通道2选择下降沿监测
3、选择分频系数
在这里插入图片描述
4、整体
在这里插入图片描述
Input Filter (4 bits value)是输入滤波,设置的最大值15
配置PD15为输出模式,接Trig
PD14是TIM4的chnl3,接Echo

前面说了这个超声波测距模块的Echo维持高电平的时间最大为38ms,所以这里就要设置一个周期要大于38ms,这里设置了分频为72/(71+1) = 1MHz,也就是1/1000000 = 1us,也就是1us的时候CNT计数一次,38ms = 38000us,所以只要ARR大于38000就可以了,这里我设置了65535,完全可以包含38ms

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

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

相关文章

Git常用命令摘要

写这篇博文的目的只是简单的给自己及团队的日常工作中需要用到的git命令作个汇总,这样平时只需要查阅这篇文章就够了,不用到处查找。如果能给有需要的朋友一点点的帮助,那也算是意外之喜吧。 一、基础配置 # 设置用户名和邮箱(首…

ubuntu 22.04 安装部署kibana 7.10.0详细教程

安装部署kibana 7.10.0详细教程 下载并安装二、修改kibana.yml文件三、性能配置四、启动服务验证五、安装启动常见问题 【背景】 整个elk安装是基于ubuntu 22.04和jdk 11环境。kibana均采用 *.deb方式安装,需要服务器能联网。ubuntu 22.04 安装部署elk(elasticsearc…

nfs 服务器的搭建

nfs 服务器的搭建 1.配置yum源 mkdir /etc/yum.repos.d/bak mv /etc/yum.repo.d/*.repo /etc/yum.repos.d/bak/ curl -o /etc/yum.repos.d/centos.repo http://10.26.210.101/centos/centos.repo # 外网 curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.c…

Yii2 基础版实现 Token 认证 API 服务的完整框架方案

以下是一个基于 Yii2 基础版实现 Token 认证 API 服务的完整框架方案,包含 JWT 实现和完整代码: 1. 环境准备 composer create-project --prefer-dist yiisoft/yii2-app-basic yii2-api cd yii2-api2. 安装必要扩展 composer require firebase/php-jw…

主流版本控制工具Git vs Perforce P4:架构模式、性能、大文件管理及分支管理对比详解

Git和Perforce P4是两个强大的源代码管理工具,各有其独特的功能优势与适用场景。 本文中,Perforce中国授权合作伙伴-龙智将从架构设计、性能表现、文件管理及分支策略等维度,为您详细解析两者的关键差异,帮助您根据团队需求&…

文件系统2(Linux下)

1 挂载分区 文件系统1中已经知道了能够根据inode号在指定分区找文件了,也已经能根据目录文件内容,找指定的inode了,在指定的分区内,就可以对文件进行操作了。但是还有几个问题,那就是inode是不能跨分区的,…

Leetcode-​2537. 统计好子数组的数目​

Problem: 2537. 统计好子数组的数目 思路 滑动窗口 解题过程 思路: 使用滑动窗口来维护子数组,并通过组合计数动态调整满足条件的数对数目。具体来说,我们维护一个窗口[l,r],使得窗口内相同元素的对数至少为 k,并计算…

js手写代码篇--手写Object.assign

19、Object.assign 作用: Object.assign的作用是将源对象的所有可枚举属性复制到目标对象中。它返回目标对象。 const obj1 { a: 1, b: 2 };const obj2 { b: 3, c: 4 };const obj3 { d: 5 };const target {};Object.assign(target, obj1, obj2, obj3);console…

使用 C/C++ 和 OpenCV 构建智能停车场视觉管理系统

使用 C 和 OpenCV 构建智能停车场视觉管理系统 本文将详细介绍如何利用 C 和 OpenCV 库,从零开始创建一个智能停车场管理系统。该系统通过摄像头捕捉的画面,能自动完成两项核心任务: 车位识别:通过检测地面上的黄色停车线&#…

服务器静态ip,网关不能占用*.*.*.1

网关不能占用*.*.*.1.1 通常用于运行关键服务(如DHCP、NAT、DNS代理),.1 是网络世界的"VIP包厢",普通用户强闯只会被"请出"。

自然语言处理【NLP】—— CBOW模型

文章目录 引言一、CBOW模型概述1.1 什么是CBOW模型1.2 CBOW vs Skip-gram 二、CBOW模型原理详解2.1 模型架构2.2 数学原理2.3 训练过程 三、CBOW的PyTorch实现四、CBOW模型的应用与优化4.1 典型应用场景4.2 性能优化技巧 五、CBOW的局限性六、结语 引言 在自然语言处理(NLP)领…

为MTK 9300开发板移植Linux系统(以Debian为例)的详细技术指南

以下是为MTK 9300开发板移植Linux系统(以Debian为例)的详细技术指南,涵盖环境搭建、内核移植、驱动适配(摄像头/显示器/WiFi)、系统集成与优化。 MTK 9300开发板Linux系统移植全流程指南 1 项目概述 1.1 硬件平台 SoC:MediaTek MTK9300 (ARMv8-A架构,4Cortex-A78 + 4C…

Java Lambda 表达式与 Stream API 全解析:从基础到进阶

以下是对您博客内容的优化版本,在保留原有核心内容的基础上,补充了Lambda表达式及Stream API的完整方法体系,并通过结构化排版和扩展说明提升可读性。 Java Lambda表达式与Stream API全解析:从基础到进阶 一、Lambda表达式与Str…

Let’s Encrypt(乐此加密) 免费SSL证书申请

一、前言 腾讯云、阿里云等平台都支持免费的SSL证书申请,但只支持单域名SSL证书申请,不支持泛域名证书申请,而且每年只有20张免费证书额度,自2024年4月25日之起免费申请的证书只有3个月有效期。域名比较多的情况下,更新…

SQLite3 性能优化

在嵌入式开发和轻量级应用场景中,SQLite3 作为轻量级数据库引擎,凭借其无需独立服务器、部署便捷等特点被广泛应用。然而,当面对大量数据的高速读写需求时,默认配置下的 SQLite3 性能往往难以满足要求。本文将从数据库配置调整、W…

零基础设计模式——行为型模式 - 状态模式

第四部分:行为型模式 - 状态模式 (State Pattern) 我们继续学习行为型模式,接下来是状态模式。这个模式允许一个对象在其内部状态改变时改变它的行为,对象看起来就像是改变了它的类。 核心思想:允许一个对象在其内部状态改变时改…

面向对象面试题集合

前言 记录面向对象面试题相关内容,方便复习及查漏补缺 题1.简述面向对象?主要特征是什么? 面向对象编程(Object-Oriented Programming,简称OOP)是一种以“对象”为核心的编程范式,通过将现实…

二十一、【用户管理与权限 - 篇三】角色管理:前端角色列表与 CRUD 实现

【用户管理与权限 - 篇三】角色管理:前端角色列表与 CRUD 实现 前言准备工作第一部分:更新 API 服务以包含角色管理第二部分:添加角色管理页面的路由和侧边栏入口第三部分:实现角色列表页面第四部分:实现角色表单对话框组件第五部分:全面测试总结前言 一个完善的权限系统…

Objective-c protocol 练习

题目描述: 请使用 Objective-C 中的 protocol 协议机制,实现一个简易的门禁控制系统。 系统包含两个类: AccessControlSystem —— 门禁系统,用于执行开门操作;Admin —— 实现权限判断逻辑的管理员。 要求如下&am…

科技创新赋能产业创新,双轮驱动助力新疆高质量发展!

在新疆维吾尔自治区成立70周年之际,中国产学研合作促进会于6月14日在乌鲁木齐举办“天山对话:推动新疆科技创新与产业创新”盛会。多位院士、专家、学者及企业代表齐聚一堂,探寻推动新疆科技创新和产业创新的新路径、新动能。活动现场&#x…