STM32 输入捕获模式测频率

单片机学习!

目录

文章目录

前言

一、输入捕获测频率配置步骤

二、代码示例及注意事项

2.1 RCC开启时钟

2.2 GPIO初始化

2.3 配置时基单元

2.4 配置输入捕获单元

2.5 选择从模式的触发源

2.6 配置从模式为Reset

2.7 开启定时器

总结


前言

        博文介绍如何配置输入捕获电路来测量频率。


一、输入捕获测频率配置步骤

第一步、RCC开启时钟,把GPIO和TIM的时钟打开。

第二步、GPIO初始化,把GPIO配置成输入模式。一般选择上拉输入或者浮空输入模式。

第三步、配置时基单元,让CNT计数器在内部时钟的驱动下自增运行。

第四步、配置输入捕获单元,包括滤波器、极性、直连通道还是交叉通道、分频器这些参数。用一个结构体就可以统一进行配置了。

第五步、选择从模式的触发源,触发源选择为TI1FP1,这里调用一个库函数,给一个参数就行。

第六步、选择触发之后执行的操作,执行Reset操作,这里也是调用一个库函数就行了。

第七步、开启定时器,调用TIM_Cmd函数。

        按以上步骤配置,所有的电路就能配合起来,按照需求工作。当需要读取最新一个周期的频率时,直接读取CCR寄存器,然后按照 fc/N 计算以下就行了。

二、代码示例及注意事项

2.1 RCC开启时钟

        将需要的TIM外设GPIO外设的时钟打开。打开时钟后定时器的基准时钟和整个外设的工作时钟就会同时打开。

代码示例:

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//使用APB1的开启时钟函数,因为TIM3是APB1总线的外设。RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

2.2 GPIO初始化

        GPIO口可以在引脚定义表中查看:

        默认复用功能这一列就是片上外设的端口和GPIO的连接关系。可以找到 TIM3的通道1和通道2对应PA6和PA7;TIM3的通道3和通道4对应PB0和PB1.本文举例使用TIM3的通道1引脚,所以就初始化PA6引脚。

        GPIO配置成输入模式,选择上拉输入。

代码示例:

	GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode= GPIO_Mode_IPU;//这里选择上拉输入GPIO_InitStruct.GPIO_Pin= GPIO_Pin_6;GPIO_InitStruct.GPIO_Speed= GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStruct);

2.3 配置时基单元

        配置时基单元,包括时钟源选择的配置。

  1. 时基单元选择时钟源。
  2. 配置时基单元,包括预分频器、自动重装器、计数模式等,这些参数可用结构体配置。

代码示例:

	TIM_InternalClockConfig(TIM3);TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_ClockDivision= TIM_CKD_DIV1;//指定时钟分频TIM_TimeBaseInitStructure.TIM_CounterMode= TIM_CounterMode_Up;//计数器模式TIM_TimeBaseInitStructure.TIM_Period= 65536-1;//ARR自动重装器的值TIM_TimeBaseInitStructure.TIM_Prescaler= 72-1;//PSC预分频器的值TIM_TimeBaseInitStructure.TIM_RepetitionCounter= 0;//重复计数器的值TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);

结构体成员:

  • TIM_ClockDivision:指定时钟分频,用于信号经过滤波器时的滤波采样频率。
  • TIM_CounterMode:计数器模式,这里选择向上计数模式TIM_CounterMode_Up。
  • TIM_Period :ARR自动重装器的值,设置大一些防止计数溢出。这里设置65536-1,也就是16位的计数器满量程计数。
  • TIM_Prescaler:PSC预分频器的值,这个值决定了测周法的标准频率fc,72M / 预分频,就是计数器自增的频率,就是计数标准频率。这里给 72-1,这样标准频率就是72M / 72 = 1MHz。
  • TIM_RepetitionCounter:重复计数器的值,只有高级定时器才有,本文初始化通用寄存器,所以值给0。

2.4 配置输入捕获单元

代码示例:

