当前位置: 首页 > news >正文

STM32输入捕获模式详解(上篇):原理、测频法与测周法

1. 前言

在嵌入式系统的开发过程中,常常需要对外部信号进行精确的时间测量,如测量脉冲信号的周期、频率以及占空比等。STM32系列微控制器提供了丰富的定时器资源,其中的输入捕获(Input Capture, IC)模式能实现对信号的上升沿或下降沿的捕获,为测量这些信号提供了强大的工具。

本文将详细讲解STM32输入捕获模式的基本原理,特别是测频法测周法,并结合STM32定时器内部电路的运行流程,解释数据是如何传输和处理的。代码部分参考标准库函数以及你给出的初始化代码。

2. 输入捕获模式的基本概念

输入捕获模式用于测量外部信号的特征,例如脉冲信号的频率、周期以及占空比。在STM32中,输入捕获是通过定时器(Timer)硬件资源完成的。定时器的一个或多个通道被配置为输入捕获模式,捕捉信号的特定边沿(上升沿或下降沿)。每次信号沿触发时,定时器会将当前计数器值存储到捕获寄存器中。然后可以通过软件读取这些寄存器的值进行时间计算。

3. STM32输入捕获模式的工作原理

STM32的输入捕获功能通过定时器的通道(Channel)来实现,定时器内部的输入捕获寄存器(Capture Register, CCRx)用于记录信号触发时的计数器值(CNT)。STM32定时器每个通道都可以设置为输入捕获模式。

输入捕获的基本步骤:

  1. 定时器开始计数,并根据配置以一定频率递增。
  2. 当外部信号到来时,捕获触发发生(如上升沿或下降沿),此时将定时器的当前值捕获到相应的捕获寄存器中。
  3. 软件读取捕获值,并计算信号的周期、频率或占空比。

4. 定时器和寄存器的运行流程

在输入捕获模式下,STM32的定时器通过以下几个关键硬件模块协同工作:

  • 定时器计数器(CNT): 定时器的核心部分,持续递增,记录经过的时间。
  • 捕获寄存器(CCRx): 定时器在检测到输入信号的触发边沿时,将当前CNT值保存到对应的捕获寄存器。
  • 输入选择电路(TIx): 外部信号经过输入通道选择电路,定时器可以根据配置决定捕获上升沿或下降沿。
  • 触发控制逻辑: 控制信号沿的检测逻辑,根据输入选择的边沿触发事件,执行捕获操作。
内部电路工作流程:
  1. 外部信号通过GPIO引脚进入,GPIO被配置为输入模式,并通过内部电路连接到定时器的捕获输入通道(如CH1)。
  2. 当GPIO引脚检测到信号的上升沿或下降沿时,捕获逻辑触发,将当前定时器计数器值保存到相应的捕获寄存器。
  3. 软件从捕获寄存器读取值,并计算信号特性。

5. 测频法与测周法

在输入捕获模式中,常用的测量方法包括测频法测周法,它们各有特点并适用于不同的应用场景。

5.1 测频法(Frequency Measurement)

测频法是一种通过测量输入信号周期来计算其频率的方法。具体步骤如下:

  1. 配置定时器以捕获输入信号的两个连续上升沿的时间(或下降沿)。
  2. 记录定时器的捕获寄存器(CCR1)的两个值,计算这两个值的差值。
  3. 根据定时器的时钟频率(F_TIM)以及预分频值(PSC),计算信号的频率。

公式:

5.2 测周法(Period Measurement)

测周法通过测量输入信号的单个周期长度来计算信号的频率。其原理是通过定时器捕获信号的上升沿和下降沿,并计算上升沿到上升沿的时间差,从而得到周期。

步骤:

  1. 配置定时器,捕获信号的上升沿与下一次上升沿。
  2. 捕获到的定时器计数值差即为信号的周期。
  3. 使用公式计算周期:

然后反向计算频率:


6. STM32输入捕获模式的代码实现

以下代码展示了如何在STM32中实现输入捕获模式,测量外部信号的频率。代码基于你提供的代码示例,使用标准库函数进行定时器和GPIO的初始化。

