STM32-TIM输入捕获

news2024/10/8 18:49:02

一、概述

IC(Input Capture)输入捕获

  • 输入捕获模式下,当通道输入引脚出现指定电平跳变(上升沿或下降沿)时,当前CNT的值将被锁存到CCR中,可用于测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参数
  • 每个高级定时器和通用定时器都拥有4个输入捕获通道
  • 可配置为PWMI(PWM输入)模式,同时测量频率和占空比
  • 可配合主从触发模式,实现硬件全自动测量

以下为输入捕获的框图,左边一共有4路输入通道,对于同一个定时器输入捕获与输出比较只能使用其中一个。这个异或门的输入接在了通道1,2,3端口,异或门执行逻辑是:当三个输入引脚的任何一个有电平翻转时,输出引脚就产生电平翻转,之后输出通过数据选择器,到达输入捕获通道1。当数据寄存器不选择异或门时,就没有用,设计这个异或门,其实还是为三相无刷电机服务的。

然后来到输入滤波器和边沿检测器,滤波器是滤除噪声的不会改变频率,边沿检测器是检测是上升沿还是下降沿。

接着,有两套电路,第一套是TI1FP1。第二套是TI1FP2,输入给通道2。这样交叉的目的之一是可以把一个引脚的输入,同时映射到两个捕获单元,这也是PWMI模式的经典结构,让第一个通道测量频率,第二个通道测量占空比。

接着,预分频器对输入频率进行分频。分频之后的触发信号就可以触发捕获电路进行工作,每来一个触发信号,CNT的值就会向CCR(捕获寄存器)进行转运一次。转运的同时会发生一个捕获事件,这个事件会在状态寄存器置标志位,同时也可以产生中断。

 二、频率测量

测频法、测周法,大于中界频率用测频法,小于则用测周法,所以这个测频法适合测频率高的,测周法适合测频率低的。

三、输入捕获结构

如下图:经过滤波器滤波后,一路TI1FP1可以通向触发从模式控制器,这个从模式里面,就有电路,可以自动完成CNT的清零。滤波器中ICF[3:0]值越大滤波越好。另一路走通道1作为输入捕获。

当TI1FP1信号出现上升沿时,会将CNT的值向CCR中转运。同时,TI1FP1也作为触发源选择的触发信号,当出现上升沿时使CNT的值变为初始值(这里时硬件自动控制)。肯定是将CNT的值向CCR中转运在前,CNT的值变为初始值在后。

1、主从触发模式

 主模式:可以将定时器内部的信号,映射到TRGO引脚,用于触发别的外设。

 从模式:是被动的,就是接收其他外设或者自身外设的一些信号用于控制自身定时器的运行。

 触发源选择:就是用来触发从模式的。

2、输入捕获基本结构



3、PWMI基本结构 

 

四、测PWM占空比和频率代码

接线图:

  • 用TIM2_CH1通道先生成PWM波形代码

PWM.c:

#include "stm32f10x.h"                  // Device header


void PWM_Init(void)
{
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_OCInitTypeDef TIM_OCInitStructure;
	GPIO_InitTypeDef GPIO_InitStructure;
	//1.配置时钟,用那个外设
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
 	GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AF_PP;   //复用推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
 	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	//2.内部时钟配置
	TIM_InternalClockConfig(TIM2);
	
	//3.配置时基单元
	TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;     //滤波频率
	TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up; //计数方式,向上
	TIM_TimeBaseInitStruct.TIM_Period=100-1;                   //自动重装载寄存器ARR
	TIM_TimeBaseInitStruct.TIM_Prescaler=0;                     //预分频器
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;

	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);
	
	
	//4.输出比较初始化
	TIM_OCStructInit(&TIM_OCInitStructure);            //要给结构体赋一个初始值,否则有可能出现错误
	TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;               //输出模式
	TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High ;     //CC1P输出极性,这里的High指的是REF有效电平为高电平输出
	TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;   //输出使能
	TIM_OCInitStructure.TIM_Pulse=0;                               //用来设置CCR
	TIM_OC1Init(TIM2,&TIM_OCInitStructure);
	
	//5.启动定时器
	TIM_Cmd(TIM2,ENABLE);
	

}

//设置CCR
void PWM_SetCompare1(uint16_t Compare)
{
	
       TIM_SetCompare1(TIM2,Compare);
	
}

//设置预分频器
void PWM_SetPrescaler(uint16_t Prescaler)
{
	  
		 TIM_PrescalerConfig(TIM2,Prescaler,TIM_PSCReloadMode_Immediate);
	
	
}

PWM.h:

#ifndef _PWM_H
#define _PWM_H


void PWM_SetCompare1(uint16_t Compare);

void PWM_Init(void);
void PWM_SetPrescaler(uint16_t Prescaler);

#endif
  • 测量PWM的频率和占空比的代码

利用测周法测PWM占空比和频率,利用TIM3_CH1输入捕获通道进行捕获A6引脚输入的信号。 

IC.c:

#include "stm32f10x.h"                  // Device header


//测周法测PWM占空比和频率

