【STM32】通用定时器TIM(输入捕获)

news2024/11/15 12:05:17

本篇博客重点在于标准库函数的理解与使用,搭建一个框架便于快速开发

目录

前言 

输入捕获简介

输入捕获配置

初始化IO口

输入捕获初始化

选择触发源及从模式

测量频率方法 

输入捕获代码 

IC.h

IC.c

输入捕获测占空比


前言 

建议先阅读这篇博客,理解时基单元的配置

【STM32】通用定时器TIM(时钟源选择与更新中断)-CSDN博客

输入捕获简介

IC(Input Capture)输入捕获

输入捕获模式下,当通道输入引脚出现指定电平跳变时,当前CNT的值将被锁存到CCR中,可用于测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参数

STM32F10xxx通用定时器为TIM2TIM3TIM4TIM5,每个通用定时器和高级定时器都拥有4个输出比较通道和4个输入捕获通道

可配置为PWMI模式,同时测量频率和占空比

可配合主从触发模式,实现硬件全自动测量

输入捕获框图 

输入捕获配置

初始化IO口

GPIO的其它参数的理解可以阅读下方博客,这里不再赘述。

【STM32】GPIO和AFIO标准库使用框架_gpio afio-CSDN博客

查找引脚定义表,将通用定时器3的输入捕获通道1(PA6)配置为上拉输入,由GPIO输入至定时器捕获单元 

	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_ICInitTypeDef TIM_ICInitStructure;							//定义结构体变量
	TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;				//选择配置定时器通道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_ICInit(TIM3, &TIM_ICInitStructure);							//将结构体变量交给TIM_ICInit,配置TIM3的输入捕获通道

 参数TIM_ICFilter :

参数TIM_ICSelection

选择触发源及从模式

TI1FP1为触发源

TI1FP1全称为Timer Input 1 Filtered Input 1,捕获到设置的边沿,TI1FP1可触发定时器的CNT计数器清0。本篇博客将TI1FP1选择为上升沿捕获,捕获到上升沿将计数器清0.

	/*选择触发源及从模式*/
	TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1);					//触发源选择TI1FP1
	TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);					//从模式选择复位
																	//即TI1产生上升沿时,会触发CNT归零

触发源选择:

 从模式选择:

主模式本博客代码没有用到,这里只是顺便介绍一下 

主模式

定时器的TRGO(Trigger Output )信号至其他定时器和DAC/ADC

TIM_SelectOutputTrigger(TIM3,TIM_TRGOSource_Update); //选择TRGO触发源为计时器更新时间 

OutputTrigger:

标准库函数中有This paramter can be one of the following values,意思是不能配置多个信号外部外部

应用案例

ADC采样间隔问题+TRGO作为ADC的触发源头 - dadide - 博客园 (cnblogs.com)

测量频率方法 

测频法适合测量高频率,测周法适合测量低频率

在周期的数字信号中,一个指定边沿(上升沿或下降沿,本篇博客选上升沿)代表一个周期的开始,也表示上一个周期的结束

测频法是在固定的时间内,检测待测信号周期次数,频率=(固定的时间/待测信号周期次数)的倒数。

固定的时间/待测信号周期次数,其实就是固定时间内多少个待测信号周期,测量信号的第一个和最后一个待测信号周期可能不完整,会出现待测信号周期次数偏多或偏少的情况,需要需要较多的待测信号周期个数减小误差,较多的待测信号周期个数意味着待测信号频率高

测周法是在一个待测周期内,以固定的频率采样,频率=1/(固定的周期时间*计数次数)=固定的频率/计数次数

固定的频率的倒数其实就是固定的周期时间,测周法其实就是测待测信号的一个周期时间内能检测到固定周期多少次。在一个待测信号的周期时间内,固定周期的第一个和最后一个周期可能不完整,会出现固定周期次数偏多或偏少的情况,需要较多的固定周期个数减小误差减小误差。较多的固定周期个数意味着待测信号频率低。

本篇选择测周法 ,固定频率 = CK_PSC/(PSC + 1)=72MHz/72=1MHz,CNT计数器以这个固定频率计数。输入捕获单元捕获到指定边沿(本篇指定上升沿),CNT计数器的值会复制到捕获寄存器CCR1。

uint32_t IC_GetFreq(void)
{
	return 1000000 / (TIM_GetCapture1(TIM3) + 1);		//测周法得到频率fx = fc / N
}

输入捕获代码 

输入捕获测频率代码 

IC.h

#ifndef __IC_H
#define __IC_H

void IC_Init(void);
uint32_t IC_GetFreq(void);
//uint32_t IC_GetDuty(void);//测占空比解除注释

#endif

IC.c

