TIM输入捕获-STM32

news2024/10/5 19:17:14

TIM输入捕获-STM32

IC(Input Capture) 输入捕获
输入捕获模式下,当通道输入引脚出现指定电平跳变时,当前CNT的值将被锁存到CCR中,可用于测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参数
每个高级定时器和通用定时器都拥有4个输入捕获通道可配置为PWMI模式,同时测量频率和占空比可配合主从触发模式,实现硬件全自动测量
在这里插入图片描述
输出比较和输入捕获的区别:
输出比较,引脚是输出端口;输入捕获,引脚是输入端口。
输出比较,是根据CNT和CCR的大小关系来执行输出动作;输入捕获,是接收到输入信号,执行CNT锁存到CCR的动作。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
一般我们可以根据分辨率的要求,先确定好ARR;比如分辨率,1%就足够了,那ARR给100-1,这样PSC决定频率,CCR决定占空比。
在这里插入图片描述
第一步,RCC开启时钟,把GPIO和TIM的时钟打开
第二步,GPIO初始化,把GPIO配置成输入模式,一般选择上拉输入或者浮空输入模式
第三步,配置时基单元,让CNT计数器在内部时钟的驱动下自增运行
第四步,配置输入捕获单元。包括滤波器、极性、直连通道还是交又通道、分频器这些参数;用一个结构体就可以统一进行配置了
第五步,选择从模式的触发源。触发源选择为TI1FP1,这里调用一个库函数,给一个参数就行了
第六步,选择触发之后执行的操作。执行Reset操作,这里也是调用一个库函数就行了
调用TIM_Cmd函数,开启定时器。

当我们需要读取最新一个周期的频率时,直接读取CCR寄存器,然后按照fc/N,计算一下就行了。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
测试频率

#include "stm32f10x.h"                  // Device header

void IC_Init(void)
{
	//第一步开启时钟,初始化RCC,选择TIM2
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);	
	//设置输出PWM的GPIO端口
		//使能GPIOA的时钟 
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);	
	//GPIOA模式初始化
	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);
		
	//第二步选择时基单元的时钟,选择内部时钟,选择TIM2
	TIM_InternalClockConfig(TIM3);
	
	//第三步配置时基单元
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;//时钟分频系数 1分频
	TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//计数的模式 向上计数
	//频率为1KHz,占空比为50%的PWM波形
	//计数器溢出频率:CK CNT_OV = CKCNT /(ARR + 1)= CK PSC /(PSC + 1)/(ARR +1)
	//配置定时为1s,则CK CNT_OV=1;CKCNT=72MHz=72000000;
	TIM_TimeBaseInitStruct.TIM_Period = 65536 - 1;//周期,ARR自动重装器的值 范围0~65536 设置为最大值,防止溢出
	TIM_TimeBaseInitStruct.TIM_Prescaler = 72 - 1;//PSC预分频器的值 范围0~65536 最后1Mhz
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0; //重复计数器的值 高级计数器才有
	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);
	
	//第四步,配置输入捕获单元。包括滤波器、极性、直连通道还是交又通道、分频器这些参数
	TIM_ICInitTypeDef TIM_ICInitStruct;
	TIM_ICInitStruct.TIM_Channel = TIM_Channel_1;//选择通道 选择TIM3的通道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);
	
	//第五步,选择从模式的触发源。触发源选择为TI1FP1,这里调用一个库函数,给一个参数就行了
	TIM_SelectInputTrigger(TIM3,TIM_TS_TI1FP1);
	
	//第六步,选择触发之后执行的操作。执行Reset操作,这里也是调用一个库函数就行了
	TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Reset);
	
	//调用TIM_Cmd函数,开启定时器
	TIM_Cmd(TIM3,ENABLE);
}

//函数返回的是最新"个周期的频率值,单位是Hz
//Freq = CK_PSC / (PSC + 1) / (ARR + 1) 
//CK_PSC= 72MHz    PSC + 1 =100
uint32_t IC_GetFreq(void)
{
	return 10000000/(TIM_GetCapture1(TIM3)+1);
}

在这里插入图片描述

#include "stm32f10x.h"                  // Device header

