STM32(八):定时器——输入捕获实验

news2024/11/15 22:53:03

目录

输入捕获模式测频率:

结构图:

步骤: 

部分函数详解:

源码:

PWMI模式测频率占空比:

结构图:

​编辑

举例说明

源码: 


输入捕获模式测频率:

结构图:

    

步骤: 

        1. RCC开启时钟,把GPIO和TIM的时钟打开。

         2. GPIO初始化,把GPIO设置为输入模式,一般选择上拉输入或者浮空输入。

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

        4. 配置输入捕获单元,包括滤波器、极性、直连通道/交叉通道、分频器(结构体配置)。

        5. 选择从模式的触发源 TI1FP1。

        6. 选择之后执行的操作Reset。

        7. 开启定时器,TIM_CMD。

部分函数详解:

void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct); 配置输入捕获电路
void TIM_PWMIConfig(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct);可以快速配置两个通道。

void TIM_ICStructInit(TIM_ICInitTypeDef* TIM_ICInitStruct);可以给输入结构体赋一个初始值

void TIM_SelectInputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);选择输入触发源TRGI,调用这个函数可以设置从模式的触发源。

void TIM_SelectOutputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_TRGOSource);选择输出触发源TRGO,调用这个函数可以设置主模式的触发源

void TIM_SelectSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_SlaveMode);选择从模式

void TIM_SetIC1Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC);
void TIM_SetIC2Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC);
void TIM_SetIC3Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC);
void TIM_SetIC4Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC);单独配置通道1、2、3、4的分频器;

输出比较模式下,CCR是写的,要用SetCompare写入;输入捕获模式下,CCR是只读的,要用GetCapure读出;

uint16_t TIM_GetCapture1(TIM_TypeDef* TIMx);
uint16_t TIM_GetCapture2(TIM_TypeDef* TIMx);
uint16_t TIM_GetCapture3(TIM_TypeDef* TIMx);
uint16_t TIM_GetCapture4(TIM_TypeDef* TIMx);

源码:

#include "stm32f10x.h"                  // Device header

void IC_Init(void)
{
	//第一步开启时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	
	//第二步配置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);
	
	//第三步配置时基单元
	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=36-1;//预分频器的值 计数标准频率
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0;//重复计数器的值(高级计数器才需要,目前不需要用给0即可)
	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);//时基单元配置完毕 更新事件和更新中断是同时发生的,
	
	//第四步配置输入捕获函数
	TIM_ICInitTypeDef TIM_ICInitStruct;
	TIM_ICInitStruct.TIM_Channel=TIM_Channel_1;//指定配置哪个通道
	TIM_ICInitStruct.TIM_ICFilter=0xF;
	TIM_ICInitStruct.TIM_ICPolarity=TIM_ICPolarity_Rising;//边沿检测极性选择,上升、下降沿触发
	TIM_ICInitStruct.TIM_ICPrescaler=TIM_ICPSC_DIV1;//分频器,每隔几次有效
	TIM_ICInitStruct.TIM_ICSelection=TIM_ICSelection_DirectTI;
	
	TIM_ICInit(TIM3,&TIM_ICInitStruct);
	
	//第五步 配置TRGI的触发源为TI1FP1
	TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1);
	
	//第六步,配置从模式为Reset
	TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Reset);
	
	//第七步,开启定时器
	TIM_Cmd(TIM3,ENABLE);//开启定时器;
	
}

uint32_t IC_GetFreq(void){
	
	return 2000000/TIM_GetCapture1(TIM3);

}

PWMI模式测频率占空比:

结构图:

看一下英文版本的TIM_ICSelection_IndirectTI的说明:

TIM Input 1, 2, 3 or 4 is selected to be connected to IC2, IC1, IC4 or IC3, respectively. 

设置通道2的交叉连接也就是TIM通道1输入和IC2信号连接,也就是说TIM_ICInit(TIM3,&TIM_ICInitStruct); 实际上是对ICx捕获电路进行的配置,而不是对TIM_CHx输入口进行的配置。

TIM_ICSelection_IndirectTI 这个参数是定时器输入捕获模式中的一个配置选项,用于指定输入捕获触发信号源通过复用映射连接到对应通道的输入捕获引脚的方式。具体来说,当选择TIM_ICSelection_IndirectTI时,输入捕获触发信号需要经过复用映射电路,然后再由复用映射电路将信号传递给定时器的输入捕获电路。

举例说明