void IC_Init(void)
{ 
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_ICInitTypeDef  TIM_ICInitStruct;
	GPIO_InitTypeDef GPIO_InitStructure;
	//1.配置时钟,用那个外设
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
 	GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPU;   
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
 	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	//2.内部时钟配置
	TIM_InternalClockConfig(TIM3);
	
	//3.配置时基单元
	TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;       //滤波频率
	TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;   //计数方式,向上
	TIM_TimeBaseInitStruct.TIM_Period=65535-1;                   //自动重装载寄存器ARR
	TIM_TimeBaseInitStruct.TIM_Prescaler=72-1;                   //预分频器
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;

	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);
	
	//4.初始化捕获单元
	TIM_ICInitStruct.TIM_Channel=TIM_Channel_1;                   //选择输入通道
	TIM_ICInitStruct.TIM_ICFilter=0xF;                            //滤波
	TIM_ICInitStruct.TIM_ICPolarity=TIM_ICPolarity_Rising ;       //选择极性,上升沿
	TIM_ICInitStruct.TIM_ICPrescaler=TIM_ICPSC_DIV1 ;             //预分频器
	TIM_ICInitStruct.TIM_ICSelection=TIM_ICSelection_DirectTI;    //确定输出直连通道
   TIM_ICInit(TIM3,&TIM_ICInitStruct);
	
	TIM_PWMIConfig(TIM3,&TIM_ICInitStruct);
	
	//5.触发源选择TI1FP1
	TIM_SelectInputTrigger(TIM3,TIM_TS_TI1FP1);
	
	//6.配置TRGI中从模式
	TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Reset);
	
	//7.启动定时器
	TIM_Cmd(TIM3,ENABLE);
	
}

//测频率
uint32_t IC_GetFreq(void)
{
	
	return 1000000/(TIM_GetCapture1(TIM3)+1);
	
	
}

//测占空比
uint32_t IC_GetDuty(void)
{
	
	return (TIM_GetCapture2(TIM3)+1)*100 /(TIM_GetCapture1(TIM3)+1);
	
	
}

IC.h:

#ifndef _LC_H
#define _LC_H


void IC_Init(void);

uint32_t IC_GetFreq(void);

uint32_t IC_GetDuty(void);


#endif

 main.c:

#include  "stm32f10x.h"                  // Device header
#include  "OLED.h"
#include  "delay.h"
#include  "PWM.h"
#include  "lC.h"

uint16_t  i;

int main(void)
{
	
   OLED_Init();
	PWM_Init();
	
	IC_Init();
	
	OLED_ShowString(1,1,"Freq:00000Hz");
	OLED_ShowString(2,1,"Duty:00%");
	PWM_SetPrescaler(3600-1);   //频率Freq=72M/(PSC+1)/100
	PWM_SetCompare1(80);       //CCR/100  占空比
	while(1) 
	{
	  
		OLED_ShowNum(1,6,IC_GetFreq(),5);
		OLED_ShowNum(2,6,IC_GetDuty(),2);
		
	}
	
}

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

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

相关文章

Label Studio 半自动化标注

引言 Label Studio ML 后端是一个 SDK,用于包装您的机器学习代码并将其转换为 Web 服务器。Web 服务器可以连接到正在运行的 Label Studio 实例,以自动执行标记任务。我们提供了一个示例模型库,您可以在自己的工作流程中使用这些模型,也可以根据需要进行扩展和自定义。 1…

厨房用品分割系统源码&数据集分享

厨房用品分割系统源码&数据集分享 [yolov8-seg-C2f-DCNV3&yolov8-seg-AFPN-P345等50全套改进创新点发刊_一键训练教程_Web前端展示] 1.研究背景与意义 项目参考ILSVRC ImageNet Large Scale Visual Recognition Challenge 项目来源AAAI Global Al ln…

C++欧拉函数

题目一 求欧拉函数 解题思路 分解质因数&#xff1b;代入公式计算即可&#xff08;注意要防止计算出小数是结果不准&#xff09;&#xff1b; 代码实现 #include<iostream> #include<algorithm> #include<cmath>using namespace std;void Euler(int n) {i…

注册安全分析报告:惠农网

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

丝杆支撑座预压标准解析

丝杆支撑座预压的主要目的是提高轴的旋转精度、刚性和运行性能&#xff0c;同时防止轴在运转过程中产生震动和异响&#xff0c;从而提高系统的整体精度和稳定性。那么&#xff0c;丝杆支撑座的预压标准是什么呢&#xff1f; 丝杆支撑座的预压可以分为标准型轻预压和标准型重预压…

atcoder-374(a-e)

atcoder-374 文章目录 atcoder-374ABC简洁的写法正解 D正解 E A #include<bits/stdc.h>using namespace std;signed main() {string s;cin>>s;string strs.substr(s.size()-3);if(str "san") puts("Yes");else puts("No");return 0…

SpringBoot Jar 包加密防止反编译

今天看到了一个说明jar包加密的实现方式&#xff0c;特意试了下效果&#xff0c;并下载了插件源码及实现源码查看了下子&#xff0c;感兴趣的可以在最后得到gitee地址。 SpringBoot 程序 Jar 包加密的方式&#xff0c;通过代码加密可以实现无法反编译。应用场景就是当需要把公司…

