TIM定时器输入捕获

TIM定时器输入捕获

文章目录

  • TIM定时器输入捕获
    • 1. 输入捕获
      • 1. 输入捕获的工作原理
      • 2. 输入捕获的应用场景
    • 2.输入捕获配置流程
      • 测量频率和占空比的函数

1. 输入捕获

输入捕获是STM32定时器的一项重要功能,它允许微控制器捕捉外部信号的变化(通常是边沿变化),并将当前计数器的值锁定到捕获/比较寄存器中。这项功能非常有用,可以用来测量外部信号的周期、频率、脉宽等参数。

1. 输入捕获的工作原理

  1. 配置捕获通道

    • 选择定时器的某个捕获/比较通道作为输入捕获通道。
    • 配置该通道的触发条件,如上升沿、下降沿或双边沿触发。
  2. 检测外部信号

    • 当输入信号的电平发生变化(如上升沿或下降沿)时,定时器会捕获当前计数器的值。
    • 这个值随后被锁存到对应的捕获/比较寄存器(TIMx_CCRx)中。
  3. 读取捕获值

    • 用户可以通过读取TIMx_CCRx寄存器来获取捕获到的值。
    • 根据计数器的频率和预分频器的设置,可以计算出信号的周期或频率。

2. 输入捕获的应用场景

  • 测量信号周期:通过捕获连续两次上升沿的时间差来计算信号周期。
  • 测量信号频率:根据信号周期计算信号频率。
  • 测量脉冲宽度:测量单个脉冲的持续时间。
  • 测量占空比:测量高电平相对于整个周期的比例。

2.输入捕获配置流程

这段代码配置了STM32的通用定时器TIM3以进行输入捕获,并提供了两个函数来计算输入信号的频率和占空比。下面是详细的配置流程解释:

  1. 启用时钟:

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    

    这两行代码分别启用了TIM3定时器和GPIOA端口的时钟。

  2. 配置GPIO引脚:

    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    

    这里配置了GPIOA.6引脚为上拉输入模式。

  3. 配置TIM3内部时钟:

    TIM_InternalClockConfig(TIM3);
    

    这一行配置TIM3使用内部时钟源。

  4. 配置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);
    

    这里设置了TIM3的基本定时器特性:

    • TIM_ClockDivision: 设置时钟分割因子为1,即不分频。
    • TIM_CounterMode: 设置向上计数模式。
    • TIM_Period: 设置自动装载寄存器值为65535,意味着每65536个计数周期后会重新加载。
    • TIM_Prescaler: 设置预分频器值为71,意味着实际的预分频器值为72。假设APB1时钟频率为72MHz,则预分频后的频率为1MHz。
    • TIM_RepetitionCounter: 设置重复计数器为0,不使用重复计数功能。
  5. 配置TIM3输入捕获通道:

    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;
    TIM_PWMIConfig(TIM3, &TIM_ICInitStructure);
    

    这里配置了TIM3的输入捕获通道1 (CH1):

    • TIM_Channel_1: 选择通道1。
    • TIM_ICFilter: 设置滤波器为16个采样点。
    • TIM_ICPolarity: 设置触发极性为上升沿。
    • TIM_ICPrescaler: 设置输入捕获分频器为1,即不分频。
    • TIM_ICSelection: 选择直接TI模式。
    • TIM_PWMIConfig:传入其中一个通道,将另外一个通道配置为该通道的相反模式。
  6. 选择输入触发源:

    TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1);
    TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);
    

    这两行代码配置了TIM3的输入触发源为TI1FP1,并选择了重置模式作为从模式。这意味着每当捕获到TI1FP1的上升沿时,定时器将被重置。

  7. 使能TIM3:

    TIM_Cmd(TIM3, ENABLE);
    

    最后,使能TIM3定时器。

测量频率和占空比的函数

  1. 测量频率:

    uint32_t IC_GetFreq(void)
    {return 1000000 / (TIM_GetCapture1(TIM3) + 1);
    }
    

    这个函数通过读取TIM3的捕获1寄存器的值来计算输入信号的频率。

  2. 测量占空比:

    uint32_t IC_GetDuty(void)
    {return (TIM_GetCapture2(TIM3) + 1) * 100 / (TIM_GetCapture1(TIM3) + 1);
    }
    

    这个函数通过读取TIM3的捕获2寄存器的值来计算输入信号的占空比。

