TIM输入捕获---STM

一、简介

IC输入捕获

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

每个高级定时器和通用定时器都拥有4个输入捕获通道

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

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

二、工程代码

项目一:

程序现象:自己“测”自己;输入捕获模式测频率

配置流程:

        1.RCC开启时钟

        2.GPIO初始化,配置为输入模式

        3.配置时基单元

        4.配置输入捕获单元(捕获通道、捕获方式、输入捕获预分频器)

        5.选择从模式触发源

        6.触发之后进行的操作

        7.开始定时器

接线:一根杜邦线一端接在单片机的PA6,另一端接在PA0

 这个是输入捕获的代码,输出波形的代码在在我之前写的TIM输出比较的文章里面pwm_led.c里面;

pwm_ic.c

#include "stm32f10x.h"  // STM32F10x外设库头文件
#include "pwm_ic.h"     // PWM控制相关头文件
#include "delay.h"       // 延时函数头文件



// 按键初始化函数
void PWM_IC_Init(void)
{
    // 定义定时器基础结构体和输出比较结构体
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; 
    GPIO_InitTypeDef GPIO_InitStructure;  // GPIO初始化结构体
    TIM_ICInitTypeDef TIM_ICInitStruct;   // 定时器输入捕获初始化结构体
    
    // 使能TIM3和GPIOA的时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);  // 使能定时器TIM3时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  // 使能GPIOA时钟

    // 配置GPIOA的引脚6为定时器的输入引脚(PWM输入)
    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_6;           // 配置GPIOA的Pin6
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    // 配置引脚的速度为50MHz
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IPD;       // 配置为输入下拉模式
    GPIO_Init(GPIOA, &GPIO_InitStructure);               // 初始化GPIOA的Pin6引脚

    /* 配置时钟源 */
    TIM_InternalClockConfig(TIM3);  // 选择TIM3为内部时钟源,若不调用此函数,TIM默认也是内部时钟

	// 配置定时器基本参数
	TIM_TimeBaseStructure.TIM_Period = 65535 - 1;              // 自动重载值,定时器的计数周期为65535,即计数从0到65534,周期为65535个时钟周期
	TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1;              // 预分频器值,定时器时钟源被分频为72MHz / 72 = 1000000Hz,即定时器时钟频率为1MHz
	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;    // 时钟分割设置为1,表示不进行时钟分割,保持时钟完整性
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  // 计数模式设置为向上计数模式,从0计数到自动重载值(65535)
	TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;           // 重复计数器设置为0,不启用重复计数器,定时器只进行单次计数
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);            // 初始化定时器TIM3,应用上述配置

    
    // 配置定时器输入捕获参数
    TIM_ICInitStruct.TIM_Channel = TIM_Channel_1;               	// 使用TIM3的通道1
    TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI;  // 选择直接连接到TI1的输入信号
    TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;            // 输入捕获预分频器为1
    TIM_ICInitStruct.TIM_ICFilter = 0xF;                           // 输入滤波器设置为最大滤波值
    TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising;      // 上升沿触发输入捕获
    TIM_ICInit(TIM3, &TIM_ICInitStruct);                          // 初始化输入捕获
    
    // 配置触发器
    TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1);  // 选择输入触发器为TIM3通道1的输入(TI1)
    TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset); // 配置为复位模式,作为从设备

    // 启动定时器TIM3
    TIM_Cmd(TIM3, ENABLE);  // 启动TIM3,使其开始计数并处理输入捕获

}

// 获取PWM频率的函数
u32 IC_GetFreq(void)
{
    // 计算PWM频率(单位为Hz),根据捕获到的输入信号周期
    return 1000000 / (TIM_GetCapture1(TIM3) + 1);  // 以微秒为单位进行计算
}

pwm_ic.h

#ifndef __PWM_IC_H
#define __PWM_IC_H

#include "stm32f10x.h"                  
#include "sys.h"

void PWM_IC_Init(void);
u32	IC_GetFreq(void);

#endif



main.c