void IC_Init(void)
{
	//第一步开启时钟,初始化RCC,选择TIM2
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);	
	//设置输出PWM的GPIO端口
		//使能GPIOA的时钟 
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);	
	//GPIOA模式初始化
	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);
		
	//第二步选择时基单元的时钟,选择内部时钟,选择TIM2
	TIM_InternalClockConfig(TIM3);
	
	//第三步配置时基单元
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;//时钟分频系数 1分频
	TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//计数的模式 向上计数
	//频率为1KHz,占空比为50%的PWM波形
	//计数器溢出频率:CK CNT_OV = CKCNT /(ARR + 1)= CK PSC /(PSC + 1)/(ARR +1)
	//配置定时为1s,则CK CNT_OV=1;CKCNT=72MHz=72000000;
	TIM_TimeBaseInitStruct.TIM_Period = 65536 - 1;//周期,ARR自动重装器的值 范围0~65536 设置为最大值,防止溢出
	TIM_TimeBaseInitStruct.TIM_Prescaler = 72 - 1;//PSC预分频器的值 范围0~65536 最后1Mhz
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0; //重复计数器的值 高级计数器才有
	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);
	
	//第四步,配置输入捕获单元。包括滤波器、极性、直连通道还是交又通道、分频器这些参数
	TIM_ICInitTypeDef TIM_ICInitStruct;
	
	TIM_ICInitStruct.TIM_Channel = TIM_Channel_1;//选择通道 选择TIM3的通道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_PWMIConfig(TIM3,&TIM_ICInitStruct);//在函数里,会自动把剩下的一个通道初始化成相反的配置
//	TIM_ICInitStruct.TIM_Channel = TIM_Channel_2;//选择通道 选择TIM3的通道1
//	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);
	
	//第五步,选择从模式的触发源。触发源选择为TI1FP1,这里调用一个库函数,给一个参数就行了
	TIM_SelectInputTrigger(TIM3,TIM_TS_TI1FP1);
	
	//第六步,选择触发之后执行的操作。执行Reset操作,这里也是调用一个库函数就行了
	TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Reset);
	
	//调用TIM_Cmd函数,开启定时器
	TIM_Cmd(TIM3,ENABLE);
}

//函数返回的是最新"个周期的频率值,单位是Hz
//Freq = CK_PSC / (PSC + 1) / (ARR + 1) 
//CK_PSC= 72MHz    PSC + 1 =100
uint32_t IC_GetFreq(void)
{
	return 10000000/(TIM_GetCapture1(TIM3)+1);
}

//获取占空比
//Duty = CCR / (ARR + 1)
uint32_t IC_GetDuty(void)
{
	//高电平的计数值存在CCR2里;整个周期的计数值存在CCR1里;用CCR2/CCR1,就能得到占空比了
	return (TIM_GetCapture2(TIM3)+1)*100/(TIM_GetCapture1(TIM3)+1);//范围是0%~100%
}

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

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

相关文章

Unity 自建package包流程

目录 1.在工程Asset 同级目录下创建文件夹 名字随便起 2.在文件夹中添加package.json 文件 3.在unity中选中PackageManager 4.打开vs 新建一个项目 5.开始编写代码 6.修改dll路径 7.打个dll 1.在工程Asset 同级目录下创建文件夹 名字随便起 eg: 2.在文件夹中添加package…

《MySQL 必知必会》课程笔记(三)

怎么创建和修改数据表? 创建和修改数据表,是数据存储过程中的重要⼀环。我们不仅需要把表创建出来,还需要正确地设置限定条件,这样才能确保数据的一致性和完整性。同时,表中的数据会随着业务需求的变化而变化&#xf…

docker ngxin

安装docker环境 官方安装 官方安装 Install Docker Engine on CentOS | Docker Documentation sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repoyum install docker-ce docker-ce-cli container…

在滴滴和字节跳动划水4年,过于真实了...

先简单交代一下吧,沅哥是某不知名211的本硕,18年毕业加入滴滴,之后跳槽到了头条,一直从事测试开发相关的工作。之前没有实习经历,算是四年半的工作经验吧。 这四年半之间他完成了一次晋升,换了一家公司&am…

你有了一套采购系统,就数字化转型了吗?

我觉得完全没有达到,我们觉得要把这个系统要应用起来,用得好才能够说明你这个系统真正地做了数字化转型的。 甄云作为采购数字化服务商,在服务客户时,深有感触。 流程断点,但没有充分采购数字化价值 我这边讲一个故事…

Python系列之Linux 安装

目录 一、认识Python 1.1 为什么要学python ? 1.2 Python优点 1.3 Python应用场景 二、源码安装 三、RPM安装 一、认识Python 1.1 为什么要学python ? python的哲学: 明确,优雅,简单 python更强大,执行效率比shell高。 python可以跨平台,可移…

计算机网络的三种交换方式

1.计算机网络的三种交换方式 声明:该学习笔记来自湖科大教书匠,笔记仅做学习参考 个人理解:交换(Switch)可以理解为切换开关,将交换机中某两个开关打开,使得连接此两个开关的双方建立通信通道 如…

VolSDF

Volume Rendering of Neural Implicit Surfaces(VolSDF):神经隐式曲面的体渲染 摘要:一个神经隐式表面体积渲染框架,将体积密度建模为几何形状的函数来实现表面重建。定义的体积密度函数作为拉普拉斯的累积分布函数&am…

git 解决 “fatal: Could not read from remote repository.“