完整代码:

#include "stm32f10x.h"                  // Device headervoid IC_Init(void)
{RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);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;		//ARRTIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1;		//PSCTIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);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;TIM_PWMIConfig(TIM3, &TIM_ICInitStructure);TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1);TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);TIM_Cmd(TIM3, ENABLE);
}uint32_t IC_GetFreq(void)
{return 1000000 / (TIM_GetCapture1(TIM3) + 1);
}uint32_t IC_GetDuty(void)
{return (TIM_GetCapture2(TIM3) + 1) * 100 / (TIM_GetCapture1(TIM3) + 1);
}

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

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

相关文章

多区域DNS以及主从DNS的搭建

搭建多域dns服务器: 搭建DNS多区域功能(Multi-Zone DNS)主要是为了满足复杂网络环境下的多样化需求,提高DNS服务的灵活性、可扩展性和可靠性。 适应不同网络环境: 在大型组织、跨国公司或跨地域服务中,网…

大模型学习笔记 - LLM指令微调

LLM 指令微调 LLM 指令微调 0. 概览1. 指令数据的构建 1.1 基于现有NLP任务数据集构建1.2 基于日常对话数据构建1.3 基于合成数据构建1.4 指令数据构建的提升方法 2. 指令微调的策略 2.1 优化设置2.2 数据组织策略 3. 参数高效的模型微调 3.1 低秩适配微调方法3.2 其他高效微调…

使用flutter做圆形进度条 (桌面端)

前言 最近收到一个需求,需要使用flutter 来做一个圆形进度条,这可难倒我了,毕竟我是做前端的,flutter 之前接触的也少,但没办法,既然需求有了,也得硬着头皮上了,先来看看做的效果。…

Angular 18.2.0 的新功能增强和创新

一.Angular 增强功能 Angular 是一个以支持开发强大的 Web 应用程序而闻名的平台,最近发布了 18.2.0 版本。此更新带来了许多新功能和改进,进一步增强了其功能和开发人员体验。在本文中,我们将深入探讨 Angular 18.2.0 为开发人员社区提供的…

C语言-TCP通信创建流程

TCP通信创建流程 1. 客户端创建TCP连接 在整个流程中, 主要涉及以下⼏个接⼝socket() : 创建套接字, 使⽤的套接字类型为流式套接字connect() : 连接服务器send() : 数据发送recv() : 数据接收创建套接字 首先,我们需要创建套接字,套接字是通信的基础…

构建查询洞察 UI

本文字数:2631;估计阅读时间:7 分钟 作者:Bucky Schwarz 本文在公众号【ClickHouseInc】首发 我们最近发布了 Query Insights 的初步实现,为 ClickHouse Cloud 用户提供了一种便捷的方法来查看和解释查询日志。该功能对…

MySQL索引、事务(数据库管理与高可用)

一、索引的概念 索引:排序的列表,对数据进行快速的查询; 针对不同的产品需求,或者不同的数据库结构,会创建不同的索引; 1:普通索引(默认索引) 2:唯一索引…

ubuntu开启 远程登录 允许root远程登录

如果没有22端口服务 sudo apt update sudo apt install openssh-server sudo ufw allow.ssh sudo passwd root 修改配置文件 sudo vim /etc/ssh/sshd_config Port 22 修改为 Port 22 #PermitRootLogin prohibit-password 修改为 PermitRootLogin yes service ssh restart …

推荐一个酷炫高逼格的服务器探针的监控工具,免费开源(附源码)

背景 作为一名攻城狮,面对各种服务器内存飙高、CPU猛增、磁盘打满等等服务器问题,可谓是伤透了我们的心。 不仅要开发,还要处理这些问题,大把的时间浪费了,这时候一个好的全面的监控工具尤为重要了。 所以&#xff…

C++基础知识:函数重载相关注意事项:1.引用作为重载条件,2.2.函数重载遇见函数默认参数。