#include "stm32f10x.h"  // 设备相关头文件
#include "pwm_ic.h"     // PWM控制相关头文件
#include "delay.h"       // 延时相关头文件
 

 
int main(){
    PWM_IC_Init();      // 初始化PWM
    delay_init();    // 初始化延时函数

    	/*使用PWM模块提供输入捕获的测试信号*/
	PWM_SetPrescaler(720 - 1);					//PWM频率Freq = 72M / (PSC + 1) / 100//这两个函数在之前输出比较文章中pwm_led.c里面
	PWM_SetCompare1(50);						//PWM占空比Duty = CCR / 100
    
    while(1)
    {   

        IC_GetFreq(); 

    }
}


项目二:

程序现象:PWMI模式测频率占空比

pwmi_ic.c

#include "stm32f10x.h"  // STM32F10x外设库头文件
#include "pwmi_ic.h"     // PWM控制相关头文件
#include "delay.h"       // 延时函数头文件




// 按键初始化函数
void PWMI_IC_Init(void)
{
    // 定义定时器基础结构体和输出比较结构体
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; 
    GPIO_InitTypeDef GPIO_InitStructure;  // GPIO初始化结构体
    TIM_ICInitTypeDef TIM_ICInitStruct;   // 定时器输入捕获初始化结构体
    
    // 使能TIM3和GPIOA的时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);  	// 使能定时器TIM3时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  	// 使能GPIOA时钟

    // 配置GPIOA的引脚6为定时器的输入引脚(PWM输入)
    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_6;           		// 配置GPIOA的Pin6
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    		// 配置引脚的速度为50MHz
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IPD;       		// 配置为输入下拉模式
    GPIO_Init(GPIOA, &GPIO_InitStructure);               		// 初始化GPIOA的Pin6引脚

    /* 配置时钟源 */
    TIM_InternalClockConfig(TIM3);  															// 选择TIM3为内部时钟源,若不调用此函数,TIM默认也是内部时钟

	// 配置定时器基本参数
	TIM_TimeBaseStructure.TIM_Period = 65535 - 1;              		// 自动重载值,定时器的计数周期为65535,即计数从0到65534,周期为65535个时钟周期
	TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1;              		// 预分频器值,定时器时钟源被分频为72MHz / 72 = 1000000Hz,即定时器时钟频率为1MHz
	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;    		// 时钟分割设置为1,表示不进行时钟分割,保持时钟完整性
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  	// 计数模式设置为向上计数模式,从0计数到自动重载值(65535)
	TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;           		// 重复计数器设置为0,不启用重复计数器,定时器只进行单次计数
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);            		// 初始化定时器TIM3,应用上述配置

    
    // 配置定时器输入捕获参数
    TIM_ICInitStruct.TIM_Channel = TIM_Channel_1;               		// 使用TIM3的通道1
    TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI;  	// 选择直接连接到TI1的输入信号
    TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;            	// 输入捕获预分频器为1
    TIM_ICInitStruct.TIM_ICFilter = 0xF;                          	// 输入滤波器设置为最大滤波值
    TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising;      	// 上升沿触发输入捕获
    TIM_ICInit(TIM3, &TIM_ICInitStruct);                          	// 初始化输入捕获
		
//		    // 配置定时器输入捕获参数
//    TIM_ICInitStruct.TIM_Channel = TIM_Channel_2;               		// 使用TIM3的通道2
//    TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_IndirectTI;  // 选择交叉输入到TI1的输入信号
//    TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;            	// 输入捕获预分频器为1
//    TIM_ICInitStruct.TIM_ICFilter = 0xF;                           	// 输入滤波器设置为最大滤波值
//    TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Falling;      	// 下降沿触发输入捕获
//    TIM_ICInit(TIM3, &TIM_ICInitStruct);  
    TIM_PWMIConfig(TIM3,&TIM_ICInitStruct);
		
    // 配置触发器
    TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1); 								 			// 选择输入触发器为TIM3通道1的输入(TI1)
    TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset); 									// 配置为复位模式,作为从设备

    // 启动定时器TIM3
    TIM_Cmd(TIM3, ENABLE); 																						 // 启动TIM3,使其开始计数并处理输入捕获

}


// 获取PWM频率的函数
u32 IC_GetFreq(void)
{
    // 计算PWM频率(单位为Hz),根据捕获到的输入信号周期
    return 1000000 / (TIM_GetCapture1(TIM3) + 1);  // 以微秒为单位进行计算
}

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