#include "stm32f10x.h"                  // Device header

void 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;		//ARR,尽量要大,防止待测信号频率过大导致CNT计数器溢出
	TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1;		//PSC
	TIM_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_ICInit(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);		//测周法得到频率fx = fc / N,这里不执行+1的操作也可
}

频率测完了怎么测占空比呢?

输入捕获测占空比

测量占空比就需要获取一个PWM周期内高电平时间与一个周期时间比值,显然要在测频率的基础上再用一个输入捕获通道

在周期的数字信号中,一个指定边沿(上升沿或下降沿,本篇博客选上升沿)代表一个周期的开始也是上一个周期的结束,另一个指定边沿(本篇博客选下降沿)代表一个周期内的信号边沿变化。

占空比=高电平时间/一个待测信号周期时间=捕获下降沿的值/捕获上升沿的值

PWMI基本结构

PWMI框图 

TIM_PWMIConfig函数

实现PWMI模式,此函数会把另一个通道配置为边沿相反,不直连。该函数其实就是注释的代码的封装函数。

完整代码需在输入捕获测频率的基础上更改 

//放在测频率输入捕获初始化代码后
TIM_PWMIConfig(TIM3, &TIM_ICInitStructure);						//将结构体变量交给TIM_PWMIConfig,配置TIM3的输入捕获通道

/**
  * 函    数:获取输入捕获的占空比
  * 参    数:无
  * 返 回 值:捕获得到的占空比
  */
uint32_t IC_GetDuty(void)
{
	return (TIM_GetCapture2(TIM3) + 1) * 100 / (TIM_GetCapture1(TIM3) + 1);	//占空比Duty = CCR2 / CCR1 * 100,这里不执行+1的操作也可
}

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

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

相关文章

Open3D mesh 均值滤波

Open3D点云算法汇总及实战案例汇总的目录地址: Open3D点云算法与点云深度学习案例汇总(长期更新)-CSDN博客 一、概述 均值滤波(Mean Filtering)是一种基本的网格平滑技术,通过将每个顶点的位置替换为其邻域…

[ABC369C] Count Arithmetic Subarrays

首先看了下题意 大致题意就是让你在长度为的序列找出所有的等差数列。 -----------------------------------------------------------------------------------------我是分界线 我的思路了,就是先从2开始计算等差数列,从3开始判断,如果是…

C#从入门到精通(21)—Mutex互斥锁在多线程、多进程下的使用

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家!人工智能学习网站 前言: 大家好,我是上位机马工,硕士毕业4年年入40万,目前在一家自动化公司担任…

C语言调用子函数时入/出栈(保护/恢复现场)全过程分析:以Cortex-M3为例

0 参考资料&工具 Cortex M3权威指南(中文).pdf keil5(用于仿真查看寄存器、栈变化)1 C语言调用子函数时出入/出栈(保护/恢复现场)全过程分析 使用C语言调用子函数是如何保护/恢复现场的呢?本文以Cortex-M3为例&a…

Zynq之IIC使用示例

前言 明确设计思路,精准定位问题,对于我们后期理解迭代工程有很大的帮助。 这就是我们常说的40%设计,20%编写和剩下的40%时间进行调试优化。 今天为大家带来的是Zynq-PS端的IIC使用demo,通过驱动外设DS1337来强化对IIC的使用方…

【C++二分查找 贪心】1552. 两球之间的磁力

本文涉及的基础知识点 C二分查找 贪心:决策兼容性 LeetCode1552. 两球之间的磁力 在代号为 C-137 的地球上,Rick 发现如果他将两个球放在他新发明的篮子里,它们之间会形成特殊形式的磁力。Rick 有 n 个空的篮子,第 i 个篮子的位…

百日草花语探秘:天长地久的情感寄托与丰富内涵解析

百日草宛如一颗璀璨的明珠,散发着独特的魅力。它那鲜艳夺目的花朵,仿佛是大自然用最细腻的笔触勾勒而成,每一朵都蕴含着无尽的奥秘与情感。当我们漫步于花海之间,不经意间与百日草相遇,那绚烂的色彩和别致的形态定会让…

李沐动手学深度学习:树叶分类竞赛

视频地址:30 第二部分完结竞赛:图片分类【动手学深度学习v2】 竞赛地址:https://www.kaggle.com/competitions/classify-leaves !nvidia-smi # 查看 GPU 信息 # !lscpu # 查看 CPU 信息 # !free -h # 查看内存(RAM) 信息 # !p…

datax编译:解决datax不支持MongoDB 6.0.10的问题