谈谈电路板中高速电路设计和低速电路设计的区别

谈谈电路板中高速电路设计和低速电路设计的区别 1.高速电路和低速电路的应用场景&#xff1a;1.1.低速电路应用场景1.2.高速电路的应用场景1.3.高速电路设计比低速电路设计强吗 2.高速电路和低速电路的如何区分2.1.Fknee有效频率是什么2.2.区分高速和低速的步骤&#xff1a; 3.…

OpenFeign 工作原理源码记录

文章目录 EnableFeignClientsregisterDefaultConfigurationregisterFeignClients类路径扫描注册 FeignClientregisterFeignClient 总结 FeignClient 接口实例化FeignContextcreateContextthis.configurationsClient FeignBuilderloadBalance 负载均衡实现Targeter 创建接口代理…

JavaScript函数基础(通俗易懂篇)

10.函数 10.1 函数的基础知识 为什么会有函数&#xff1f; 在写代码的时候&#xff0c;有一些常用的代码需要书写很多次&#xff0c;如果直接复制粘贴的话&#xff0c;会造成大量的代码冗余&#xff1b; 函数可以封装一段重复的javascript代码&#xff0c;它只需要声明一次&a…

基于springboot vue地方废物回收机构管理系统设计与实现

博主介绍&#xff1a;专注于Java&#xff08;springboot ssm 等开发框架&#xff09; vue .net php phython node.js uniapp 微信小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不…

JavaScript将array数据下载到Excel中

具体代码如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widt…

centos7安装node18及升级glbic

centos7安装node18及升级glbic CentOS7安装nodejs18及以上版本会报错&#xff0c;glibc版本过低 安装nvm curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.0/install.sh | bash source ~/.nvm/nvm.shnvm install 18 nvm use 18#设置默认版本 nvm alias defau…

2024最新最全:超详细Nmap使用技巧(非常详细)零基础入门到精通,收藏这一篇就够了

这个工具我几乎可以不用介绍了&#xff0c;就算你们没用过&#xff0c;但是每当提起黑客工具大部分都会看到他。Nmap是一款非常强大的主机发现和端口扫描工具&#xff0c;而且nmap运用自带的脚本&#xff0c;还能完成漏洞检测&#xff0c;同时支持多平台。 一、主机发现 1. 全…

数字王国里的虚拟人——技术、商业与法律解读

数字王国里的虚拟人——技术、商业与法律解读 目录 数字王国里的虚拟人——技术、商业与法律解读引言作者解读书籍简介摘抄适用群体小结购书链接 引言 这本书是一本兼具深度和广度的跨专业领域的科普读物&#xff0c;全书以案例形式&#xff0c;用轻松有趣的笔触向读者传递了科…

【网络原理】面试高频考点!!TCP协议“三次握手,四次挥手”,保姆级详解,建议收藏!

&#x1f490;个人主页&#xff1a;初晴~ &#x1f4da;相关专栏&#xff1a;计算机网络那些事 通过上篇文章&#xff0c;我们可以得知TCP通过 “确认应答” 和 “超时重传”机制相辅相成&#xff0c;共同构建了 TCP的“可靠传输机制”。而为了保障建立通信和断开通信的可靠性…

【Orange Pi 5嵌入式应用编程】-用户空间BH1750环境光传感器驱动

BH1750环境光传感器驱动 文章目录 BH1750环境光传感器驱动1、BH1750传感器介绍2、BH1750测量流程及寄存器2.1 BH1750功能结构2.2 BH1750流量流程2.3 BH1750的控制指令2.4 BH1750通信时序2.4.1 连续高分辨模式2.4.2 单次低分辨模式2.4.3 传感器灵敏度调整3、BH1750FVI驱动实现3.…

JavaEE: 深入解析HTTP协议的奥秘(3)

文章目录 HTTP认识 "报头"(Header)认识 "状态码"(status code) HTTP JavaEE: 深入解析HTTP协议的奥秘(2) 书接上文~ 认识 “报头”(Header) Header 的整体的格式是"键值对"结构. 每个键值对占一行,键和值之间使用分号分隔. Host 表示服务器主…

JVM实现跨平台的关键因素:class文件和“翻译器”

文章目录 前言关键因素&#xff1a;class文件class文件格式说明Java 源代码在class文件中的体现涉及到的知识点&#xff08;面试题&#xff09; 关键因素&#xff1a;“翻译器”解释器即时编译器&#xff08;JIT&#xff09; 总结 前言 当你通过上文对JVM有了初步的认识后&…

【电路】1.3 电功率和能量

1.3 电功率和能量 电是一种能量存在形式。 1.3.1 电压的定义 将单位正电荷由A点移动至B点&#xff0c;电场力所做的功是 w w w&#xff0c;则 u A B d w d q u_{AB}\frac{dw}{dq} uAB​dqdw​&#xff0c; w w w是功&#xff0c; q q q是电荷量从A到B&#xff0c;沿着任意路…