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.rhkb.cn/news/489127.html

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

相关文章

Linux驱动开发(14):PWM子系统–pwm波形输出实验

PWM子系统用于管理PWM波的输出,与我们之前学习的其他子系统类似,PWM具体实现代码由芯片厂商提供并默认编译进内核, 而我们可以使用内核(pwm子系统)提供的一些接口函数来实现具体的功能,例如使用PWM波控制显示屏的背光、…

C++在关键嵌入式软件领域逐步取代 Ada 的演进历程

第一章:引言 1.1 Ada 与 C在嵌入式系统中的角色 在嵌入式系统开发领域的漫长演进历程中,Ada 与 C宛如两颗璀璨而又各具特色的星辰,交替影响着该领域的发展轨迹。它们不仅代表了两种不同的编程哲学,也反映了不同时期对软件可靠性…

商业化大前端在性能优化领域的探索与实践

导读:在业务飞速发展的过程中,用户体验是必不可少的一个环节,而页面性能是直接影响用户体验的重要因素。当页面加载时间过长、交互操作不流畅时,意味着业务可能会出现转化率降低、用户流失等业务问题。在过去一年,为了…

基于wifipumpkin3的AP伪造

一、软硬件需求 利用wifipumpkin-3进行AP伪造需要kali系统,还需要一张支持在kali的环境下能够支持AP伪造的无线网卡,如果是针对特定的无线网的话,再来第二张网卡的话更好用来转发流量更好。对于wifipumpkin-3的安装使用可以分为两种方式&…

【解决】k8s使用kubeadm初始化集群失败问题整理

执行提示命令,查看报错信息 journalctl -xeu kubelet1、错误:running with swap on is no 报错 "command failed" err"failed to run Kubelet: running with swap on is no 解决: swap未禁用,需要禁用swap&…

专升本-高数 1

第 0 章,基础知识 一,重要公式 1、完全平方 (ab)a2abb (a-b)a-2abb 2、平方差公式 (a-b)(ab)a-b 3、立方差公式 a-b(a-b)(aabb) 4、 立方和公式 ab(ab)(a-abb) 二,基本初等函数 1,幂函数 一元二…

桥接模式的理解和实践

桥接模式(Bridge Pattern),又称桥梁模式,是一种结构型设计模式。它的核心思想是将抽象部分与实现部分分离,使它们可以独立地进行变化,从而提高系统的灵活性和可扩展性。本文将详细介绍桥接模式的概念、原理…

深入探索:createThread与cancelThread的用法及实例

在多线程编程领域,线程的创建与管理是核心技能之一。本文将详细介绍两个关键函数:createThread(用于创建新线程)和cancelThread(用于取消已存在的线程),并通过具体实例展示它们的用法。需要注意的是,不同的编程语言和线程库可能有不同的API设计,但基本概念是相通的。本…

SpringBoot【十三(完结篇)】集成在线接口文档Swagger2

一、前言🔥 环境说明:Windows10 Idea2021.3.2 Jdk1.8 SpringBoot 2.3.1.RELEASE 二、Swagger常用注解 由于Swagger 是通过注解的方式来生成对应的 API,在接口上我们需要加上各种注解来描述这个接口,所以对它常用的注解我们是必…

麒麟信安推出支持信创PC的新一代云桌面方案,助力政务信创高效安全运维

12月11日,在第二届国家新一代自主安全计算系统产业集群融通生态大会上,麒麟信安发布了支持信创PC的新一代云桌面方案,该方案是基于国际TCI架构实现国产PC机云化纳管在国内的首次发布,并与银河麒麟桌面操作系统、长城国产PC整机实现…

28.攻防世界PHP2

进入场景 扫描目录 [04:12:32] 403 - 303B - /.ht_wsr.txt [04:12:32] 403 - 306B - /.htaccess.bak1 [04:12:32] 403 - 308B - /.htaccess.sample [04:12:…

右玉200MW光伏电站项目 微气象、安全警卫、视频监控系统

一、项目名称 山西右玉200MW光伏电站项目 微气象、安全警卫、视频监控系统 二、项目背景: 山西右玉光伏发电项目位于右玉县境内,总装机容量为200MW,即太阳能电池阵列共由200个1MW多晶硅电池阵列子方阵组成,每个子方阵包含太阳能…

商业银行基于容器云的分布式数据库架构设计与创新实践

导读 本文介绍了某商业银行基于 TiDB 和 Kubernetes(简称 K8s) 构建的云化分布式数据库平台,重点解决了传统私有部署模式下的高成本、低资源利用率及运维复杂等问题。 通过引入 TiDB Operator 自动化管理与容器化技术,银行能够实现多个业务系统的高可用…

TongWe7.0-东方通TongWeb控制台无法访问 排查

**问题描述:**无法访问TongWeb的控制台 逐项排查: 1、控制台访问地址是否正确:http://IP:9060/console #IP是服务器的实际IP地址 2、确认TongWeb进程是否存在,执行命令:ps -ef|grep tongweb 3、确认TongWeb服务启动…

yolov,coco,voc标记的睡岗检测数据集,可识别在桌子上趴着睡,埋头睡觉,座椅上靠着睡,平躺着睡等多种睡姿的检测,6549张图片

yolov,coco,voc标记的睡岗检测数据集,可识别在桌子上趴着睡,埋头睡觉,座椅上靠着睡,平躺着睡等多种睡姿的检测,6549张图片 数据集分割 6549总图像数 训练组91% 5949图片 有效集9&#x…

echarts绘制自定义展示排名和数据等信息(数据排名进度条)

目录 一、结构分析 二、配置图表各部分 1.名称及排序 2.进度条绘制 3.数据末端圆形绘制 (1)基本配置 (2)数据 (3)坐标轴配置 (4)点的样式 (5)项的样…

独家原创 | CEEMDAN-CNN-GRU-GlobalAttention + XGBoost组合预测

往期精彩内容: 时序预测:LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较 全是干货 | 数据集、学习资料、建模资源分享! EMD变体分解效果最好算法——CEEMDAN(五)-CSDN博客 拒绝信息泄露!VMD滚动分…

数据仓库-基于角色的权限管理(RBAC)

什么是基于角色的用户管理? 基于角色的用户管理(Role-Based Access Control,简称RBAC)是通过为角色赋予权限,用户通过成为适当的角色而得到这些角色的权限。 角色是一组权限的抽象。 使用RBAC可以极大简化对权限的管理。 什么是RBAC模型&…

鸿蒙调试打包(非正式打包)

文章目录 前言第一步:生成.p12和.csr文件第二步:申请证书的前置步骤第三步:申请证书 前言 HarmonyOS 应用打包后的文件为.app 格式, android 打包后的文件为.apk,IOS 打包后的文件为.apa HarmonyOS通过数字证书&#…

警惕!手动调整服务器时间可能引发的系统灾难

警惕!手动调整服务器时间可能引发的系统灾难 1. 鉴权机制1.1 基于时间戳的签名验证1.2 基于会话的认证机制(JWT、TOTP) 2. 雪花算法生成 ID 的影响2.1 时间戳回拨导致 ID 冲突2.2 ID 顺序被打乱 3. 日志记录与审计3.1 日志顺序错误3.2 审计日…