现象 在使用Git将本地仓库推送到远程仓库的时候,发生了如下错误:“fatal: Could not read from remote repository.” 原因 出现这错误一般是以下两种原因: 客户端与服务端未生成 ssh key客户端与服务端的ssh key不匹配 为解决以上问题&a…

斯坦福2023【FrugalGPT】减少大模型的商业化应用成本

文章目录 主要解决问题采用什么方法Prompt adaptationLLM approximationLLM cascade 实验结论讨论与展望 FrugalGPT: How to Use Large Language Models While Reducing Cost and Improving Performance 主要解决问题 这篇文章主要是要解决如何降低调用大语言模型的成本(Chat…

NMOS双向转换电路实测以及上升沿尖峰处理

NMOS双向转换电路实测以及上升沿尖峰处理 NMOS双向转换电路 &#x1f527;采用的是5V供电的STC8H单片机输出PWM波形&#xff0c;经过上面的电平转换电路测量低压端的波形。 ✨在做3.3V <>5V 电平转换电路方案验证时&#xff0c;输入5V PWM波形和输出波形的波形上升沿有尖…

[Java基础练习-002]综合应用(基础进阶),如果你会做,那说明你java入门了,

本篇的练习是一个综合性的练习&#xff0c;结合了各个知识点&#xff0c;比如选择结构、循环结构、数组等java基础知识。综合性运用比较强。 目录 1、进阶练习一、学习网站&#xff08;主要考察选择结构、输入语句&#xff09; 2、进阶练习二&#xff08;选择结构、循环&#…

SELinux详解

文章目录 SELinux详解什么是SELinux当初设计的目标&#xff1a;避免资源的误用传统的文件权限与账号主要的关系&#xff1a;自主访问控制(DOC)以策略规则制定特定进程读取特定文件&#xff1a;强制访问控制(MAC) SELinux的运行模式安全上下文进程与文件SELinux类型字段的相关性…

QQ邮箱 网易邮箱及企业邮箱开通SMTP/POP3及设置授权码

一 、什么是 POP3/IMAP/SMTP 服务 POP3 &#xff08;Post Office Protocol - Version 3&#xff09;协议用于支持使用电子邮件客户端获取并删除在服务器上的电子邮件。 IMAP &#xff08;Internet Message Access Protocol&#xff09;协议用于支持使用电子邮件客户端交互式存…

Windows Nvm+Node.js安装

前言 在windows系统下安装的是nvm-windows&#xff0c;nvm只支持安装在在Linux和Mac系统下。之前在Linux上安装过&#xff0c;最近在Windows上安装&#xff0c;特记录一下。 下载 下载地址&#xff1a;传送门 安装Nvm 双击exe文件&#xff0c;选定安装路径&#xff0c;下…

最新|事件相机SLAM综述

Arxiv链接:https://arxiv.org/abs/2304.09793 Github 链接:https://github.com/kun150kun/ESLAM-survey 视觉SLAM (vSLAM)是指移动机器人通过相机感知外部世界并估计机器人的位姿和重建周围环境的三维地图。vSLAM在各种应用中扮演着不可或缺的角色,包括自动驾驶,机器人导航…

【华为云服务器使用ftp21端口进行连接】

[使用ftp21端口连接华为云linux服务器] 华为云服务器使用ftp21端口进行连接 说明: 我们在操作linux服务器时, 经常想可视化的操作文件, 单使用命令行操作不友好。本文旨在使用ftp工具可视化的连接华为云服务器 1.安装vsfftpd 1.1 检查vsfftpd是否已安装 执行以下命令可以看…

网安笔记04 公钥密码体制

公钥密码体制 公钥密码体制的基本概念 保密性&#xff1a;确保信息只被授权的人访问 认证&#xff1a;确认某实体/数据源的真实性 保密性需要考虑到 不可否认性数据完整性 保密系统要考虑 达到实际上不可破 接获密文、某些明文密文对&#xff0c;决定密钥或者明文是不可…

没计算机基础,就是评职称用的,软考中级哪个好考啊?

那必须把系统集成项目管理工程师安排上&#xff01; 题目也不难&#xff0c;主要弄清楚47个过程的输入输出&#xff0c;还有工具的使用&#xff0c;几乎很多题都是按照这逻辑来的。 建议可以去网上、刷题APP上&#xff0c;多薅点资料和真题&#xff0c;集成是热门科目&#x…

Centos7.6华为云服务器安装FineBI

一、首先申请一个云端服务器 配置可根据自己需求申请,建议内存在16G以上 CPU 4核 内存 8GiB 系统盘 40GiB 带宽 1Mbit/s 二、在FineBI官网上查看安装方法,截图如下 下载后,直接根据上述步骤安装即可,一般不需要添加其余软件 在安装中遇到问题有以下几点 1.解压后,文件夹名…