STM32频率测量

news2024/11/18 19:47:03

频率测量是个最基本的且常见的工业需求.
但是这种简单的需求却不是那么的好实现. 总体来看, 目前的单片机还是有很大的改进空间.
很少有频率测量能够覆盖所有的频率范围.
而使用 STM32F103 性能有限.
根据待测频率, 我分成低中高, 三个阶段. 分别对应着3种不同的测量方法.

低频 1hz- 200khz,

测量方法, STM32 时钟计数器的输入捕获中断函数测量法.
测量原理
输入捕获模式可以用来测量脉冲宽度或者测量频率。
在这里插入图片描述

STM32 的输入捕获,简单的说就是通过检测 TIMx_CHx 上的边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定时器的值(TIMx_CNT)存放到对应的通道的捕获/比较寄存器(TIMx_CCRx)里面,完成一次捕获。

原理:假定定时器工作在向上计数模式,图中 t1~t2 时间,就是我们需要测量的高电平时间。同样的, 也可以用来测两个下降沿也就是一个周期的间隔时间 . 主要原理还是计算两个边沿之间的计数器的差.

测量方法如下:首先设置定时器通道 x 为 上升沿捕获,这样t1 时刻,STM32就会用硬件捕获到当前的 CNT 值到CCRx,产生中断,然后在程序中读取CCRx即可.

注意: 我曾经想在取得CCRx后, 立即设置CNT=0, 使得CNT从0开始重新计数.下次捕获t2的时候直接读取到的CCRx中就是时间差, 但是实验证明这里 不能立即清零 CNT, ,因为这里从进入中断 到判断完毕再到设置CNT为0的过程中,CNT已经计数很多了, 这个时候清0,无疑会丢失从进入中断到设置CNT为0,这部分的时间的计数值. 最后会导致数值不准确,时钟频率越高, 丢失的个数越大. 所以这里只能每次读取CCRx的数值 .

这样到 t2 时刻,又会发生捕获事件,得到此时的 CNT 值到CCRx2。这样,根据定时器的计数频率,我们就可以算出 t2 - t1 的时间,从而得到高电平脉宽。 在 t1 ~ t2 之间,可能产生 N 次定时器溢出,这就要求我们对定时器溢出,做处理,防止高电平太长,导致数据不准确。如图14.1.1所示,t1 ~ t2之间,CNT计数的次数等于:N*ARR+CCRx2,有了这个计数次数,再乘以 CNT 的计数周期,即可得到 t2-t1 的时间长度。

此种方法要注意的几个点是,

  1. TIM定时器的计数器CNT是16位的(有的是32位的). 超出65536 将会溢出.需要在溢出时在中断函数中增加一个软件计数即可. (当然也可以降低计数器的时钟, 但是不建议.这样会降低测量精度)
  2. 定时器在计数中, 最好不要更改CNT值, 只读取即可.
  3. 当被测的频率高到一定程度时, 每次跳变系统都会进入中断, 当中断函数里面的处理过长时, 将会导致系统罢工. 所以这里应该要在中断中增加一个额外的停止TIM时钟计数的功能. 防止系统频繁进入中断. 在while 循环中定时开启即可. 一般情况下, 不需要实时计算频率. 定时1秒计算一次频率即可.

中频测量

输入捕获+DMA
使用DMA, 自动读取N个 TIM的CNT到数组中, 然后定时1秒去计算一次CNT之间的差, 取个平均值. 这样不用频繁的进入系统中断. DMA的速度比软件中断要稍微快那么一点, CPU的开销也小了很多.
理论上只要DMA搬运的速度跟得上新数据产生的速度, 就能测到频率.
此种方法注意事项:
1.因为用DMA搬运CNT数值, 所以无法处理CNT溢出问题.需要在软件中处理.溢出的数值. 例如抛弃掉异常值.
2.软件计算时应当停止DMA搬运, 否则可能覆盖正在计算的数值. 最好将DMA设置为一轮,不要循环搬运. 计算完毕再开启DMA搬运.爱心小提示.开启和停止之间要有时间间隙.给DMA搬运的时间.
3.并非所有的TIM的所有通道都支持DMA搬运输入捕获值, 据我所知,STM32F103 只有TIM1的CH1通道是支持DMA搬运输入捕获值的. 用时需要先用STM32CubeIDE 查看支持DMA搬运输入捕获值的定时器通道有哪些…

高频测量

对于更高频率的频率测量.

1. ADC + 软件测量
2. FFT

时间有限, 有空再写.

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

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

相关文章

springboot 协同办公OA管理系统源码带文字安装教程【免费分享】

Java协同办公OA管理系统源码带文字安装教程 文末获取源码! 框架:springboot freemark jpa mybatis mysql 环境:jdk8 mysql5.7 IntelliJ IDEA maven nginx 宝塔面板 这是一套OA办公系统,使用Maven作项目管理,基…

NETCAD GIS快速而简单的搜索引擎

NETCAD GIS快速而简单的搜索引擎 NETCAD GIS是一种支持国际标准的CAD和GIS软件,旨在为用户设计和使用地理信息系统。它还提供了CAD、GIS和光栅与未来的强大连接。 该程序也是一个快速而简单的搜索引擎,只能通过向查看器键入几个单词来访问,并…

嵌入式开发学习之--中断应用概览

文章目录前言一、什么是NVIC1.1NVIC 简介1.2 NVIC 寄存器简介二、中断优先级2.1优先级定义2.2优先级分组三、中断编程总结前言 中断是系统逻辑十分常用的,学好中断,以及中断优先级的合理配置,才能使自己的项目更加稳定。 提示:以…

rdd 相关信息整理

RDD 是什么? 官网描述 A Resilient Distributed Dataset (RDD), the basic abstraction in Spark. Represents an immutable, partitioned collection of elements that can be operated on in parallelRDD 是三个单词的首字母缩写,它表示弹性分布式数…