TIM_ICInitTypeDef TIM_ICInitStructure;
TIM_ICInitStructure.TIM_Channel=TIM_Channel_1;//TIM_Channel选择通道
TIM_ICInitStructure.TIM_ICFilter=0xF;//TIM_ICFilter用来配置输入捕获的滤波器
TIM_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;//TIM_ICPolarity极性
TIM_ICInitStructure.TIM_ICPrescaler=TIM_ICSelection_DirectTI;//TIM_ICPrescaler分频器
TIM_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;//TIM_ICSelection配置数据选择器TIM_ICInit(TIM3,&TIM_ICInitStructure);


        TIM_Channel选择通道,因为TIM_ICInit函数只有一个,所以要靠结构体的这个参数来指定是配置哪个通道。这里选择通道1.

        TIM_ICFilter用来配置输入捕获的滤波器,如果信号有毛刺和噪声,就可以增大滤波器参数,可以有效避免干扰。参数的取值范围0x0到0xF之间,数越大滤波效果越好,每个数值对应的采样频率和采样次数,可查看参考手册。

        注意滤波器和分频器的区别,虽然两者都可以计次,但是滤波器计次并不会改变信号的原有频率,一般滤波器的采样频率会远高于信号频率,所以它只会滤除高频噪声,使信号更平滑,1KHz滤波之后仍然是1KHz,信号频率不会变化。而分频器就是对信号本身进行计次了,会改变频率。1KHz,2分频之后就是500Hz,4分频之后就是250Hz。

        TIM_ICPolarity极性,这个对应图中边沿检测、极性选择的部分,选择上升沿触发还是下降沿触发。这里需要上升沿触发。

  • TIM_ICPolarity_Rising上升沿触发
  • TIM_ICPolarity_Falling下降沿触发
  • TIM_ICPolarity_BothEdge上升沿下降沿都触发

        TIM_ICPrescaler分频器,这个参数配置的是对应图中触发信号分频器。不分频就是每次触发都有效,二分频就是每隔一次有效一次,以此类推。

  • TIM_ICPSC_DIV1  不分频  
  • TIM_ICPSC_DIV2  二分频       
  • TIM_ICPSC_DIV4  四分频                   
  • TIM_ICPSC_DIV8  八分频                   

这个分频值不能任意指定,只能选择这4种,这里需要每次出发都有效,所以选择TIM_ICPSC_DIV1不分频。

        TIM_ICSelection选择触发信号从哪个引脚输入,这个参数是配置数据选择器的,可以选择直连通道或者交叉通道。示例选择了TIM_ICSelection_DirectTI直连通道输入。

  • TIM_ICSelection_DirectTI直连通道的输入
  • TIM_ICSelection_IndirectTI交叉通道的输入

        最后把TIM_ICInitStructure结构体地址放在TIM_ICInit函数里。

2.5 选择从模式的触发源

        配置TRGI的触发源为TI1FP1.

代码示例:

	TIM_SelectInputTrigger(TIM3,TIM_TS_TI1FP1);

  *     @arg TIM_TS_ITR0: Internal Trigger 0*     @arg TIM_TS_ITR1: Internal Trigger 1*     @arg TIM_TS_ITR2: Internal Trigger 2*     @arg TIM_TS_ITR3: Internal Trigger 3*     @arg TIM_TS_TI1F_ED: TI1 Edge Detector*     @arg TIM_TS_TI1FP1: Filtered Timer Input 1*     @arg TIM_TS_TI2FP2: Filtered Timer Input 2*     @arg TIM_TS_ETRF: External Trigger input

        这里给出的8个可选触发源对应上图触发源选择的8个模式。这里选择TIM_TS_TI1FP1。
 

2.6 配置从模式为Reset

