基于HAL库的STM32的单定时器的多路输入捕获测量脉冲频率(外部时钟实现)

news/2024/10/17 20:21:56/

目录

写在前面

一般的做法(定时器单通道输入捕获)

以外部时钟的方式(高低频都适用)

测试效果


写在前面

STM32的定时器本身有输入捕获的功能。可选择双端捕获,上升沿捕获或者是下降沿捕获。对应捕获频率来说,连续捕获上升沿或下降沿的时间间隔就是其脉冲的周期.

一般的做法(定时器单通道输入捕获)

定时器设置频率为1M.

每次进入输入捕获的中断回调函数  HAL_TIM_IC_CaptureCallback 就让其计数值CNT为0. 那么连续两次采样的计数值也就是 (TIMx->CCRx - 0) ,频率 =定时器频率/(TIMx->CCRx - 0).


void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance == TIM2){if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2){freq=htim->Instance->CCR2;freq = 1e6/freq;htim->Instance->CNT =0;}}
}

如果是单个定时器对多个通道进行采样呢?这时候就必须重新考虑如何测量频率了。通用做法:

(以上升沿为例,定时器的计数值TIMx->CNT设置为65535后溢出)

测量第一次上升沿的捕获值CCRx,即为first,并设置标记表示开始测量,若存在溢出则在定时器的溢出回调函数  HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)中记录溢出次数,直到第二个上升沿到来,计为 second,计算频率。

频率= 定时器的频率  /   (second - first +溢出次数*溢出值)

由上面的等式得出,若两个上升沿之间的计数值 > 定时器的频率 ,则脉冲的频率<1hz 属于低频。

低频是非常好测量的,难的是高频。若还想以直接的方式去测量高频,则不太现实,因为高频两个脉冲之间的间隔更短,而定时器的频率总不可能超过其系统频率,更不可能达到高频脉冲的频率。

直接不行变间接,将一段时间内的脉冲的个数进行计数统计,并记录所统计的这一段时间
频率  =  个数 /时间, 若设置时间为1s(特殊情况) 频率= 1s内的脉冲个数. 计时需要用到别的定时器。

以外部时钟的方式(高低频适用)

 

typedef struct mypwm{u32 ts; //记录的脉冲值u8 flag; //开始信号/结束信号u16 time; //记录的时间   } mypwm;mypwm m1 ={0};
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance == TIM6){if(m1.flag == 0) m1.flag = 1; //第一次进来else if(m1.flag == 1){ if( ++m1.time == 1000){//增加1ms//已经测了1sm1.time = 0;m1.flag = 0;freq = m1.ts;m1.ts = 0;} }}
}void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance == TIM2){if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2){if(m1.flag == 1)  m1.ts++;}}
}

测试效果

通过定位器去控制脉冲发生器的输出频率以此测量:


http://www.ppmy.cn/news/248355.html

相关文章

编译LineageOS-20并输入Pixel 2XL

编译LineageOS-20并输入Pixel 2XL 2023-6-6 hongxi.zhu 目录 编译LineageOS-20并输入Pixel 2XL一、编译LineageOS-201. 准备工作1.1 安装platform-tools1.2 安装必要的依赖1.3 创建相关目录1.4 下载repo可执行文件1.5 配置 2. 拉取源码2.1 初始化仓库2.2 同步源码 3. 编译源码3…

【算法】--- 几分钟了解直接选择排序(排序中最简单的排序)+快排(解决一切的优质算法)(中)

文章目录 前言&#x1f31f;一、常见的排序算法&#xff1a;&#x1f31f;二、选择排序---直接选择排序&#xff1a;&#x1f30f;2.1.1 基本思想&#xff1a;&#x1f30f;2.1.2 直接选择排序:&#x1f30f;2.1.3 直接选择排序的特性总结&#xff1a;&#x1f30f;2.1.4 思路&…

SpringBoot+MyBatisplus搭建校园新闻平台——已开源

概述 开发背景 校园新闻平台是以新闻宣传机构的在线信息发布需求为基础&#xff0c;随着数字化和信息化的快速发展&#xff0c;校园新闻在校园内的传播和沟通中变得越来越重要。学校需要一个有效的管理系统来整合、发布和传播校园新闻&#xff0c;以满足师生、校友和其他利益…

Java的引用

一、概述 其实java有4种引用&#xff0c;4种可分为强、软、弱、虚。我们将从这四个方面入手进行介绍。 二、强引用 首先看到我们有一个类叫M&#xff0c;在这个类里我重写了一个方法叫finalize()&#xff0c;我们可以看到这个方法是已经被废弃的方法&#xff0c;为什么要重写…

北大教授一年时间制作的Java300集课程,我免费分享给你~

Java是一门面向对象的编程语言&#xff0c;不仅吸收了C语言的各种优点&#xff0c;还摒弃了C里难以理解的多继承、指针等概念&#xff0c;因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表&#xff0c;极好地实现了面向对象理论&#xff0…

达内java面试题集_达内java面试题

JAVA面试题-COREJAVA部分1&#xff0e;在main(String[] args)方法内是否可以调用一个非静态方法&#xff1f;答案&#xff1a;不能2&#xff0e;同一个文件里是否可以有两个public类&#xff1f;答案&#xff1a;不能3&#xff0e;方法名是否可以与构造器的名字相同&#xff1f…

java cef 崩溃,xCrash异常补抓分析-Java奔溃

近来看了一些异常补抓相关资料&#xff0c;正好补一下相应的操作&#xff0c;发现爱奇艺的一个Xcrash的异常补抓框架 文章分为三部分&#xff0c;分别是Java奔溃&#xff0c;卡顿补抓&#xff0c;以及Native崩溃。 可以看一下基本架构的全貌 这一节是Java崩溃的说明 基本初始化…

没有容器Java怎么不停止_java – Maven Cargo不会停止容器

我有一个maven项目,我想使用Cargo-Maven-Plugin(1.1.1)启动和停止tomcat服务器来运行集成测试. org.codehaus.cargo cargo-maven2-plugin 1.1.1 start-container pre-integration-test start stop-container post-integration-test stop installed tomcat6x http://archive.apa…