火爆全网的ChatGPT上手体验,文尾免费送账号!

文章目录1. ChatGPT公开信息2. ChatGPT上手体验3. ChatGPT目前趋势4. 福利派送1. ChatGPT公开信息 近期关于网路上对 ChatGPT(OpenAI发布的一款人工智能对话引擎)的讨论比较多。官方对ChatGPT的定义如下: We’ve trained a model called Cha…

[Linux打怪升级之路]-文件操作

前言 作者:小蜗牛向前冲 名言:我可以接受失败,但我不能接受放弃 如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正。 目录 一、认识操…

python -- PyQt5(designer)中文详细教程(七)控件2

控件2 本章我们继续介绍PyQt5控件。这次的有 QPixmap , QLineEdit , QSplitter ,和 QComboBox 。 图片 QPixmap 是处理图⽚的组件。本例中,我们使用 QPixmap 在窗⼜⾥显示⼀张图片。 from PyQt5.QtWidgets import (QWidget, QH…

PLC远程监控助力食品废水处理智能化管理

食品加工行业是用水大户,因其原料广泛、成品丰富,中间需要多种不同的加工工艺,因此排放的废水差异很大,废水量也不一样,对污水处理厂提出不同的要求。为了保证污水处理工作的稳定进行,保证视频废水的净化效…

Matplotlib入门[06]——figures,subplots,axes和ticks对象

Matplotlib入门[06]——figures,subplots,axes和ticks对象 参考: https://ailearning.apachecn.org/Matplotlib官网matplotlib xticks yticks import matplotlib.pyplot as pltfigures,axes和ticks的关系 这些对象的关系可以用下图表示&…

基于jsp+mysql+ssm服装商城平台-计算机毕业设计

项目介绍 实现一个基于SSM框架的服装商城平台的的设计与开发。实现用户从浏览服装,搜索服装,加入购物车,下订单,评论服装一整个购物流程的功能,系统采用了jsp的mvc框架,SSM(springMvcspringMybatis)框架进行开发,本系统使用mysql…

Matter中国开发者大会实录(2022年12月2日,深圳)

目录 背景介绍 Nodic-Matter Silicon Labs-Matter Telink-Matter NXP-Matter BEKEN-Matter ESP32-Matter 背景介绍 2022年12月2日,Matter中国区开发者大会在深圳举行。大概有300多位开发者到会,我也是其中的300分之一。这次大会从早上9点半开始&a…

pybind11的Hello World

pybind11的Hello World pybind11 是用来将c的函数\类等封装为python模块的。从而在python中就可以调用C的库。 安装 pybind11是个C的header-only的库。因此无需安装,只需要有头文件即可。 自己新建一个C文件夹。在文件夹内将pybind作为一个外部库,使…

第七次更新,Spring Cloud Alibaba,迎接微服务生态的下一个十年

Spring Cloud Alibaba是什么? 2022年都快过完了,我相信大家肯定不用我说Spring Cloud Alibaba是什么了! 近期阿里最新开源了一份,Spring Cloud Alibaba(全解第7版),我大概看了一下&#xff0c…

JAMA Neurology:帕金森病跨疾病阶段的新兴神经成像生物标记物

意义:帕金森病(PD)的成像生物标记物在临床试验中的发病进程监测方面起到越来越重要,也具有改善临床护理和管理的潜力。这篇综述阐述了临床医生和研究人员需要明确在临床过程中使用的PD诊断和发病进程的成像生物标记物的时间相关性。磁共振成像(扩散成像、…

目标检测算法——人体姿态估计数据集汇总(附下载链接)

🎄🎄近期,小海带在空闲之余收集整理了一批人体姿态估计数据集供大家参考。 整理不易,小伙伴们记得一键三连喔!!!🎈🎈 一、KTH 多视图足球数据集 数据集链接&#xff1a…

python快速实现NPV净现值计算

净现值指未来资金(现金)流入(收入)现值与未来资金(现金)流出(支出)现值的差额,是项目评估中净现值法的基本指标。未来的资金流入与资金流出均按预计折现率各个时期的现值…

2023年天津仁爱学院专升本报名确认缴费考试流程

2023年天津仁爱学院专升本报名确认缴费操作流程说明及考试时间一、报名操作流程 1. 报名注册 请考生于2022年12月7日上午9点—12月11日中午12:00点登录报名系统https://jw.tjrac.edu.cn/zsb,点击“注册”按钮后进入报名登录界面,先请仔细阅读…

多线程学习笔记(三)

一、缓存行 缓存行:从缓存中读取数据是按照一块来读取的,这一块叫做缓存行,64字节大小缓存一致性协议:当两个数位于同一个缓存行时,有两个线程需要同时读取了缓存行中的数据后进行修改,需要和另一个线程的…

如何使用CCES来生成双核DSP的可烧写文件以及Flash Program

作者的话 之前的文章里有写到如何使用CCES来进行DSP的flash program,那都是单核的DSP,而ADI还有很多双核甚至三核DSP,这些DSP应该如何操作呢,会有哪些不同?我再写一个文档来说一下。 跟单核DSP一样,在 CC…

【测绘程序设计】——角度与弧度的转换(C#,C++,Python)

本文分享了 测绘程序设计——角度与弧度的转换(含C#、C++和Python版),相关源代码(完整工程,直接运行)及使用示例如下。 目录 Part.Ⅰ 使用示例Chap.Ⅰ C#版Chap.Ⅱ C++版Chap.Ⅲ Python版Part.Ⅱ 代码分析Chap.Ⅰ C#版Chap.Ⅱ C++版Chap.Ⅲ Python版Part.Ⅲ 源码下载Part…