假设有一个STM32微控制器,它拥有多个定时器输入捕获通道(如IC1、IC2、IC3、IC4)和多个定时器输入通道(如TI1、TI2、TI3、TI4)。这些通道之间通常可以通过直接连接或间接(复用映射)方式相连。

  1. 直接连接(TIM_ICSelection_DirectTI):
    • 假设我们选择TIM_ICSelection_DirectTI,那么输入捕获通道与输入通道之间的连接将是直接的,即IC1连接TI1,IC2连接TI2,以此类推。
    • 例如,如果TIMx_CH1(定时器x的通道1)的输入信号需要被IC1捕获,那么信号将直接通过TI1进入IC1,无需经过任何复用映射电路。
  2. 间接连接(TIM_ICSelection_IndirectTI):
    • 当选择TIM_ICSelection_IndirectTI时,输入捕获通道与输入通道之间的连接将不再是直接的,而是需要通过复用映射电路进行连接。
    • 例如,如果TIMx_CH1的输入信号需要被IC2捕获(而不是通常的IC1),那么信号首先会进入TI1,然后通过复用映射电路被重定向到IC2。这种连接方式允许将不同的输入通道信号映射到非对应的输入捕获通道上,从而增加了配置的灵活性。

源码: 

#include "stm32f10x.h"                  // Device header

void IC_Init(void)
{
	//第一步开启时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	
	//第二步配置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);
	
	//第三步配置时基单元
	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;//预分频器的值 计数标准频率
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0;//重复计数器的值(高级计数器才需要,目前不需要用给0即可)
	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);//时基单元配置完毕 更新事件和更新中断是同时发生的,
	
	//第四步配置输入捕获函数
	TIM_ICInitTypeDef TIM_ICInitStruct;
	TIM_ICInitStruct.TIM_Channel=TIM_Channel_1;//指定配置哪个通道
	TIM_ICInitStruct.TIM_ICFilter=0xF;
	TIM_ICInitStruct.TIM_ICPolarity=TIM_ICPolarity_Rising;//边沿检测极性选择,上升、下降沿触发
	TIM_ICInitStruct.TIM_ICPrescaler=TIM_ICPSC_DIV1;//分频器,每隔几次有效
	TIM_ICInitStruct.TIM_ICSelection=TIM_ICSelection_DirectTI;
	
	TIM_ICInit(TIM3,&TIM_ICInitStruct);
	
	TIM_ICInitStruct.TIM_Channel=TIM_Channel_2;//指定配置哪个通道
	TIM_ICInitStruct.TIM_ICFilter=0xF;
	TIM_ICInitStruct.TIM_ICPolarity=TIM_ICPolarity_Falling;//边沿检测极性选择,下降沿触发
	TIM_ICInitStruct.TIM_ICPrescaler=TIM_ICPSC_DIV1;//分频器,每隔几次有效
	TIM_ICInitStruct.TIM_ICSelection=TIM_ICSelection_IndirectTI;
	
	TIM_ICInit(TIM3,&TIM_ICInitStruct);
	
	//TIM_PWMIConfig(TIM3,&TIM_ICInitStruct);
	
	//第五步 配置TRGI的触发源为TI1FP1
	TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1);
	
	//第六步,配置从模式为Reset
	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.coloradmin.cn/o/2092142.html

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

相关文章

using showdown js with openAi streaming response

题意:"使用 Showdown.js 处理 OpenAI 流式响应" 问题背景: I tried using showdownjs to translate streamed markdown from OpenAi to HTML "我尝试使用 Showdown.js 将来自 OpenAI 的流式 Markdown 转换为 HTML" I changed the …

机器学习第五十四周周报 MAGNA

文章目录 week54 MAGNA摘要Abstract一、文献阅读1. 题目2. Abstract3. 文献解读3.1 Introduce3.2 创新点 4. MAGNA4.1 基础4.2 多跳注意力扩散机制4.3 网络架构4.4 图注意力扩散机制的分析 5. 实验分析5.1 节点分类5.2 知识图谱 6.结论 二、若依系统1. 权限管理2. 数据字典3. 其…

【Linux修行路】进程通信——共享内存

目录 ⛳️推荐 一、直接原理 1.1 共享内存的的申请 1.2 共享内存的释放 二、代码演示 2.1 shmget 2.1.1 详谈key——ftok 2.2 创建共享内存样例代码 2.3 获取共享内存——进一步封装 2.4 共享内存挂接——shmat 2.5 共享内存去关联——shmdt 2.6 释放共享内存——s…

gitee版本控制

前置要求: 安装Git git下载地址:https://git-scm.com/download/win 注册gitee gitee官网:Gitee - 基于 Git 的代码托管和研发协作平台 创建普通项目 目录 git推送远程仓库基本操作 克隆仓库到本地 项目上传 版本管理 分支管理版本…

紧急 浮毛正在挑战免疫系统?推荐榜TOP3浮毛空气净化器使用体验

作为一名多猫家庭的铲屎官,出门路人必知道我养猫,不是把铲屎官三个字大大的打在我脑门上了。而是衣服、裤子上无处不在的猫毛,以前我就靠着人力与各种工具与猫毛斗争,但效果总是差强人意。直到有一天,我因忽视浮毛而患…

