速通蓝桥杯嵌入式省一教程:(七)定时器输入捕获中断与PWM频率占空比测量
前文已经讲述过定时器的两个用法:基本定时中断与PWM输出。本节接着介绍第三种用法:定时器输入捕获中断。
在此之前,需要解释一下前文一直出现过的与定时器有关的概念。
定时器(TIMER):所谓定时器,其基本功能就是定时,我们可以通过设置定时器的频率也就是周期,来帮助我们完成定时功能。
预分配系数(Prescaler):将时钟源的频率进行不同的分频,用于作为定时器的频率。若时钟源的频率为80MHz,预分频系数为80-1,那么得到的定时器频率就是80,000,000/80=1MHz,周期是1us。
计数周期(Counter Period):当定时器计数若干个周期以后,重置定时器的计数。假设计数周期设置为1000-1,那么当定时器完成1000个周期的计数后(按如上设置,也就是1ms后),定时器的计数值从999重置为0,重新开始计数。定时器中断的原理就是当计数值到达设定的计数周期后产生中断。计数周期又叫重装载值(AutoReload)。
比较值(Compare):在正脉冲输出模式下,若设置比较值为100,那么当计数值处于0~99时,端口输出高电平;当计数值处于100~999时,端口输出低电平,得到的效果就是前100us输出高电平,后900us输出低电平,产生一个频率为1kHz,占空比为10%的PWM波。在Cube中,比较值又称为Pulse。
在掌握了这几个概念之后,大家在阅读前几节时对定时器的疑问应该就可以尽数消除。这也就是定时器频率计算公式与PWM频率、占空比计算公式的由来。
所谓定时器输入捕获中断,就是将定时器的某个通道设置为直接输入捕获模式以后,将外部信号接到该通道所在引脚上,当外部信号满足一定条件(如边沿跳变)时,就会触发中断。因此,若我们设置在外部信号发生上升沿跳变时触发中断,在中断程序中读取定时器的计数值后手动将其清零,那么通过所得计数值,结合预先设置好的时钟源频率与预分频系数,就能通过公式计算得到输入信号的频率了。
下面我们就来看看如何测量输入到PA7引脚的信号频率。首先用Cube进行定时器的配置。
可见PA7引脚同时作为多个定时器的通道,在这里我们选择TIM3的CH2通道。
同样,为了提高测量频率的精度,我们将预分频系数设置得尽可能小,计数周期设置得尽可能大。随后,打开定时器中断开关。
这样,我们就完成了在Cube中的设置。
与定时器中断类似,在程序初始化时,需要先开启定时器输入捕获中断:
HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_2); //开启TIM3CH2的输入捕获(IC(Input Capture))中断
然后编写定时器输入捕获中断函数,同样要注意函数名和形参均不能改动!!!可参照下图查找:
uint16_t prescaler = 1-1;
uint32_t ccl_value;
uint32_t pa7_frq;void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) //定时器输入捕获回调函数
{if (htim->Instance==TIM3 && htim->Channel==HAL_TIM_ACTIVE_CHANNEL_2) //TIM3CH2触发的中断{ccl_value = HAL_TIM_ReadCaptureValue(htim, TIM_CHANNEL_2); //读取捕获值(计数值)__HAL_TIM_SetCounter(&htim3, 0); //重置计数值pa7_frq = 80000000/((prescaler+1)*ccl_value); //根据公式计算频率HAL_TIM_IC_Start(htim, TIM_CHANNEL_2); //重新开启输入捕获}
}
在这里,我们用到了HAL_TIM_ReadCaptrueValue来读取当前捕获的计数值,其定义如下:
/*** @brief Read the captured value from Capture Compare unit* @param htim TIM handle.* @param Channel TIM Channels to be enabled* This parameter can be one of the following values:* @arg TIM_CHANNEL_1: TIM Channel 1 selected* @arg TIM_CHANNEL_2: TIM Channel 2 selected* @arg TIM_CHANNEL_3: TIM Channel 3 selected* @arg TIM_CHANNEL_4: TIM Channel 4 selected* @retval Captured value*/
uint32_t HAL_TIM_ReadCapturedValue(TIM_HandleTypeDef *htim, uint32_t Channel)
若要测量占空比,则需要在测量频率的基础上,使用另一个通道作为间接输入,并设置为下降沿捕获。这样一来,每当上升沿捕获中断触发,定时器计数清零后,到达第一个下降沿处,间接输入捕获通道捕获从上升沿到下降沿之间的计数值ccl_value_1;到达第二个上升沿处,直接输入捕获通道捕获从上升沿到上升沿之间的计数值ccl_value_2,于是占空比就等于ccl_value_1/ccl_value_2。
在这里我们选择Channel1作为间接输入捕获通道,在Cube中的设置如下:
更改代码如下:
uint16_t prescaler = 1-1;
uint32_t ccl_value_1, ccl_value_2;
uint32_t pa7_frq;
float pa7_duty;void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) //定时器输入捕获回调函数
{if (htim->Instance==TIM3 && htim->Channel==HAL_TIM_ACTIVE_CHANNEL_2) //TIM3CH2触发的中断{ccl_value_1 = HAL_TIM_ReadCaptureValue(htim, TIM_CHANNEL_1); //间接ccl_value_2 = HAL_TIM_ReadCaptureValue(htim, TIM_CHANNEL_2); //直接__HAL_TIM_SetCounter(&htim3, 0); //重置计数值pa7_frq = 80000000/((prescaler+1)*ccl_value); //根据公式计算频率pa7_duty = float(ccl_value_1/ccl_value_2); //计算占空比HAL_TIM_IC_Start(htim, TIM_CHANNEL_1); //重新开启间接输入捕获HAL_TIM_IC_Start(htim, TIM_CHANNEL_2); //重新开启直接输入捕获}
}
下面我们通过第十四届省赛题来总结本节所讲内容:
/* 以下代码添加到task.c中 */#define PI 3.14uint16_t prescaler = 1-1;
uint32_t ccl_value;
uint32_t pa7_frq;/* 测量频率 */
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{if (htim->Instance==TIM3 && htim->Channel==HAL_TIM_ACTIVE_CHANNEL_2){ccl_value = HAL_TIM_ReadCaptureValue(htim, TIM_CHANNEL_2);__HAL_TIM_SetCounter(&htim3, 0);pa7_frq = 80000000/((prescaler+1)*ccl_value);V = (pa7_frq*2*PI*R)/(100*K);HAL_TIM_IC_Start(htim, TIM_CHANNEL_2);}
}
相关文章:

速通蓝桥杯嵌入式省一教程:(七)定时器输入捕获中断与PWM频率占空比测量
前文已经讲述过定时器的两个用法:基本定时中断与PWM输出。本节接着介绍第三种用法:定时器输入捕获中断。 在此之前,需要解释一下前文一直出现过的与定时器有关的概念。 定时器(TIMER):所谓定时器,其基本功能就是定时…...

深入理解python虚拟机:程序执行的载体——栈帧
栈帧(Stack Frame)是 Python 虚拟机中程序执行的载体之一,也是 Python 中的一种执行上下文。每当 Python 执行一个函数或方法时,都会创建一个栈帧来表示当前的函数调用,并将其压入一个称为调用栈(Call Stac…...

云服务器-Docker容器-系统搭建部署
一、引言 最近公司在海外上云服务器,作者自己也搞了云服务器去搭建部署系统,方便了解整体架构和系统的生命周期,排查解决问题可以从原理侧进行分析实验。虽然用的云不是同一个,但是原理都是相通的。 二、选型 作者选用的是腾讯云…...

ES 索引重命名--Reindex(一)
ES reindex脚本流程,下图为整体流程: 步骤(1):每次写入把之前的索引删除再重新创建索引,然后判断索引是否创建成功,由于创建成功返回结果是json,因此用Json Input插件去解析json获得…...

Spring之bean的生命周期
目录 1.Bean的初始化过程 1.1代码详解 1.2思考 2.Bean的单例与多例选择 2.1论证单例与多例优缺点 2.2论证初始化时间点 2.3个例演示 Spring Bean的生命周期: 一、通过XML、Java annotation(注解)以及Java Configuration(配置类),等方式…...

策略梯度方法
策略梯度方法 数学背景 给定一个标量函数 J ( θ ) J\left(\theta\right) J(θ),利用梯度上升法,使其最大化,此时的 π θ \pi_\theta πθ就是最优策略。 θ t 1 θ t α ∇ θ J ( θ t ) \theta_{t1}\theta_t\alpha \nabla_\theta…...

博客系统之单元测试
对博客系统进行单元测试 1、测试查找已存在的用户 测试名称 selectByUsernameTest01 测试源码 //查找用户,存在 Test public void selectByUsernameTest01 () { UserDao userDao new UserDao(); String ret1 userDao.selectByUsername("张三").toStr…...

【ARM v8】如何在ARM上实现x86的rdtsc()函数
博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持! 博主链接 本人就职于国际知名终端厂商,负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G算力网络技术标准研究。 博客…...

redis--事务
redis事务 在Redis中,事务是一组原子性操作的集合,它们被一起执行,要么全部执行成功,要么全部回滚。虽然Redis的事务并不遵循传统数据库的ACID特性,但它仍然提供了一种将多个命令打包成一组执行的机制,适用…...

111. 二叉树的最小深度
111. 二叉树的最小深度 给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明:叶子节点是指没有子节点的节点。 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeN…...

SpringMVC归纳与总结
前言 Spring的核心是IOC,一种依赖反转的解耦思想。MVC是一种处理Web请求的架构模式,当两者的作用结合,就形成了SpringMVC。 组成及运行原理 1. 两次映射 2. 为什么用适配器模式 过滤器与拦截器 1. 范围 静态资源与动态资源2. 生命周期…...

Python学习笔记_进阶篇(三)_django知识(二)
本章内容 Django model Model 基础配置 django默认支持sqlite,mysql, oracle,postgresql数据库。 <1> sqlite django默认使用sqlite的数据库,默认自带sqlite的数据库驱动 引擎名称:django.db.backends.sqlite3 <2>mysql …...

RISC-V 整型通用寄存器介绍
简介 RISC-V64位/32位提供了32个整型通用寄存器,编号是x0~x31,这些整型通用寄存器的宽度与架构位数一致。 浮点数寄存器与整形寄存器一样也提供了32个:f0~f31,位数与架构位数一致。 通用寄存器介绍 零寄存器 x0/zero x0寄存…...

学习Vue:【性能优化】异步组件和懒加载
在Vue.js应用开发中,性能优化是一个至关重要的主题,而异步组件和懒加载是提升性能的有效方法之一。本文将介绍什么是异步组件和懒加载,以及如何在Vue.js中应用这些技术来提升应用性能。 异步组件和懒加载 异步组件 异步组件是指在需要的时候…...

pdf格式文件下载不预览,云存储的跨域解决
需求背景 后端接口中返回的是pdf文件路径比如: pdf文件路径 (https://wangzhendongsky.oss-cn-beijing.aliyuncs.com/wzd-test.pdf) 前端适配是这样的 <ahref"https://wangzhendongsky.oss-cn-beijing.aliyuncs.com/wzd-test.pdf&…...

httplib + nlohmann::json上传数据时中文乱码解决
1、nlohmann::json 1.1 编码格式使用UTF-8 参考 nlohmann::json 中文乱码解决方案 (1)将数据先转为UTF-8格式 2、httplib 2.1 上传数据前 (1)调用httplib::Response对象的set_header()方法来设置编码格式 httplib::Response res…...

JavaScript中的设计模式之一--单例模式和模块
虽然有一种疯狂天才的感觉可能很诱人,但重新发明轮子通常不是设计软件的最佳方法。很有可能有人已经遇到了和你一样的问题,并以一种聪明的方式解决了它。这样的最佳实践在形式化后被称为设计模式。今天我们来看看它们的概念,并检查单例模式和…...

回归预测 | MATLAB实现GAM广义加性模型多输入单输出回归预测(多指标,多图)
回归预测 | MATLAB实现GAM广义加性模型多输入单输出回归预测(多指标,多图) 目录 回归预测 | MATLAB实现GAM广义加性模型多输入单输出回归预测(多指标,多图)效果一览基本介绍程序设计参考资料 效果一览 基本…...

css学习4(背景)
1、CSS中,颜色值通常以以下方式定义: 十六进制 - 如:"#ff0000"RGB - 如:"rgb(255,0,0)"颜色名称 - 如:"red" 2、background-image 属性描述了元素的背景图像. 默认情况下,背景图像进…...

二、SQL,如何实现表的创建和查询
1、新建表格(在当前数据库中新建一个表格): (1)基础语法: create table [表名]( [字段:列标签] [该列数据类型] comment [字段注释], [字段:列标签] [该列数据类型] comment [字段注释], ……,…...

大数据及软件教学与实验专业实训室建设方案
一 、系统概述 大数据及软件教学与实验大数据及软件教学与实验在现代教育中扮演重要角色,这方面的教学内容涵盖了大数据处理、数据分析、数据可视化和大数据应用等多个方面。以下是大数据及软件教学与实验的一般内容:1. 数据基础知识:教授学生…...

信创办公–基于WPS的EXCEL最佳实践系列 (公式和函数)
信创办公–基于WPS的EXCEL最佳实践系列 (公式和函数) 目录 应用背景相关知识操作步骤1、认识基本的初级函数2、相对引用,绝对引用,混合引用3、统计函数4、文本函数 应用背景 熟练掌握Excel的函数工具能让我们在日常的使用中更加方…...

【Apollo】自动驾驶感知——毫米波雷达
作者简介: 辭七七,目前大一,正在学习C/C,Java,Python等 作者主页: 七七的个人主页 文章收录专栏: 七七的闲谈 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖…...

SpringBoot部署到腾讯云
SpringBoot部署到腾讯云 此处默认已经申请到腾讯云服务器,因为本人还没有申请域名,所以就直接使用的ip地址 XShell连接到腾讯云 主机中填写腾讯云的公网ip地址 公网ip地址在下图中找到 接下来填写服务器的用户名与密码 一般centOS用户名为rootÿ…...

Git 设置代理
Git 传输分两种协议,SSH和 http(s),设置代理也需要分两种。 http(s) 代理 Command Line 使用 命令行 模式,可以在Powershell中使用以下命令设置代理: $env:http_proxy"http://127.0.0.1:7890" $env:https_proxy&quo…...

基于Spring Boot的机场VIP客户管理系统的设计与实现(Java+spring boot+MySQL)
获取源码或者论文请私信博主 演示视频: 基于Spring Boot的机场VIP客户管理系统的设计与实现(Javaspring bootMySQL) 使用技术: 前端:html css javascript jQuery ajax thymeleaf 微信小程序 后端:Java s…...

图数据库_Neo4j学习cypher语言_使用CQL_构建明星关系图谱_导入明星数据_导入明星关系数据_创建明星关系---Neo4j图数据库工作笔记0009
首先找到明星数据 可以看到有一个sheet1,是,记录了所有的关系的数据 然后比如我们搜索一个撒贝宁,可以看到撒贝宁的数据 然后这个是构建的CQL语句 首先我们先去启动服务 neo4j console 然后我们再来看一下以前导入的,可以看到导入很简单, 就是上面有CQL 看一下节点的属性...

恒运资本:算力概念强势拉升,亚康股份“20cm”涨停,首都在线等大涨
算力概念21日盘中强势拉升,到发稿,亚康股份“20cm”涨停,首都在线、汇金股份涨逾11%,鸿博股份亦涨停,南凌科技涨近9%,科创信息、神州数码、铜牛信息等涨超7%。 音讯面上,8月19日,202…...

Neo4j之union基础
UNION 用于将多个 MATCH 或 RETURN 子句的结果合并为一个结果集。它可以用来合并不同模式的节点和关系,或者将多个查询的结果合并在一起。以下是一些常用的示例和解释: 基本用法: MATCH (p:Person) WHERE p.age > 30 RETURN p.name AS n…...

搭建:基于nginx的上传功能
搭建:基于nginx的上传功能 文章目录 搭建:基于nginx的上传功能一、准备二、安装nginx1.1 解压nginx和nginx插件1.2 编译并安装nginx 三、启动一个python后台服务,用于上传到临时路径文件,转移到正式路径四、添加nginx配置…...