输入捕获初始化函数:
void IC_Init(void)
{// 使能GPIOA和TIM3时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);// 配置PA6为输入模式GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 上拉输入GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;     // PA6引脚GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);// 配置TIM3内部时钟TIM_InternalClockConfig(TIM3);// 配置定时器基本参数TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructre;TIM_TimeBaseInitStructre.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseInitStructre.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInitStructre.TIM_Period = 65536 - 1;     // 自动重装载值 (ARR)TIM_TimeBaseInitStructre.TIM_Prescaler = 72 - 1;     // 预分频值 (PSC)TIM_TimeBaseInitStructre.TIM_RepetitionCounter = 0;  // 重复计数器TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructre);// 配置TIM3输入捕获通道1(上升沿捕获)TIM_ICInitTypeDef TIM_ICInitStructure;TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;TIM_ICInitStructure.TIM_ICFilter = 0xf;                // 滤波TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;  // 上升沿捕获TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;  // 输入分频TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; // 直接TI输入TIM_ICInit(TIM3, &TIM_ICInitStructure);// 启动TIM3TIM_Cmd(TIM3, ENABLE);
}
计算信号频率和占空比:
// 获取PWM信号的频率
uint32_t IC_GetFreq(void)
{return 1000000 / (TIM_GetCapture1(TIM3) + 1);  // 单位为Hz
}// 获取PWM信号的占空比
uint32_t IC_GetDuty(void)
{return (TIM_GetCapture2(TIM3) + 1) * 100 / (TIM_GetCapture1(TIM3) + 1);
}

7. 小结

在本文中,我们详细讲解了STM32的输入捕获模式,介绍了测频法与测周法的概念,并结合代码实现了基本的输入捕获功能。通过配置定时器的捕获寄存器和GPIO,我们可以精确测量输入信号的频率和占空比。在实际项目中,您是更倾向于使用测频法还是测周法?是否遇到过捕获不准确的问题,如何解决?欢迎在评论区分享您的经验和见解!

下篇预告:在下一篇文章中,我们将进一步探讨如何通过STM32的PWI模式来实现对PWM信号的频率和占空比的测量,深入讲解定时器的两个通道如何协同工作。

相关文章:

STM32输入捕获模式详解(上篇):原理、测频法与测周法

1. 前言 在嵌入式系统的开发过程中,常常需要对外部信号进行精确的时间测量,如测量脉冲信号的周期、频率以及占空比等。STM32系列微控制器提供了丰富的定时器资源,其中的输入捕获(Input Capture, IC)模式能实现对信号的…...

面试中遇到的关于Transformer模型的问题有哪些?

Transformer是深度学习中极具影响力的模型架构之一,广泛应用于自然语言处理、计算机视觉等领域。它通过自注意力机制和并行计算等特点,取得了比传统模型(如RNN、LSTM)更优异的性能。本文将针对Transformer的多个关键问题进行详细探…...

【UE】自动添加Megascans所有资产到自己的账户

