当前位置: 首页 > news >正文

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();}
}

相关文章:

TIM输入捕获---STM

一、简介 IC输入捕获 输入捕获模式下,当通道输入引脚出现指定电平跳变时,当前CNT的值将被锁存在CCR中,可用于测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参数 每个高级定时器和通用定时器都拥有4个输入捕获通道 可配置为PWMI模…...

【笔记】架构上篇Day6 法则四:为什么要顺应技术的生命周期?

法则四:为什么要顺应技术的生命周期? 简介:包含模块一 架构师的六大生存法则-法则四:为什么要顺应技术的生命周期?&法则四:架构设计中怎么判断和利用技术趋势? 2024-08-29 17:30:07 你好&am…...

MSF(Metasploit Framework)

渗透测试中MSF是一个非常强大的工具&#xff0c;可以用来验证系统漏洞、执行攻击以及开发自定义的漏洞利用代码。以下是使用MSF进行渗透测试的基本步骤&#xff1a; 1.启动MSF 启动MSF控制台。 msfconsole2. 搜索漏洞 在MSF中搜索已知漏洞。 search <vulnerability nam…...

Python中的OpenCV详解

文章目录 Python中的OpenCV详解一、引言二、OpenCV基础操作1、OpenCV简介2、安装OpenCV3、图像读取与显示 三、图像处理技术1、边缘检测2、滤波技术 四、使用示例1、模板匹配 五、总结 Python中的OpenCV详解 一、引言 在当今数字化社会中&#xff0c;图像处理和计算机视觉技术…...

IMX6ULL开发板学习嵌入式技术过程中为了测试本地网络是否正常而常用的Ping命令

Windows ip&#xff1a;192.168.5.10 Ubuntu ip&#xff1a;192.168.5.11 开发板 ip&#xff1a;192.168.5.9 最常用的 最常用的两个是开发板和Ubuntu的互ping 开发板→Ubuntu ping 192.168.5.11Ubuntu→开发板 ping 192.168.5.9完整的如下 Windows→Ubuntu ping 192.16…...

Blue Ocean 在Jenkins上创建Pipeline使用详解

BlueOcean是Jenkins的一个插件,它提供了一套可视化操作界面来帮助用户创建、编辑Pipeline任务。以下是对BlueOcean中Pipeline操作的详细解释: 一、安装与启动BlueOcean 安装:在Jenkins的“系统管理”->“插件管理”->“可选插件”中搜索“BlueOcean”,然后点击“Ins…...

2024 年最新前端ES-Module模块化、webpack打包工具详细教程(更新中)

模块化概述 什么是模块&#xff1f;模块是一个封装了特定功能的代码块&#xff0c;可以独立开发、测试和维护。模块通过导出&#xff08;export&#xff09;和导入&#xff08;import&#xff09;与其他模块通信&#xff0c;保持内部细节的封装。 前端 JavaScript 模块化是指…...

photoshop的2个形状-箭头

有时候用ps画一些教程类图文&#xff0c;需要用到箭头. 另外自己画了一个镂空的长方形和正方形 形状的路径一般在Custom Shapes文件夹内 例如 E:\photoshopCS4\Adobe Photoshop CS4\Presets\Custom Shapes...

【经验分享】搭建本地训练环境知识点及方法

最近忙于备考没关注&#xff0c;有次点进某小黄鱼发现首页出现了我的笔记还被人收费了 虽然我也卖了一些资源&#xff0c;但我以交流、交换为主&#xff0c;笔记都是免费给别人看的 由于当时刚刚接触写的并不成熟&#xff0c;为了避免更多人花没必要的钱&#xff0c;所以决定公…...

AI知识-多模态(Multimodal)

摘要 本文将探讨多模态&#xff08;Multimodal&#xff09;的概念&#xff0c;包括其通俗理解、技术原理、应用场景&#xff0c;以及进行总结。我们将通过一个简要的介绍来了解多模态技术&#xff0c;并深入探讨其在人工智能和机器学习领域的重要性。 通俗理解 多模态&#x…...

代码随想录 leetcode-数据结构刷题笔记

