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的Pin6GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    // 配置引脚的速度为50MHzGPIO_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,即定时器时钟频率为1MHzTIM_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的通道1TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI;  // 选择直接连接到TI1的输入信号TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;            // 输入捕获预分频器为1TIM_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); // 配置为复位模式,作为从设备// 启动定时器TIM3TIM_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();      // 初始化PWMdelay_init();    // 初始化延时函数/*使用PWM模块提供输入捕获的测试信号*/PWM_SetPrescaler(720 - 1);					//PWM频率Freq = 72M / (PSC + 1) / 100//这两个函数在之前输出比较文章中pwm_led.c里面PWM_SetCompare1(50);						//PWM占空比Duty = CCR / 100while(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的Pin6GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    		// 配置引脚的速度为50MHzGPIO_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,即定时器时钟频率为1MHzTIM_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的通道1TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI;  	// 选择直接连接到TI1的输入信号TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;            	// 输入捕获预分频器为1TIM_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); 									// 配置为复位模式,作为从设备// 启动定时器TIM3TIM_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();                              // 初始化PWMdelay_init();                               // 初始化延时函数/*使用PWM模块提供输入捕获的测试信号*/PWM_SetPrescaler(720 - 1);					//PWM频率Freq = 72M / (PSC + 1) / 100PWM_SetCompare1(50);						//PWM占空比Duty = CCR / 100while(1){   IC_GetFreq(); IC_GetDuty();}
}

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

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

相关文章

【Android Studio】学习——网络连接

实验:Android网络连接 文章目录 实验:Android网络连接[toc]实验目标和实验内容:1、掌握Android联网的基本概念;2、能够使用URL connection实现网络连接;3、掌握第三方库的基本概念4、需实现的具体功能 实验结果功能说明…

ROS学习笔记二:ROS环境搭建

安装ubuntu安装ROS 参考赵虚左老师教程:ROS安装ROS 快速上手体验 -使用命令来实现 –创建工作空间: mkdir -p ros_learn_ws/src// ros_learn_ws为自定义空间 cd ros_learn_ws catkin_make –创建ROS功能包并添加依赖 cd src catkin_create_pkg demo_01 r…

5G中什么是ATG网络?

有人问Air to Ground Networks for NR是怎么回事?这个是R18 NR才引入的。 ATG很多部分和NTN类似中的内容类似。比较明显不同的是,NTN的RF内容有TS 38.101-5单独去讲,而ATG则会和地面网络共用某些band,ATG可以工作在N1/N3/N34/N39…

基础算法--双指针

两数之和 点击:题目链接 解法一:暴力解法 时间复杂度:O(N^2) 算法思路:两层for循环即可列出所有两个数字的组合,判断是否等于目标值 算法流程: 两层 for 循环: 外层 for 循环依次枚举第⼀个…

什么是Linux系统架构?

​ Linux系统架构是指Linux操作系统的整体结构和工作层次,它定义了系统组件如何交互、如何管理硬件资源,以及用户如何通过不同的层次与系统进行交互。Linux架构通常有两种划分方法:系统层次架构和功能层次架构,两者都可以很好地描…

spring6:4、原理-手写IoC

目录 4、原理-手写IoC4.1、回顾Java反射4.2、实现Spring的IoC 4、原理-手写IoC 我们都知道,Spring框架的IOC是基于Java反射机制实现的,下面我们先回顾一下java反射。 4.1、回顾Java反射 Java反射机制是在运行状态中,对于任意一个类&#x…

不是“我应该做什么”,而是“我想做什么”

1. 识别内心的渴望 首先,我们需要识别自己真正的愿望和激情所在。这可能需要一些时间和自我反思。问自己:在没有任何外界压力的情况下,我真正想做的是什么?是赚钱、生活、旅行、追星,还是其他什么?识别这些…

30天学会Go--第7天 GO语言 Redis 学习与实践

30天学会Go–第7天 GO语言 Redis 学习与实践 文章目录 30天学会Go--第7天 GO语言 Redis 学习与实践前言一、Redis 基础知识1.1 Redis 的核心特性1.2 Redis 常见使用场景 二、安装 Redis2.1 在 Linux 上安装2.2 在 Windows 上安装2.3 使用 Docker 安装 Redis 三、Redis 常用命令…