1.引用作为重载条件 #include<iostream>using namespace std;//1.引用作为重载的条件 //int 和 const int 类型不同&#xff0c;所以可以作用重载条件 void fn(int &a) //int &a10;不合法 //10放在了常量区&#xff0c;而引用要么在栈区&#xff0c;要么在堆区{…

Unity打包设置

1.Resolution and Presentation (分辨率和显示) Fullscreen Window (全屏窗口): 应用程序将以全屏窗口模式运行&#xff0c;但不会独占屏幕。适用于想要全屏显示但仍需访问其他窗口的情况。 Resizable Window (可调整大小的窗口): 允许用户调整应用程序窗口的大小。适用于窗口…

保险丝(常见元器件及电路基础知识)

分类&#xff1a;简单分为熔断式和非熔断式 电压&#xff1a;保险丝的额定电压是指它的公称额定电压, 通常就是保险丝断开后能够承受的最大电压值保险丝通电时两端所承受的电压大大小于其额定电压&#xff0c;因此额定电压基本上无关紧要。 电流&#xff1a; PFC为功率因数矫…

昇思25天学习打卡营第三十四天|Jack578

昇思25天学习打卡营第三十四天|Jack578 一、数据集Dataset&#xff08;一&#xff09;数据集加载&#xff08;二&#xff09;数据集迭代&#xff08;三&#xff09;数据集常用操作 一、数据集Dataset 数据是深度学习的基础&#xff0c;MindSpore提供基于Pipeline的数据引擎&am…

项目管理中的常用工件(二):可视化工件

项目管理中的常用工件&#xff08;二&#xff09;&#xff1a;可视化工件 亲和图&#xff08;affinity diagram&#xff09;因果图&#xff08;cause-and-effect diagram&#xff09;直方图&#xff08;histogram&#xff09;流程图&#xff08;flowchart&#xff09;散点图&am…

[练习]如何使用递归算法?

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f525;个人专栏&#xff1a;算法(Java)&#x1f4d5;格言&#xff1a;吾愚多不敏&#xff0c;而愿加学欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 1. 递归概述 2.汉诺塔问题 题目描述​编辑 题解 代码实现 3…

LeetCode Hot100 生成特殊数字的最少操作

给你一个下标从 0 开始的字符串 num &#xff0c;表示一个非负整数。 在一次操作中&#xff0c;您可以选择 num 的任意一位数字并将其删除。请注意&#xff0c;如果你删除 num 中的所有数字&#xff0c;则 num 变为 0。 返回最少需要多少次操作可以使 num 变成特殊数字。 如…

mac M1安装Roop教程及所遇到的问题

1.安装miniconda&#xff0c;下载地址&#xff1a; 按 Python 版本划分的最新 Miniconda 安装程序链接&#xff1a;https://docs.anaconda.com/miniconda/miniconda-other-installer-links/ 下载后直接默认安装即可。 我用的是&#xff1a;Python3.10对应的Miniconda 2.下载…

图生视频——DemoFusion

DemoFusion 是一个先进的演示文稿和视频制作工具&#xff0c;旨在通过利用人工智能和机器学习技术简化和增强演示内容的创建和编辑过程。 1. DemoFusion 介绍 DemoFusion结合了多种前沿的技术&#xff0c;为用户提供了一个功能强大、易于使用的平台&#xff0c;用于创建引人注…

css: 让下方元素遮住上方元素底部的 box-shadow

背景: 表格底部有 shadow , UI 让去掉, 给了项目中其他正常表格示例 定位: 对比代码发现, 其他表格底部的分页 div 遮住了表格底部的 shadow , 对比两处代码, 找出分页 div 样式不同之处, 遮住 shadow 的分页 div 使用了 position: relative 解决: 给下方元素加上 positio…

7月26日JavaSE学习笔记

反射 Java是面向对象的&#xff0c;有对象必须先有类&#xff0c; 有static修饰类的属性和方法&#xff1b;在Java中存储了类的内容&#xff0c;这个内容也应该是一个对象&#xff1b;Java中每一个用到的类都会加载一块内存&#xff0c;这每一块内存都是一个对象&#xff1b;这…