STM32 定时器输入捕获2——捕获高电平时长

news2025/2/26 12:25:24

        由上图我们可以知道,高电平时间=t2-t1。在代码中,可以记录此时t1的时间然后再记录t2的时间,t2-t1,就是我们所想要的答案。

        但是,还有更简单一点点的,当到达t1的时候,我们把定时器清零,然后直接读出t2,就是这个高电平的时间。

  • 1.当TIM3的TIM_FLAG_CC1==1时,清除TIM3
void TIM3_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM3,TIM_FLAG_CC1)==SET)
	{
		TIM_SetCounter(TIM3,0);
	}
	TIM_ClearITPendingBit(TIM3,TIM_FLAG_CC1);
}
  • 2.从波形图可以看出,刚开始检测的是上升沿,所以检测TIM_FLAG_CC1的时候是SET,到了第二步,波形开始下降,变为下降沿,此时我们就要更改一下检测的方式了,我们可以用到下面这个函数。

TIM_OC1PolarityConfig(TIM3,TIM_OCPolarity_Low);
//更改下次检测的极性为low(低电平)
void TIM3_IRQHandler(void)
{
	static unsigned char high_flag = 0;
	if(TIM_GetITStatus(TIM3,TIM_FLAG_CC1)==SET)
	{
		
		if(high_flag == 0)//上升沿
		{
			high_flag = 1;
			TIM_SetCounter(TIM3,0);
			TIM_OC1PolarityConfig(TIM3,TIM_OCPolarity_Low);
		}
		else//下降沿
		{
			high_value = TIM_GetCounter(TIM3);
			TIM_OC1PolarityConfig(TIM3,TIM_OCPolarity_High);
			high_flag = 0;
		}
	}
	TIM_ClearITPendingBit(TIM3,TIM_FLAG_CC1);
}
  • 3.每次到下一个波形的时候,都重新初始化一下high_value.
if(high_flag == 0)//上升沿
{
    high_flag = 1;
	high_value = 0;
	TIM_SetCounter(TIM3,0);
	TIM_OC1PolarityConfig(TIM3,TIM_OCPolarity_Low);
}
  • 4.如果在main中,去使用了high_value,此时高电平还在不断输出,定时器也在运行,high_value仍会该改变,对于high_value的使用就不方便。所以我们需要限制一个条件,当我们使用high_value的时候,不要去重新写high_value了。
void TIM3_IRQHandler(void)
{
	static unsigned char high_flag = 0;
	
	if(high_complete_flag == 0)
	{
		if(TIM_GetITStatus(TIM3,TIM_FLAG_CC1)==SET)
		{
			if(high_flag == 0)//上升沿
			{
				high_flag = 1;
				high_value = 0;
				TIM_SetCounter(TIM3,0);
				TIM_OC1PolarityConfig(TIM3,TIM_OCPolarity_Low);
			}
			else//下降沿
			{
				high_value = TIM_GetCounter(TIM3);
				TIM_OC1PolarityConfig(TIM3,TIM_OCPolarity_High);
				high_flag = 0;
				high_complete_flag = 1;
			}
		}
	}
	TIM_ClearITPendingBit(TIM3,TIM_FLAG_CC1);
}

在使用high_value之前,让high_complete_flag = 0;这样之后时,high_value就不会变了

main

int main(void)
{
	TIM2_PWM_Configuration();//PWM周期为20ms
	
	TIM3_InputCaputure_Configuration();//PA1:发出《————》PA6:接收
	
	Uart1_Configuration();
	
	TIM_SetCompare2(TIM2,10000);//占空比为50%,即10ms高电平
	
	while(1)
	{
		if(high_complete_flag == 1)
		{
			printf("%d us",high_value);
			high_complete_flag = 0;
		}
		Delay_s(10);
	}
	
}

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

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

相关文章

Edge浏览器入门

关于作者: CSDN内容合伙人、技术专家, 从零开始做日活千万级APP,带领团队单日营收超千万。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、商业化变现、人工智能等,希望大家多多支持。 目录 一、导读二、概览…

【C++11】Lambda 表达式