文章目录 一、数组1.1 二分查找 1.1.1 二分查找 1.1.2 搜索插入位置1.1.3 排序数组中查找元素第一和最后一个位置1.1.4 x的平方根 1.1.5 有效的完全平方数 1.2 快慢指针 1.2.1 移除元素 1.2.2 删除有序数组中的重复项 1.2.3 移动0 1.2.4 比较含退格的字符串 1.2.5 有序数组的平…...

Oracle最佳实践-优化硬解析

前段时间参加oracle CAB&#xff0c;oracle高级服务部门做了一个数据库最佳实践的报告&#xff0c;其中就有一项就是解决未使用绑定变量但执行次数很多的SQL&#xff1b; 对于一个数据库来说如果不知道该如何优化&#xff0c;那么最简单最有效的优化就是减少硬解析&#xff0c;…...

Windows中将springboot项目运行到docker的容器中

0&#xff0c;先打包好项目&#xff0c;再启动docker 1&#xff0c;在Java项目根目录下创建一个名为Dockerfile的文件&#xff08;没有扩展名&#xff09;&#xff0c;并添加以下内容。 # 使用OpenJDK的基础镜像 FROM openjdk:8-jdk-alpine# 设置工作目录 WORKDIR /app# 将项…...

30、使用ESP8266跟SG90舵机制作四足蜘蛛机器人

目录 1、简介 2、使用例子 3、代码解析 4、资源下载 正文 1、简介 本篇使用ESP8266跟SG90舵机制作四足蜘蛛机器人,使用的180度舵机有8个,需要一块16路舵机控制板,也可以使用小一点的控制板8路也够了。下面开始今天的教程,源码在文章末尾自行下载,力求大家都能看懂。…...

相比普通LED显示屏,强力巨彩软模组有哪些优势?

在科技技术的加持下&#xff0c;LED显示屏市场各类创新产品层出不穷&#xff0c;为市场带来了无限可能。其中&#xff0c;强力巨彩R系列H版&#xff08;软模组&#xff09;凭借其独特的技术优势&#xff0c;在行业内脱颖而出。那么&#xff0c;相比常规LED显示屏&#xff0c;强…...

部门操作和日志

PostMapping("/depts") public Result add(RequestBody Dept dept){System.out.println("添加部门: " dept);deptService.add(dept);return Result.success(); }Override public void add(Dept dept) {dept.setCreateTime(LocalDateTime.now());dept.setU…...

antdv-<a-button>中属性的使用

UI组件库&#xff08;User Interface Component Library&#xff09;是一种预先构建好的、可重用的用户界面元素集合&#xff0c;旨在帮助开发者更快速、更简便地构建用户界面。这些组件通常包括按钮、表单、导航栏、模态框等&#xff0c;能够提供一致的外观和交互风格&#xf…...

python解题之寻找最大的葫芦

问题描述 问题描述 在一场经典的德州扑克游戏中&#xff0c;有一种牌型叫做“葫芦”。“葫芦”由五张牌组成&#xff0c;其中包括三张相同牌面值的牌 &#xfffd;a 和另外两张相同牌面值的牌 &#xfffd;b。如果两个人同时拥有“葫芦”&#xff0c;我们会优先比较牌 &#…...

iOS 环境搭建教程

本文档将详细介绍如何在 macOS 上搭建 iOS 开发环境&#xff0c;以便进行 React Native 开发。&#xff08;为了保证环境一致 全部在网络通畅的情况下运行&#xff09; 1. 安装 Homebrew Homebrew 是 macOS 的包管理工具&#xff0c;我们将通过它来安装开发所需的工具。 安装…...

制作容器镜像

容器基础镜像制作 由于项目使用麒麟操作系统&#xff0c;需要在麒麟桌面操作系统和服务器操作系统里编译代码&#xff0c;如果每次都在物理机和虚拟机里编译太不方便&#xff0c;也无法使用常用的 jenkins k8s 组成的 CI/CD 编译环境&#xff0c;如果基于整个ISO太大了&#…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中&#xff0c;我们渴望一个能激发创想、愉悦感官的工作与生活伙伴&#xff0c;它不仅是冰冷的科技工具&#xff0c;更能触动我们内心深处的细腻情感。正是在这样的期许下&#xff0c;华硕a豆14 Air香氛版翩然而至&#xff0c;它以一种前所未有的方式&#x…...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...