代码示例:

	TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Reset);

  *     @arg TIM_SlaveMode_Reset: Rising edge of the selected trigger signal (TRGI) re-initializes*                               the counter and triggers an update of the registers.*     @arg TIM_SlaveMode_Gated:     The counter clock is enabled when the trigger signal (TRGI) is high.*     @arg TIM_SlaveMode_Trigger:   The counter starts at a rising edge of the trigger TRGI.*     @arg TIM_SlaveMode_External1: Rising edges of the selected trigger (TRGI) clock the counter.

        这里的4种从模式对应上图中的4种从模式。从模式中还有3个Encoder从模式,是给编码器接口用的,有其他函数可以配置。

        例子中选择Reset这个模式。

2.7 开启定时器

        开启定时器,调用TIM_Cmd函数。

代码示例:

	TIM_Cmd(TIM3,ENABLE);

        启动定时器之后,CNT就会在内部时钟的驱动下不断自增。即使信号没有过来,它也会不断自增,等到有信号来的时候,会在从模式的作用下自动清零,不会影响测量。

        初始化之后整个电路就可以全自动测量了。


总结

        以上就是今天要讲的内容,本文仅仅简单介绍了输入捕获的配置步骤和注意事项。

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

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

相关文章

OpenAI 全新发布文生视频模型 Sora,支持 60s 超长长度,有哪些突破?将带来哪些影响?

Sora大模型简介 OpenAI 的官方解释了在视频数据基础上进行大规模训练生成模型的方法。 我们下面会摘取其中的关键部分罗列让大家快速get重点。 喜欢钻研的伙伴可以到官网查看技术报告: https://openai.com/research/video-generation-models-as-world-simulator…

AI破局俱乐部,你要了解的都在这里

您好,我是码农飞哥(wei158556),感谢您阅读本文,欢迎一键三连哦。💪🏻 1. Python基础专栏,基础知识一网打尽,9.9元买不了吃亏,买不了上当。 Python从入门到精通…

【C#】使用代码实现龙年春晚扑克牌魔术(守岁共此时),代码实现篇

欢迎来到《小5讲堂》 大家好,我是全栈小5。 这是《C#》系列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对知识点的理解和掌握。…

使用VBA将多个txt批量转换成excel表并保存

VBA将多个txt批量转换成excel表并保存 Sub ykcbf() Set fso CreateObject("scripting.filesystemobject")Application.ScreenUpdating FalseApplication.DisplayAlerts Falsep ThisWorkbook.Path & ""On Error Resume NextFor Each f In fso.GetF…

Linux文件监控方法

Linux系统开发程序,有时候需要监控配置文件的变化,做出相应操作,下面将介绍常用的文件、目录监控方法: 函数介绍: 1.Inotify系列函数: Inotify_init(void) 系统返回一个文件描述…

mac下mysql 常用命令

mysql启动命令 在Mac OS X启动和停止MySQL服务的命令, 启动MySQL服务 sudo /usr/local/mysql/support-files/mysql.server start 停止MySQL服务 sudo /usr/local/mysql/support-files/mysql.server stop 重启MySQL服务 sudo /usr/local/mysql/support-files/mys…

大模型量化技术原理-LLM.int8()、GPTQ

近年来,随着Transformer、MOE架构的提出,使得深度学习模型轻松突破上万亿规模参数,从而导致模型变得越来越大,因此,我们需要一些大模型压缩技术来降低模型部署的成本,并提升模型的推理性能。 模型压缩主要分…

不知如何获取1688工厂档案信息,你还在为此烦恼吗?

阿里巴巴集团旗下的B2B电子商务网站,提供海量优质商品,为采购商和供应商提供交流、合作、采购等服务,是很多没有货源优势的电商卖家首选的货源途径,也是国内最大、货源种类最齐全的货源网站。 不少做跨境电商无货源的朋友都想要1…

MySQL学习记录——십삼 视图及用户、权限管理

文章目录 1、视图2、用户管理3、权限管理 1、视图 视图把查询出来的结果以表结构的形式存储起来,视图和基表有关系,两者的数据变化都会互相影响。 在查询时,假如要经常查询一条记录,select …,那么为了方便&#xff…

用html编写的招聘简历

用html编写的招聘简历 相关代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</tit…

C语言:指针与内存