1. 需求及问题 最近使用datax同步MongoDB中的数据到hive,使用了mongodbreader和hdfswriter插件。MongoDB的版本是6.0.10,而datax的默认编译安装包中mongodbreader插件不支持MongoDB 6.0.10。 DataX工具介绍数据同步工具之DataX-CSDN博客 官方地址 https://github.com/alib…

模型 U型思考法(深度思考)

系列文章 分享 模型,了解更多👉 模型_思维模型目录。探索本质,创新求解。 1 U型思考法的应用 1.1 小罐茶的品牌创新 背景: 小罐茶作为一家新兴的茶叶品牌,面临着传统茶叶市场的激烈竞争和消费者需求的多样化。为了在…

地震模板代码 - 第三部分

Seismic stencil codes - part 3 — ROCm Blogs (amd.com) 2024年8月12日,作者:Justin Chang 和 Ossian O’Reilly。 在前两篇博客文章中,我们开发了一个 HIP 内核,能够计算地震波传播中常用的高阶有限差分。经过优化后&#xf…

Redis KEY操作实战手册:从设计到维护的全面指南

​ 🌈 个人主页:danci_ 🔥 系列专栏:《设计模式》《MYSQL》 💪🏻 制定明确可量化的目标,坚持默默的做事。 ✨欢迎加入探索Redis的key的相关操作之旅✨ 👋 大家好!文本…

在 Ubuntu 环境下使用 VSCode 和 PlatformIO 下载程序到 Arduino Uno

安装 VSCode 访问 VSCode 官网 下载 .deb 包使用以下命令安装&#xff1a;sudo dpkg -i <下载的文件名>.deb sudo apt-get install -f安装 PlatformIO 扩展 在 VSCode 中&#xff0c;转到扩展市场&#xff08;CtrlShiftX&#xff09;搜索 “PlatformIO IDE”点击 “安装”…

刷题记录-HOT 100(一)40道

记录题解和思路。 一、哈希表解决问题 1、两数之和 思路&#xff1a; 创建哈希表&#xff1a; 初始化了一个空字典来存储已经访问过的数字及其对应的索引。 遍历数组&#xff1a; 逐一遍历数组中的每个元素。在遍历过程中&#xff0c;针对每个元素 num&#xff0c;计算出它…

手机FM LNA方案设计

一 概述 关于手机FM的使用&#xff0c;较为传统的则是在打开FM应用前先插入有线耳机才能使用FM应用。然而随着智能手机的进步以及有线耳机日益被无线蓝牙耳机所代替&#xff0c;内置FM LNA方案被应用的越来越多&#xff0c;无需插入有线耳机&#xff0c;复用例如GSM天线也能实…

跨语言障碍:全球语言翻译神器崛起

1.背景 工作中经常要查看纯英文文档和纯英文视频&#xff0c;尽管本人经历了1年多的英语培训&#xff0c;看英文资料依然非常吃力。 大模型出来后&#xff0c;KIMI能够帮助翻译纯英文的文档内容&#xff0c;但视频翻译还没有一个很好的工具。最近发现了一款通过大模型翻译文档…

yolov9目标检测pyside6可视化检测界面python源码-用于计数统计-摄像头可用

项目概述 此项目旨在利用YOLOv9&#xff08;You Only Look Once version 9&#xff09;这一先进的目标检测模型&#xff0c;实现实时视频流中的物体识别与计数。通过集成PySide6库&#xff0c;我们能够构建一个直观且易于使用的图形用户界面&#xff08;GUI&#xff09;&#…

基于SpringBoot+Vue+MySQL的社区维修平台

系统背景 系统管理也都将通过计算机进行整体智能化操作&#xff0c;对于社区维修平台所牵扯的管理及数据保存都是非常多的&#xff0c;例如住户管理、社区公告管理、维修工管理、维修订单管理、接单信息管理、订单信息管理、在线沟通管理、举报信息管理、留言板管理、系统管理等…

VR虚拟驾驶未来发展_vr自动驾驶汽车所带来的改变

在自动驾驶汽车的基础上&#xff0c;VR虚拟现实技术的应用也让自动驾驶汽车更加智能化&#xff0c;能够实现更高级的驾驶体验&#xff0c;今天这篇文章就和大家一起探讨一下 VR虚拟驾驶未来发展的趋势&#xff0c;以及虚拟现实自动驾驶汽车所带来的几个改变。 一、VR 虚拟驾驶未…

WebAssembly技术实践

文章目录 知识学习优点 开启本地临时服务器方式一、命令安装方式二、直接在vscode的插件 测试程序异常处理 最近在看WebAssembly相关的知识&#xff0c;在本地运行&#xff0c;记录下来&#xff0c;方便备查。 知识学习 WebAssembly是一种高性能二进制格式、用于在各种现代硬件…