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

news2024/7/4 4:32:07

目录

写在前面

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

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

测试效果


写在前面

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
              
              //已经测了1s
              m1.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.coloradmin.cn/o/617464.html

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

相关文章

手把手教你F103工程文件的创建并且通过protesu仿真验证创建工程文件的正确性(低成本)

目录 一、新建工程文件夹 二、新建一个工程框架 三、添加文件 四、仿真验证 五、仿真调试中遇到的问题并解决 一、新建工程文件夹 新建工程文件夹分为 2 个步骤&#xff1a;1&#xff0c;新建工程文件夹&#xff1b;2&#xff0c;拷贝工程相关文件。 1.新建工程文件 首先…

【04】STM32·HAL库开发-MDK5使用技巧 |文本美化 | 代码编辑技巧 | 查找与替换技巧 | 编译问题定位 | 窗口视图初始化

目录 1.文本美化&#xff08;熟悉&#xff09;1.1编辑器设置1.2字体和颜色设置1.3用户关键字设置1.4代码提示&语法检测1.5global.prop文件妙用 2.代码编辑技巧&#xff08;熟悉&#xff09;2.1Tab键的妙用2.2快速定位函数或变量被定义的地方2.3快速注释&快速取消注释 3…

python面向对象操作2(速通版)

目录 一、私有和公有属性的定义和使用 1.公有属性定义和使用 2.私有属性 二、继承 1.应用 2.子类不能用父类的私有方法 3.子类初始化父类 4.子类重写和调用父类方法 5.多层继承 6.多层继承-初始化过程 7.多继承基本格式 8.多层多继承时的初始化问题 9.多继承初始化…

云原生Docker Cgroups资源控制操作

资源控制 Docker 通过 Cgroup 来控制容器使用的资源配额&#xff0c;包括 CPU、内存、磁盘三大方面&#xff0c; 基本覆盖了常见的资源配额和使用量控制。 Cgroup 是 ControlGroups 的缩写&#xff0c;是 Linux 内核提供的一种可以限制、记录、隔离进程组所使用的物理资源(如…

Node服务器-express框架

1 Express认识初体验 2 Express中间件使用 3 Express请求和响应 4 Express路由的使用 5 Express的错误处理 6 Express的源码解析 一、手动创建express的过程&#xff1a; 1、在项目文件的根目录创建package.json文件 npm init 2、下载express npm install express 3、基本…

kafka3

分区副本机制 kafka 从 0.8.0 版本开始引入了分区副本&#xff1b;引入了数据冗余 用CAP理论来说&#xff0c;就是通过副本及副本leader动态选举机制提高了kafka的 分区容错性和可用性 但从而也带来了数据一致性的巨大困难&#xff01; 6.6.2分区副本的数据一致性困难 kaf…

多模态学习

什么是多模态学习&#xff1f; 模态 模态是指一些表达或感知事物的方式&#xff0c;每一种信息的来源或者形式&#xff0c;都可以称为一种模态 视频图像文本音频 多模态 多模态即是从多个模态表达或感知事物 多模态学习 从多种模态的数据中学习并且提升自身的算法 多…

【k8s 系列】k8s 学习三,docker回顾,k8s 起航

k8s 逐渐已经作为一个程序员不得不学的技术&#xff0c;尤其是做云原生的兄弟们&#xff0c;若你会&#xff0c;那么还是挺难的 学习 k8s &#xff0c;实践尤为重要&#xff0c;如果身边有自己公司就是做云的&#xff0c;那么云服务器倒是不用担心&#xff0c;若不是&#xff…

IMX6ULL PHY 芯片驱动

前言 之前使用 IMX6ULL 开发板时遇到过 nfs 挂载不上的问题&#xff0c;当时是通过更换官方新版 kernel 解决的&#xff0c;参考《挂载 nfs 文件系统》。 今天&#xff0c;使用自己编译的 kernel 又遇到了该问题&#xff0c;第二次遇到了&#xff0c;该正面解决了。 NFS 挂载…

18JS09——作用域

作用域 一、作用域1、作用域 二、变量的作用域1、变量作用域的分类2、全局变量3、局部变量4、全局变量和局部变量区别 三、作用域链 目标&#xff1a; 1、作用域 2、变量的作用域 3、作用域链 一、作用域 1、作用域 通常来说&#xff0c;一段程序代码中所用到的名字并不总是有…