Lambda表达式简介 Lambda 表达式是 C11 中语法之一Lambda 表达式把函数看作对象,把这个表达式当做对象使用Lambda 表达式可以赋值给变量,也可以当做参数传给真正的函数 Lambda表达式语法解析 [capture-list] (parameters) mutable -> return-type {…

【汇编要笑着学】汇编模块化编程 | call和ret调用指令 | jmp跳转指令 | inc自加指令

Ⅰ.汇编模块化编程 0x00 一个简单的例子 我们了解模块化编程前先给出一个例子,方便大家快速了解。 SECTION MBR vstart0x7c00 ; 起始地址编译在0x7c00mov ax,cs mov ds,ax mov es,axmov ss,axmov fs,axmov sp,0x7c00 ; 上面这些都没什…

低代码开发平台

低代码开发平台(LCDP)本身也是一种软件,它为开发者提供了一个创建应用软件的开发环境。看到“开发环境”几个字是不是很亲切?对于程序员而言,低代码开发平台的性质与IDEA、VS等代码IDE(集成开发环境&#x…

Python 自学(八) 之模块

目录 1. import语句导入模块 P206 2. from ... import 语句导入模块 P207 3. 模块的搜索目录 sys.path P209 4. 以主程序的形式执行 __name__ P212 5. python中的包 P213 1. import语句导入模块 P206 同一目录下&…

centos7下搭建ldap服务器

参考: 全网最全Centos7.9搭建LDAP服务器图形界面_ldap服务器搭建-CSDN博客 LDAP服务搭建 - 简书 https://www.cnblogs.com/netsa/p/16017326.html 安装 #安装ldap服务 yum install -y openldap-servers openldap-clients openldap openldap-devel compat-openl…

centos docker-compose安装教程-2024最新版 亲测可用

目录 长时间不安装,生疏了,再次记录下 1.下载 2.修改名称 3.提权 4.测试验证 长时间不安装,生疏了,再次记录下 1.下载 官网地址 docker-compose官网地址:https://docs.docker.com/compose/compose-file/compose-file-v3/ #进入目录 cd /usr/local/bin#下载 wg…

统信UOS操作系统上禁用IPv6

原文链接:统信UOS操作系统上禁用IPv6 hello,大家好啊!继之前我们讨论了如何在麒麟KYLINOS上禁用IPv6之后,今天我要给大家带来的是在统信UOS操作系统上禁用IPv6的方法。IPv6是最新的网络通信协议,但在某些特定的网络环境…

首次落地零担快运!商用车自动驾驶跑出交付加速度

即将迈入2024年,还活着的自动驾驶玩家,身上有两个显著标签:选对了细分赛道、会玩。 10月以来,Cruise宣布在美国德州奥斯汀、休斯顿、亚利桑那州凤凰城和加州旧金山全面停止所有自动驾驶出租车队运营服务,通用汽车计划…

解决:Windows 无法访问指定设备、路径或文件。你可能没有适当的权限访问改项目。

故障情况:双击打开我的电脑和文件夹均弹出图上提示。右击可以打开,任务栏WIN开始 打不开,时钟和通知都点不开,所有系统自带的软件统统无法打开,但第三方软件可以正常打开。 故障原因:钉钉DingTalk_v7.5.0.…

SpringMVC RESTful

文章目录 1、RESTful简介a>资源b>资源的表述c>状态转移 2、RESTful的实现3、HiddenHttpMethodFilter 1、RESTful简介 REST:Representational State Transfer,表现层资源状态转移。 a>资源 资源是一种看待服务器的方式,即&…

Python开源项目周排行 2024年第2周

点赞关注转发三连,您的支持是我的动力! Python 趋势周报,按周浏览往期 GitHub,Gitee 等最热门的Python开源项目,入选的项目主要参考GitHub Trending,部分参考了Gitee和其他。排名不分先后,都是当周相对热门的项目。 …

[开发语言][c++]:Static关键字和全局变量

Static关键字和全局变量 1. 生命周期、作用域和初始化时机2. 全局变量3. Static 关键字3.1 面向过程3.1.1 静态全局变量3.1.2 静态局部变量(单例中会使用)3.1.3 静态函数 3.2 面向对象3.2.1 类内静态成员变量3.2.2 类内静态成员函数 Reference 写在前面&…

蓝桥杯练习题(九)

📑前言 本文主要是【算法】——蓝桥杯练习题(九)的文章,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是听风与他🥇 ☁️博客首页:CSDN主页听风与他 …

ArrayBlockingQueue的使用

异步日志打印模型概述 在高并发、高流量并且响应时间要求比较小的系统中同步打印日志已经满足不了需求了,这是因为打印日志本身是需要写磁盘的,写磁盘的操作会暂时阻塞调用打印日志的业务线程,这会造成调用线程的rt增加。 如图所示为同步日…

C# Winform翻牌子记忆小游戏

效果 源码 新建一个winform项目命名为Matching Game,选用.net core 6框架 并把Form1.cs代码修改为 using Timer System.Windows.Forms.Timer;namespace Matching_Game {public partial class Form1 : Form{private const int row 4;private const int col 4;p…

C#中的反射(Reflection)使用经典案例

文章目录 1. 动态加载和调用类的方法2. 记录用户修改行为3. 调用私有构造函数4. 泛型类型的动态创建和使用5. 动态类型转换与检查6. 获取和设置私有、受保护成员7. 枚举程序集、模块、类型等信息8. 处理泛型类型参数9. 动态生成代码或动态编译10. 配置驱动的应用程序扩展注意事…

粒子群算法优化RBF神经网络回归分析

目录 完整代码和数据下载链接:粒子群算法优化RBF神经网络回归分析(代码完整,数据齐全)资源-CSDN文库 https://download.csdn.net/download/abc991835105/88738570 RBF的详细原理 RBF的定义 RBF理论 易错及常见问题 RBF应用实例,基于rbf的空调功率预测 代码 结果分析 展望…

动态规划篇-03:打家劫舍

198、打家劫舍 状态转移方程 base case 边界问题就是:走到最后一间房子门口也没抢,那么最终抢到的金额为0 明确状态 “原问题和子问题中会变化的变量” 抢到的金额数就是状态,因为随着在每一件房子门口做选择,抢到的金额数会随…

Springboot3新特性:开发第一个 GraalVM 本机应用程序(完整教程)

在讲述之前,各位先自行在网上下载并安装Visual Studio 2022,安装的时候别忘了勾选msvc 概述:GraalVM 本机应用程序(Native Image)是使用 GraalVM 的一个特性,允许将 Java 应用程序编译成本机二进制文件&am…