Linux 用户缓冲区

1. 文件描述符的分配规则 我们知道Linux进程默认情况下会有3个缺省打开的文件描述符,分别是标准输入stdin--0, 标准输出stdout--1, 标准错误stderr--2。0,1,2对应的物理设备一般是:键盘,显示器,显示器.接下…

字符串原始字面量

简介:C11中添加定义了原始字符串的字面量,定义方式为:R"xxx(原始字符串)xxx",其中()两边的字符串可以省略。原始字面量R可以直接表示字符串的实际含义,而不需要额外对字符串做转译或链接等操作 …

ddpm和ddim小记

前面分析了DDPM和DDIM,但是仍然感觉对其理解不是和透彻,最近又学习了下,简单记录一下进一步的理解。为了方便理解,这里直接以两个像素的灰度图像为例。前面讲过无论是DDPM还是DDIM,他们的训练过程都是一样的&#xff0…

一套采用JAVA语言开发的数字化产科管理平台源码,自主知识产权,三甲综合医院应用案例,系统稳定运行,全套源码交付。

一套采用JAVA语言开发的一套数字化产科管理平台源码,自主知识产权,三甲综合医院应用案例,系统稳定运行。全套源码交付。 数字化产科管理平台源码技术栈: 技术架构:前后端分离 开发语言:Java 开发工具…

深度学习基础--梯度下降与初始化

在神经网络的背景下,它们用于寻找能够最小化损失函数的参数,使模型能够根据输入准确预测训练数据的输出。基本方法是随机选择一组初始参数,然后逐步进行微小调整,平均而言这些调整会降低损失。每一次的调整都是基于当前参数位置对…

ERROR: Cannot uninstall numpy 1.24.2, RECORD file not found.

目录 1.问题描述:2.解决方法:2.1流程2.2结果 小结: 1.问题描述: 卸载 numpy 时报错: ERROR: Cannot uninstall numpy 1.24.2, RECORD file not found. You might be able to recover from this via: pip install --f…

HTB-sequal(mysql)

前言 各位师傅大家好,我是qmx_07,今天给大家讲解sequal这台靶机 渗透过程 信息搜集 服务器开放了3306mysql端口思路:mysql爆破-sC参数会执行 相关的默认脚本 连接mysql数据库 通过空密码连接道mysql数据库flag:7b4bec00d1a39…

【GD32】从零开始学GD32单片机 | USB通用串行总线接口+HID键盘例程(GD32F470ZGT6)

1. 简介 USB,全称通用串行总线,相信大家都非常熟悉了,日常生活只要用到手机电脑都离不开这个接口,像鼠标键盘U盘都需要使用这个接口进行数据传输,下面简单介绍一下。 1.1 版本标准 USB的标准总体可以分为低速、全速和…

04:布局规划

1.切换到丝印层 2.用2D线对模块区域划分

keil5烧录后不自动复位和Flash Download failed - “Cotex-M3“报错解决

目录 项目场景: 复位问题描述 复位原因分析: 复位解决方案: 下载错误问题描述 下载错误原因分析: 下载错误解决方案: 总结 项目场景: keil5编译stm32例程在烧录时候遇到的一些问题 复位问题描述 1. 使…

全面解读LSC局域网屏幕监控软件:功能、优势与应用场景一网打尽!

在信息化高速发展的今天,企业管理的效率和精准度成为决定竞争力的关键因素。 LSC局域网屏幕监控软件(LAN Screen Capture),作为安企神推出的一款专为现代企业量身打造的超级局域网监控管理软件,以其强大的功能和灵活的…

MAC环境导出项目的目录结构

一、安装Homebrew包管理工具 /bin/bash -c "$(curl -fsSL https://gitee.com/ineo6/homebrew-install/raw/master/install.sh)" 官网网址:https://brew.idayer.com/ 二、用brew包管理工具安装tree brew install tree 三、打开终端,导出项目…

怎么用AI做视频总结?

利用AI工具批量生成影视短剧推广https://docs.qq.com/doc/DYnl6d0FLdHp0V2ll 搞个插件就可以了。 我只能说AI的终极目的就是为了视频服务的,语音(配音)、视频脚本(文案)、绘图(画面)、设计&…

数据结构:单链表逆置的相关问题

1.思路:这里主要是用到头插法的思想进行单链表的一个逆置 2.知识点回顾: (1)头插法 [1]什么叫头插法:新增节点在头节点后面(下图为单链表结构) [2&#xf…

Leetcode 257-二叉树的所有路径

给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。 叶子节点 是指没有子节点的节点。 题解 递归回溯 遇到叶节点返回 每层的做法,list加上当前节点的string值 本题解将res作为全局变量,作为局部变量写法也…