python基础----06-----文件读写追加操作

一 文件编码概念 思考&#xff1a;计算机只能识别: 0和1&#xff0c;那么我们丰富的文本文件是如何被计算机识别&#xff0c;并存储在硬盘中呢? 答案&#xff1a;使用编码技术(密码本)将内容翻译成0和1存入。 常见编码有UTF8&#xff0c;gbk等等。不同的编码&#xff0c;将内…

vulnhub靶场之DC-3渗透教程(Joomla CMS)

目录 0x01靶机概述 0x02靶场环境搭建 0x03主机发现 0x04靶场渗透过程 ​ 0x05靶机提权 0x06渗透实验总结 0x01靶机概述 靶机基本信息&#xff1a; 靶机下载链接https://download.vulnhub.com/dc/DC-3-2.zip作者DCAU发布日期2020年4月25日难度中等 0x02靶场环…

【Flink】DataStream API使用之输出算子(Sink)

输出算子&#xff08;Sink&#xff09; Flink作为数据处理框架&#xff0c;最终还是需要把计算处理的结果写入到外部存储&#xff0c;为外部应用提供支持。Flink提供了很多方式输出到外部系统。 1. 连接外部系统 在Flink中我们可以在各种Fuction中处理输出到外部系统&#xf…

C#读写参数到APP.Config

C#读写参数到APP.Config 介绍程序Demo常见错误 介绍 系统在开发时&#xff0c;可能需要设置默认参数&#xff0c;比如数据库的链接参数&#xff0c;某个参数的默认数据等等。对于这些数据&#xff0c;可直接在app.config中读取。 在读写时&#xff0c;需要先了解configuratio…

echo命令在Unix中的作用以及其常见用法

在Unix系统中&#xff0c;"echo"是一个常用的命令&#xff0c;用于在终端或脚本中输出文本。它可以将指定的字符串或变量的值打印到标准输出&#xff0c;从而向用户提供信息或进行调试。 本文将详细介绍"echo"命令在Unix中的作用以及其常见用法。 基本语法…

Keras-3-实例1-二分类问题

1. 二分类问题 1.1 IMDB 数据集加载 IMDB 包含5w条严重两极分化的评论&#xff0c;数据集被分为 2.5w 训练数据 和 2.5w 测试数据&#xff0c;训练集和测试集中的正面和负面评论占比都是50% from keras.datasets import imdb(train_data, train_labels), (test_data, test_l…

UE5 Chaos破碎系统学习1

在UE5中&#xff0c;Chaos破碎系统被直接进行了整合&#xff0c;本篇文章就来讲讲chaos的基础使用。 1.基础破碎 1.首先选中需要进行破碎的模型&#xff0c;例如这里选择一个Box&#xff0c;然后切换至Fracture Mode&#xff08;破碎模式&#xff09;&#xff1a; 2.点击右侧…

JAVA实现打字练习软件

转眼已经学了一学期的java了&#xff0c;老师让我们根据所学知识点写一个打字练习软件的综合练习。一开始我也不是很有思路&#xff0c;我找了一下发现csdn上关于这个小项目的代码也不算很多&#xff0c;所以我最后自己在csdn查了一些资料&#xff0c;写了这么一个简略版本的打…

【C++】——list的介绍及模拟实现

文章目录 1. 前言2. list的介绍3. list的常用接口3.1 list的构造函数3.2 iterator的使用3.3 list的空间管理3.4 list的结点访问3.5 list的增删查改 4. list迭代器失效的问题5. list模拟实现6. list与vector的对比7. 结尾 1. 前言 我们之前已经学习了string和vector&#xff0c…

Remix IDE已支持Sui Move在线开发

网页版Remix IDE与WELLDONE Code插件结合&#xff0c;让您无需本地设置或安装即可开始构建Sui应用程序。 不熟悉Sui的构建者可能想在正式配置开发环境之前&#xff0c;浅尝一下构建Sui应用程序。Remix IDE与WELLDONE Code插件组合&#xff0c;即可帮助构建者实现从浏览器窗口开…