pwmi_ic.h

#ifndef __PWMI_IC_H
#define __PWMI_IC_H

#include "stm32f10x.h"                  
#include "sys.h"

void PWMI_IC_Init(void);
u32	IC_GetFreq(void);
u32	IC_GetDuty(void);

#endif

main.c

#include "stm32f10x.h"  // 设备相关头文件
#include "pwmi_ic.h"     // PWM控制相关头文件
#include "delay.h"       // 延时相关头文件
 

 
int main(){
    PWMI_IC_Init();                              // 初始化PWM
    delay_init();                               // 初始化延时函数

    	/*使用PWM模块提供输入捕获的测试信号*/
	PWM_SetPrescaler(720 - 1);					//PWM频率Freq = 72M / (PSC + 1) / 100
	PWM_SetCompare1(50);						//PWM占空比Duty = CCR / 100
    
    while(1)
    {   

        IC_GetFreq(); 
        IC_GetDuty();

    }
}


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring Data JPA 入门

文章目录 前言、Spring Data JPA 是什么?1、背景2、优势3、Spring Data JPA 和 MyBatis-Plus 对比4、Spring Data JPA 与 JPA 的关系是什么? 一、准备1、依赖引入Spring Boot 框架依赖引入:非 Spring Boot 框架依赖引入: 2、定义实…

【Nacos03】消息队列与微服务之Nacos 集群部署

集群部署 集群部署说明 因此开源的时候推荐用户把所有服务列表放到一个vip下面,然后挂到一个域名下面 http://ip1:port/openAPI 直连ip模式,机器挂则需要修改ip才可以使用。 http://SLB:port/openAPI 挂载SLB模式(内网SLB,不可暴露到公网…

Python 类的设计(以植物大战僵尸为例)

关于类的设计——以植物大战僵尸为例 一、设计类需满足的三要素1. 类名2. 属性和方法 二、以植物大战僵尸的为例的类的设计1. 尝试分类2. 创建对象调用类的属性和方法*【代码二】*3. 僵尸的继承 三、代码实现 一、设计类需满足的三要素 1. 类名 类名:某类事物的名…

PDF提取文本

1.环境配置 !pip install PyPDF2 pdfplumber PyPDF2 是用来处理 PDF 文件的库,主要功能包括PDF 文件读取、合并、拆分、旋转,可以从 PDF 中提取纯文本,尽管它的提取效果有限,特别是对于扫描版 PDF 文件。 pdfplumber 是比 PyPDF2…

【unity小技巧】分享vscode如何进行unity开发,且如何开启unity断点调试模式,并进行unity断点调试(2024年最新的方法,实测有效)

文章目录 前言一、前置条件1、已安装Visual Studio Code,并且unity首选项>外部工具>外部脚本编辑器选择为Visual Studio Code [版本号],2、在Visual Studio Code扩展中搜索Unity,并安装3、同时注意这个插件下面的描述,需要根…

Leetcode经典题5--轮转数组

题目描述 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 输入输出示例 : 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右…

【LeetCode】每日一题 2024_12_9 判断国际象棋棋盘中一个格子的颜色(找规律)

前言 每天和你一起刷 LeetCode 每日一题~ LeetCode 启动! 题目:判断国际象棋棋盘中一个格子的颜色 最近力扣一直在出棋盘类的题目,这个月已经出了 9 天了,我倒要看看他是不是真能出一个月 代码与解题思路 先读题:题…

VRRP的知识点总结及实验

1、VRRP VRRP(Virtual Router Redundancy Protocol,虚拟路由器冗余协议)既能够实现网关的备份,又能解决多个网关之间互相冲突的问题,从而提高网络可靠性。 2、VRRP技术概述: 通过把几台路由设备联合组成一台虚拟的“路由设备”…

PostgreSQL 安装部署系列:使用YUM 方式在Centos 7.9 安装指定 PostgreSQL -15版本数据库

一、前言 千里之行始于足下,想学习一门数据库,首先要从安装部署开始,先拥有一套属于自己的学习测试库。为了更好的学习该数据库,可以选择一个在企业界使用率比较普及的操作系统,选择稳定版本的操作系统;如果…