1. 复制如下代码: ((async (startPage 0, autoClearConsole true) > {const getCookie (name) > {const value ; ${document.cookie};const parts value.split(; ${name});if (parts.length 2) return parts.pop().split(;).shift();}const callCacheA…...

【函数】4.函数的单调性

本节课没有笔记示例,自己做好笔记! 复合函数的单调性 最值 没讲 提醒我...

网格剖分-耳切法效果展示

1.前言 将简单多边形转换成一组由同样顶点组成的三角形集合是计算机图形学中的一个经典问题。问题中,简单多边形是指由一组有序顶点组成的,点V0~点Vn-1。相邻的顶点之间通过边(Vi,Vi-1)连接,并且边(Vn-1,V0)连接起始点…...

电磁力、强相互作用力、弱相互作用力、强核力,以及它们之间的关系

电磁力、强相互作用力、弱相互作用力、强核力,以及它们之间的关系: 电磁力 (Electromagnetic Force): 定义:电磁力是带电粒子之间通过电荷相互作用产生的力。它由电场和磁场共同作用,影响带电粒子的运动。传递粒子:电磁…...

2.安装keepalived详细过程

1.下载地址: keepalived-2.3.1 keepalived-2.1.2 keepalived-2.0.18 三个版本tar包 2.keepalived安装详细过程 (1) 解压keepalived tar包 tar -zxvf keepalived-2.0.18.tar.gz(2)进入keepalived目录然后配置 #进入keepalived目录 cd keepalived-2.0.18/ #配置keepalived[配…...

面试题1-fail-safe机制与fail-fast 机制

1.定义 Fail-safe 和 Fail-fast,是多线程并发操作集合时的一种失败处理机制。 1.1.Fail-Safe机制 1.1.1.定义 Fail-Safe 机制的设计目标是在发生故障时,系统仍然能够继续运行,尽量避免导致整个系统崩溃。即使发生错误或异常,系统…...

C/C++复习(一)

1.sizeof 关于sizeof我们是经常使用的,所以使用方法就不需要提及了,这里我们需要注意的是,sizeof 后面如果是表达式可以不用括号,并且sizeof实际上不参与运算,返回的是内容的类型大小(size_t类型&#xff0…...

iOS Object-C 将数组倒置(倒叙)

使用NSArray自带的对象方法:reverseObjectEnumerator 代码如下: NSArray * tempArray [[NSArray alloc]initWithObjects:"a","b","c","d", nil]; //将tempArray转换成["d","c","b","a"]; …...

动态轻量级线程池项目

动态线程池: 使用线程池ThreadPoolExecutor过程中你是否有以下痛点呢? ① 代码中创建了一个ThreadPoolExecutor,但是不知道参数设置多少比较合适。 ② 凭经验设置参数值,上线后发现需要调整,改代码重新发布服务&…...

【AI知识点】批归一化(Batch Normalization)

更多AI知识点总结见我的专栏:【AI知识点】 AI论文精读、项目和一些个人思考见我另一专栏:【AI修炼之路】 有什么问题、批评和建议都非常欢迎交流,三人行必有我师焉😁 批归一化(Batch Normalization,BN&…...

【低代码】前端低代码开发日记2:遇到的问题(1)双向绑定

在前期的快速迭代阶段,虽然界面有些杂乱,但整体功能尚能凑合运行。真正让人头疼的,还是接下来几个关键功能的实现。 遇到的问题 双向绑定 在Vue中,v-model提供了方便的双向绑定功能,它是modelValue属性和onUpdate:m…...

10.9作业

1、鼠标和键盘事件 #include "widget.h" #include "ui_widget.h" #include <QDebug> #include <QMouseEvent>widget::widget(QWidget *parent): QWidget(parent), ui(new Ui::widget) {ui->setupUi(this);this->setWindowFlag(Qt::Fram…...

Go 语言中的错误和异常:设计理念与优势

Go 语言中的错误和异常&#xff1a;设计理念与优势 在软件开发中&#xff0c;错误处理是一个至关重要的环节。不同的编程语言对于错误和异常的处理方式各有不同。Go 语言将错误和异常进行了明确区分&#xff0c;这种设计理念带来了许多独特的优势。本文将深入探讨 Go 语言中错误…...

sqli-labs less-20 less-21 less-22 cookie注入

COOKIE 作用&#xff1a;是由网络服务器存储在你电脑硬盘上的一个txt类型的小文件&#xff0c;它和你的网络行为有关&#xff0c;记录了当前用户的状态 形式&#xff1a;keyvalue 例如&#xff1a;当我们登录某个账号后&#xff0c;服务器会在cookies进行记录 个人理解&#xf…...

IDEA下“File is read-only”可能原因及“找不到或无法加载主类”问题的解决

1.File is read-only”可能原因 写代码时想要修改这个静态变量的值&#xff0c;把这个语句注释掉&#xff0c;发现在这个文件中File is read-only无法编辑修改&#xff0c;于是想去掉这个状态 网上查看的解释大多是在File栏目或File->File Properties下可以找到Make File W…...

MySQL【知识改变命运】03

表的基本操作 1&#xff1a;查看所有表2&#xff1a;创建表3&#xff1a;查看表结构4&#xff1a;修改表5&#xff1a; 删除表 前言&#xff1a;我们先了解一个知识&#xff1a; MySQL安装后会有MySQL服务——管理多个库——每个库管理多个表——每个表管理多行数据——数据行由…...

【测试】BUG篇——BUG

bug的概念 定义&#xff1a;⼀个计算机bug指在计算机程序中存在的⼀个错误(error)、缺陷(flaw)、疏忽(mistake)或者故障(fault)&#xff0c;这些bug使程序⽆法正确的运⾏。Bug产⽣于程序的源代码或者程序设计阶段的疏忽或者错误。 准确的来说&#xff1a; 当且仅当规格说明&am…...

【高阶数据结构】深度探索二叉树进阶:二叉搜索树概念及其高效实现

高阶数据结构相关知识点可以通过点击以下链接进行学习一起加油&#xff01; 本章是高阶数据结构笔记的第一篇文章&#xff0c;将分享二叉搜索树的进阶概念及其高效实现的相关知识&#xff0c;欢迎大家阅读&#xff01; &#x1f308;个人主页&#xff1a;是店小二呀 &#x1f3…...

技术从业者的时间管理:如何平衡工作、学习和生活

在敏捷开发大行其道、技术迭代日新月异的当下&#xff0c;软件测试从业者正面临着前所未有的时间压力。一边是项目交付的紧迫期限、层出不穷的缺陷排查需求&#xff0c;一边是自动化测试工具、AI测试框架等新技术的学习焦虑&#xff0c;再加上对个人生活品质的追求&#xff0c;…...

RK3588 LGA核心板:高性能嵌入式开发的模块化解决方案

1. 项目概述&#xff1a;当旗舰SoC遇见极致封装最近在嵌入式圈子里&#xff0c;一个“小而强”的组合引起了我的注意&#xff1a;瑞芯微的旗舰级SoC RK3588&#xff0c;被塞进了一个极其紧凑的LGA封装里&#xff0c;做成了名为SOM-3588-LGA的核心板&#xff0c;并且已经现货发售…...

LabVIEW图形化编程实战:从数据流原理到高效测控系统开发

1. 项目概述与核心价值今天咱们来聊聊LabVIEW这门工具。很多刚接触自动测试、数据采集或者仪器控制的朋友&#xff0c;可能都听说过它的大名&#xff0c;但上手时总觉得它和传统的文本编程语言&#xff08;比如C、Python&#xff09;不太一样&#xff0c;有点无从下手。我最早接…...

嵌入式软件定时器原理与实现:从硬件限制到多任务调度

1. 软件定时器&#xff1a;从硬件限制到软件自由的桥梁在嵌入式开发里&#xff0c;定时器是个绕不开的话题。无论是让LED灯定时闪烁&#xff0c;还是需要周期性地采集传感器数据&#xff0c;甚至是实现一个简单的按键消抖&#xff0c;都离不开定时功能。硬件定时器&#xff08;…...

【软考高级架构】论文范文21——论Kappa架构在大数据平台中的设计与应用

论Kappa架构在大数据平台中的设计与应用 摘要 随着大数据技术的快速发展,传统Lambda架构因需要同时维护批处理和流处理两套系统,导致开发复杂度高、数据口径不一致、运维成本大等问题日益突出。Kappa架构作为一种精简的统一处理范式,通过将数据全部视为流、以消息队列为核…...

从“马变斑马”到“卫星图转地图”:用CycleGAN/pix2pix玩转自定义数据集(附制作教程)

从卫星影像到艺术创作&#xff1a;CycleGAN与pix2pix自定义数据集实战指南 当第一次看到卫星遥感图像自动转换成街道地图时&#xff0c;那种技术带来的震撼感至今难忘。这不仅仅是简单的滤镜效果&#xff0c;而是深度学习模型真正理解了两种图像模态之间的深层关联。作为计算机…...

当贝盒子H5 64G版618首销TOP1!多平台登顶,凭什么这么火?

2026年5月14日&#xff0c;当贝官方发布了618抢先购首日当贝盒子H5 64G版的首销战报。据官方数据显示&#xff0c;这款重磅升级的电视盒子在京东、天猫、抖音三大主流电商平台的电视盒子类目热销榜中&#xff0c;全部拿下TOP1席位&#xff0c;成为今年618大促第一天的现象级爆款…...

Mi-Create:零基础打造小米手表个性表盘的终极可视化神器

Mi-Create&#xff1a;零基础打造小米手表个性表盘的终极可视化神器 【免费下载链接】Mi-Create Unofficial watchface creator for Xiaomi wearables ~2021 and above 项目地址: https://gitcode.com/gh_mirrors/mi/Mi-Create 你是否厌倦了小米手表上那些千篇一律的官方…...

ESP32 OTA升级避坑指南:用Python脚本一键搭建本地服务器,告别手动配置

ESP32 OTA升级实战&#xff1a;Python自动化方案与高频问题破解 当你的ESP32设备部署在难以物理接触的场合——比如嵌入墙体的智能开关、高架桥上的环境监测节点&#xff0c;或是旋转机械内部的振动传感器&#xff0c;固件更新就成了开发者的噩梦。传统烧录器方案需要专人携带设…...

从51到Linux:一个嵌入式工程师的五年踩坑与填坑全记录(附避坑清单)

从51到Linux&#xff1a;一个嵌入式工程师的五年踩坑与填坑全记录&#xff08;附避坑清单&#xff09; 五年前&#xff0c;当我第一次点亮51单片机的LED灯时&#xff0c;绝没想到这条路上会有这么多隐藏的陷阱。从寄存器配置的字节对齐问题&#xff0c;到Linux驱动中的竞态条件…...