Vue项目开发 如何实现父组件与子组件数据间的双向绑定?

在 Vue.js 中,实现父组件与子组件数据之间的双向绑定,可以通过以下几种方式。下面我将介绍几种常见的方法,并解释它们的实现原理和适用场景。 1. 使用 v-model 实现双向绑定 v-model 是 Vue.js 中最常见的双向绑定方式,它可以使…

React第十七章(useRef)

useRef 当你在React中需要处理DOM元素或需要在组件渲染之间保持持久性数据时,便可以使用useRef。 import { useRef } from react; const refValue useRef(initialValue) refValue.current // 访问ref的值 类似于vue的ref,Vue的ref是.value,其次就是vu…

【C++】内存分布、new、delete、 operator new、operator delete

内存分布 在C语言和C中,程序内存被划分成六个部分: 内核空间、栈、内存映射段、堆、数据段、代码段 栈:又称堆栈,主要为非静态局部变量、函数参数、返回值等,栈的生长方向是向下生长的 内存映射段:高效的…

代码随想录算法训练营day37|动态规划part5

今天的几道题目都比较简单,思路也比较相似,都是利用完全背包。完全背包和01背包的不同点在于完全背包每个元素可以取多次,而01背包只能取1次,所以在dp一维数组遍历时,完全背包仍然要从前往后遍历,并且无论是…

混合云策略在安全领域受到青睐

Genetec 发布了《2025 年物理安全状况报告》,该报告根据超过 5,600 名该领域领导者(其中包括 100 多名来自澳大利亚和新西兰的领导者)的回应,揭示了物理安全运营的趋势。 报告发现,澳大利亚和新西兰的组织采用混合云策…

FastAPI解决跨域报错net::ERR_FAILED 200 (OK)

目录 一、跨域问题的本质 二、FastAPI中的CORS处理 1. 安装FastAPI和CORS中间件 2. 配置CORS中间件 3. 运行FastAPI应用 三、解决跨域报错的步骤 四、案例:解决Vue.js与FastAPI的跨域问题 1. Vue.js前端应用 2. FastAPI后端API 3. 配置CORS中间件 4. 运行和测试 五…

为什么 JavaScript 中的 `new` 运算符报错?

在 JavaScript 中,new 运算符通常用于创建一个新对象并调用构造函数来初始化对象。然而,new 运算符可能会引发一些错误,通常是由于以下原因导致的: 构造函数没有正确的定义: 如果使用 new 运算符调用的函数没有正确地定…

霍尔效应电流传感器

适用于大电流,低功耗的电流检测: TVS选型: RS232的隔离电路: 单片机采集200伏高压 如何做隔离电路: 采用线性光电耦合器HCNR200实现高压直流母线电压的精确采样。还是用电阻分压,只是在ADC检测阶段加上隔离芯片:

如何设置Java爬虫的异常处理?

在Java爬虫中设置异常处理是非常重要的,因为网络请求可能会遇到各种问题,如连接超时、服务器错误、网络中断等。通过合理的异常处理,可以确保爬虫的稳定性和健壮性。以下是如何在Java爬虫中设置异常处理的步骤和最佳实践: 1. 使用…

ceph /etc/ceph-csi-config/config.json: no such file or directory

环境 rook-ceph 部署的 ceph。 问题 kubectl describe pod dragonfly-redis-master-0Warning FailedMount 7m59s (x20 over 46m) kubelet MountVolume.MountDevice failed for volume "pvc-c63e159a-c940-4001-bf0d-e6141634cc55" : rpc error: cod…

【计网笔记】习题

物理层 不属于物理层接口规范定义范畴的是(C) A. 接口形状 B. 引脚功能 C. 物理地址 D. 信号电平 【2023-912】光网络只能通过导向型介质传播。() 【2017-408】若信道在无噪声情况下的极限数据传输速率不小于信噪比为30dB条件下的…

最新 AI 编程工具全面对比:v0、Bolt.new、Cursor、Windsurf

随着人工智能的快速发展,越来越多的 AI 驱动的开发工具应运而生,旨在提升开发效率、优化开发流程,并减轻开发者的工作负担。在这个背景下,四款新兴的 AI 编程工具:v0、Bolt.new、Cursor 和 Windsurf,各具特…