Kafka Stream实战教程

Kafka Stream实战教程 1. Kafka Streams 基础入门 1.1 什么是 Kafka Streams Kafka Streams 是 Kafka 生态中用于 处理实时流数据 的一款轻量级流处理库。它利用 Kafka 作为数据来源和数据输出,可以让开发者轻松地对实时数据进行处理,比如计数、聚合、…

Flink:入门介绍

目录 一、Flink简介 2.1 Flink 架构 2.2 Flink 应用程序 运行模式 二、Flink 集群 部署 2.1 本地集群模式 2.1.1 安装JDK​编辑 2.1.2 下载、解压 Flink 2.1.3 启动集群 2.1.4 停止集群 2.2 Standalone 模式 2.2.0 集群规划 2.2.1 安装JDK 2.2.2 设置免密登录 2…

重生之我在异世界学编程之C语言:深入结构体篇(上)

大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 本文目录 引言正文《1》 结构体的两种声明一、结构…

移动充电服务如何打破传统的新能源汽车充电难、找桩难问题?

中国新能源汽车在全球市场中占据重要地位,2024年上半年,中国新能源汽车销量达到494.4万辆,占全球新能源市场的68%。新能源汽车作为国家实现“碳中和”的重要途径之一,国家陆续出台各项产业政策,推动新能源汽车行业往标…

AI大模型ollama结合Open-webui

AI大模型Ollama结合Open-webui 作者:行癫(盗版必究) 一:认识 Ollama 1.什么是Ollama ​ Ollama是一个开源的 LLM(大型语言模型)服务工具,用于简化在本地运行大语言模型,降低使用大语言模型的门槛,使得大模型的开发者、研究人员和爱好者能够在本地环境快速实验、管理和…

Ubuntu Linux 图形界面工具管理磁盘分区和文件系统(八)

本文为Ubuntu Linux操作系统- 第八弹~~ 今天接着上文的内容,讲Linux磁盘分区存储的相关知识~ 上期回顾:命令行-管理磁盘分区和文件系统 今天看酷酷的雪獒铠甲!!雪獒铠甲合体~ 文章目录 磁盘管理器GNOME Disks主要功能安装命令 磁盘…

AI大模型的实践应用-探索智能科技的未来(附学习教程资源)

第一章:AI大模型技术概览 1.1 AI大模型的定义与特点 AI大模型,通常指的是参数数量达到数亿甚至数千亿的深度学习模型。这些模型因其庞大的参数量而得名,能够捕捉和学习数据中的复杂模式和关系。与传统模型相比,AI大模型具有更强的…

AI 数字人模型 Hallo2:让图片开口说话,一键修复模糊人脸

Hallo2 是由复旦大学 (Fudan University)、百度公司 (Baidu Inc) 和南京大学 (Nanjing University) 于 2024 年联合开发的一项先进技术,旨在生成长时间、高质量的唇形视频。该技术在原有的 Hallo 模型基础上进行了多项创新和改进,使其能够应对长时间视频…

反向代理-缓存篇

文章目录 强缓存一、Expires(http1.0 规范)二、cache-control(http1.1 出现的 header 信息)Cache-Control 的常用选项Cache-Control 常用选项的选择三、弊端协商缓存一、ETag二、If-None-Match三、Last-modified四、If-Modified-Since浏览器的三种刷新方式静态资源部署策略…

uniapp扭蛋机组件

做了一个uniapp的扭蛋机组件,可以前往下载地址下载 仅测试了vue2、3、h5页面微信小程序,理论支持全平台 使用方法简单,具有待机动效、抽奖中动效、掉落奖品动效,可以替换奖品图片,足以满足大部分抽奖页面需求。 示例图…

QT实战--QTreeWidget实现两种行颜色+QListWidget样式

本文主要介绍了QTreeWidget实现两种行颜色、点击打开父节点以及设置父子节点之间距离,同时附带介绍了QListWidget样式 树效果图: 列表效果图: 1.树样式的实现 1)使用代码: m_pLeftTreeWidget = new QTreeWidget(this);m_pLeftTreeWidget->setObjectName("suolue_t…