C语言&#xff1a;指针与内存 内存与地址指针变量取地址指针变量解引用指针的大小 指针运算指针 - 整数指针 - 指针指针关系运算 const修饰指针字符指针野指针assert断言传址调用 内存与地址 计算机上CPU&#xff08;中央处理器&#xff09;在处理数据的时候&#xff0c;需要…

rk3568 WDG

rk3568 WDG 在嵌入式系统中,看门狗(Watchdog)是一种用于监控系统运行状态并在系统出现故障或死锁时自动重启系统的机制。 监控系统运行状态:看门狗定时器会周期性地计数,在规定的时间内如果系统未能对看门狗进行喂狗操作(即重置看门狗计数器),就会认为系统出现故障或死…

探索JDK5的新特性:革新编程体验的里程碑

引言 Java Development Kit (JDK) 5&#xff0c;于2004年发布&#xff0c;是Java发展历程中具有里程碑意义的一个版本。它不仅引入了一系列关键的编程新特性&#xff0c;还大大提升了开发者的生产力和代码质量。本文将带领大家深入了解JDK 5带来的变革性创新&#xff0c;包括泛…

自定义异常处理演示

​ 为了防止黑客从前台异常信息&#xff0c;对系统进行攻击。同时&#xff0c;为了提高用户体验&#xff0c;我们都会都抛出的异常进行拦截处理。 一、全局异常处理 编写一个异常拦截类&#xff0c;如下&#xff1a;ControllerAdvice&#xff0c;很多初学者可能都没有听说过…

《最新出炉》系列初窥篇-Python+Playwright自动化测试-19-处理鼠标拖拽-中篇

1.简介 上一篇中&#xff0c;主要是介绍了拖拽的各种方法的理论知识以及实践&#xff0c;今天宏哥讲解和分享一下划取字段操作。例如&#xff1a;需要在一堆log字符中随机划取一段文字&#xff0c;然后右键选择摘取功能。 2.划取字段操作 划取字段操作就是在一段文字中随机选…

Linux系统——http协议介绍

目录 引言——Internet起源 一、http协议——超文本传输协议 1.http相关概念 2.访问浏览器的过程 3.http协议通信过程 4.http相关技术 4.1WEB开发语言 4.2html 4.3CSS 4.4JS 5.MIME——Multipurpose Internet Mail Extensions 多用途互联网邮件扩展 6.URI URN URL的…

ubuntu配置pip

windows的pip镜像 在C:\Users\当前用户\下创建.pip文件夹在.pip下创建pip.ini文件编辑pip.ini添加如下内容 [global] index-url https://mirror.baidu.com/pypi/simple [install] trusted-host https://mirror.baidu.com/pypi ubuntu的pip镜像 当前用户的pip镜像 1. 进入用…

申请 Segfault 的免费 VPS

打开 Segfault 的官网&#xff1a;https://shell.segfault.net/&#xff0c;然后点击“I’m new here”在弹出的窗口中&#xff0c;复制以保存访问密钥点击 continue&#xff0c;进入主页&#xff0c;然后敲回车以创建服务器如需重返回自己的服务器&#xff0c;可以在官网点击“…

【Redis,Java】Redis的两种序列化方式—nosql数据库

redis和mysql的区别&#xff1a; redis是属于nosql的数据库&#xff0c;而mysql是属于sql数据库&#xff0c;redis是属于nosql数据库。mysql是存储在磁盘中的&#xff0c;redis是存储在内存中的&#xff0c;所以redis的读取书读快。这里所说的redis代表nosql&#xff0c;而mysq…

【wails】(1):使用go做桌面应用开发,wails框架入门学习,在Linux上搭建环境,运行demo项目,并打包测试

1&#xff0c;视频地址 https://www.bilibili.com/video/BV1fK421b7QC/ 【wails】&#xff08;1&#xff09;&#xff1a;使用go做桌面应用开发&#xff0c;wails框架入门学习&#xff0c;在Linux上搭建环境&#xff0c;运行demo项目&#xff0c;并打包测试 2&#xff0c;参考…