STM32——输入捕获

news2024/9/21 5:12:10

输入捕获模式可以用来测量脉冲宽度或者测量频率。STM32的定时器,除了TIM6、TIM7,其他的定时器都有输入捕获的功能。应用场景是编码器。

测量频率

当捕获通道TIx 上出现上升沿时,发生第一次捕获,计数器CNT 的值会被锁存到捕获寄存器CCR 中,而且还会进入捕获中断,在中断服务程序中记录一次捕获(可以用一个标志变量来记录),并 把捕获寄存器中的值读取到value1 中。

当出现第二次上升沿时,发生第二次捕获,计数器CNT 的值会再次被锁存到捕获寄存器CCR 中,并再次进入捕获中断,在捕获中断中,把捕获寄存器 的值读取到value3 中,并清除捕获记录标志。利用value3 和value1 的差值我们就可以算出信号的 周期(频率)。

测量脉宽

当捕获通道TIx 上出现上升沿时,发生第一次捕获,计数器CNT 的值会被锁存到捕获寄存器CCR 中,而且还会进入捕获中断,在中断服务程序中记录一次捕获(可以用一个标志变量来记录),并 把捕获寄存器中的值读取到value1 中。

然后把捕获边沿改变为下降沿捕获,目的是捕获后面的 下降沿。当下降沿到来的时候,发生第二次捕获,计数器CNT 的值会再次被锁存到捕获寄存器 CCR 中,并再次进入捕获中断,在捕获中断中,把捕获寄存器的值读取到value2,利用value2-value1的差值即可算出脉冲宽度。

PWM输入模式

由上述我们知道,输入捕获模式,不仅可以单独测量脉宽,还可以单独测量频率,那么是否可以同时测量脉宽和频率呢?(这种也是最常用的方式),答案是肯定可以,只不过需要占用两个捕获寄存器(单独测量脉宽和频率只需要一个)

具体过程:

1.信号由输入通道TI1 进入,信号会被分为两路,一路是 TI1FP1,另外一路是TI2FP2。其中一路是周期,另一路是占空比。(作为触发输入的那一路信号对应的就是 周期,另一路就是对应占空比。作为触发输入的那一路信号还需要设置极性,是上升沿还是下降 沿捕获,一旦设置好触发输入的极性,另外一路硬件就会自动配置为相反的极性捕获,无需软件 配置。一句话概括就是:选定输入通道,确定触发信号,然后设置触发信号的极性即可

2.将从模式控制器配置为复位模式(配置寄存器SMCR 的位 SMS[2:0] 来实现),即当我们启动触发信号开始进行捕获的时候,同时把计数器CNT 复位清零。

3.以下图为例:

PWM 信号由输入通道TI1 进入,配置TI1FP1 为触发信号,上升沿捕获。当上升沿的时候IC1 和 IC2 同时捕获,计数器CNT 清零。

到了下降沿的时候,IC2 捕获,此时计数器CNT 的值被锁存 到捕获寄存器CCR2 中,到了下一个上升沿的时候,IC1 捕获,计数器CNT 的值被锁存到捕获寄 存器CCR1 中。

可知CCR2 测量的是脉宽,CCR1 测量的是周期。

应用:

  • 电机控制

输入捕获功能可用于监测电机的霍尔传感器反馈或者反电动势(back electromotive force, BEMF),从而确定电机的转子位置和速度,以便进行适时的换相,实现电机的高效控制。

  • 实时监控和反馈控制

位置监测与控制:通过捕获传感器反馈信号,可以实时监测设备或系统的位置,并提供精确的反馈控制,如自动化生产线、机器人操作等。

速度闭环控制:捕获速度反馈信号,用于实现速度闭环控制系统,如电梯速度控制、风扇转速控制等。

  • 串口通信同步(底层原理)

在串口通信中,数据的传输需要严格的同步,以确保发送端和接收端能够正确地识别和解析数据。输入捕获功能可以用于同步接收端的数据接收时钟,从而实现可靠的串口通信。

发送端:发送端根据通信协议的波特率(Baud Rate)产生一个连续的数据流,并将其转换成电平信号发送。波特率定义了每秒钟传输的比特数,因此发送端的时钟需要与波特率相匹配。

接收端:接收端使用输入捕获功能来捕获串口接收线上的数据边沿,通常是起始位(Start Bit)的边沿。通过捕获起始位的边沿,接收端可以确定数据的到达时间,并据此同步接收时钟。

同步原理:接收端根据捕获的起始位边沿和预设的波特率来生成一个本地时钟,该本地时钟与发送端的时钟同步。当本地时钟与发送端的时钟同步时,接收端就能够精确地在每个数据位的中间捕获数据,并正确地解析数据。

代码

#include "public.h"

void TIMx_Capture_Config(void)
{ 
	TIMx_GPIO_Config();
	TIMx_NVIC_Config();

	//配置TIM8时基
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	
	TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
	//APB2 84Mhz  TIM8=168Mhz
	TIM_TimeBaseStructure.TIM_Period= 50000;  //ARR计数最大值  输入捕获有什么影响?
	TIM_TimeBaseStructure.TIM_Prescaler= 168-1;//PSC分频系数
	/*
		168Mhz/168=1Mhz 数一个数:1/1000000 s  1/1Mhz =  168/168M x
	*/
	TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);
	
	//输入捕获配置
	
	TIM_ICInitTypeDef  TIM_ICInitStructure;
	
	TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;  //输入捕获通道选择
	TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
	//???
	TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;//设置捕获通道的信号直连和非直连
	TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;//1分频,即捕获信号的每个有效边沿都捕获
	TIM_ICInitStructure.TIM_ICFilter = 0x0;//滤波,经历几个周期跳变,认为波形稳定。

	TIM_PWMIConfig(TIM8, &TIM_ICInitStructure);


	/* Select the TIM8 Input Trigger: TI1FP1 */
	TIM_SelectInputTrigger(TIM8, TIM_TS_TI1FP1);
	
	TIM_SelectSlaveMode(TIM8, TIM_SlaveMode_Reset);
	TIM_SelectMasterSlaveMode(TIM8,TIM_MasterSlaveMode_Enable);
	
	TIM_Cmd(TIM8, ENABLE);
	
	TIM_ClearITPendingBit(TIM8, TIM_IT_CC1);
	TIM_ITConfig(TIM8, TIM_IT_CC1, ENABLE);
}

static void TIMx_GPIO_Config(void)
{
	//1.TIM8 PC6 配置成输入捕获通道
	
	GPIO_InitTypeDef GPIO_InitStructure;
	
	/* TIM4 clock enable */
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);
	/* GPIOB clock enable */
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE);
	
	/* TIM8 chenne1 configuration : PC.6 */
	GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_6;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN ;
    GPIO_Init(GPIOC, &GPIO_InitStructure);
	
	/* Connect PC.6 pin to TIM8 */
	GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_TIM8);
}

static void TIMx_NVIC_Config(void)
{
	NVIC_InitTypeDef NVIC_InitStructure;
	 
	NVIC_InitStructure.NVIC_IRQChannel = TIM8_CC_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
}
__IO uint16_t IC1Value=0; //TIM8 IC1的值
__IO uint16_t IC2Value=0; //TIM8 IC2的值

__IO float DutyCycle=0;   //脉宽,占空比
__IO float Frequency=0;   //频率

void TIM8_CC_IRQHandler(void)
{
	
	if (TIM_GetITStatus(TIM8, TIM_IT_CC1) == SET)
	{
		TIM_ClearITPendingBit(TIM8, TIM_IT_CC1);
		/* 获取输入捕获的值*/
		IC1Value = TIM_GetCapture1(TIM8);
		IC2Value = TIM_GetCapture2(TIM8);
		
		if(IC1Value!=0)
		{
			//占空比
			DutyCycle=(float)(IC2Value+1)/(IC1Value+1)*100;			
			//频率
			Frequency= (168000000/168)/(float)IC1Value;				
		}
		else
		{
			//周期和脉宽为0
			DutyCycle=0;
			Frequency=0;
		}		
	}
#include "public.h"
int main(void)
{
	//2号分组:2bit给抢占  2bit给响应   0-3  0-3 
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 
	SysTick_Init();
	
	//1.初始化定时器TIM4的通道引脚
	TIMx_GPIO_Init();
	
	//2.定时器TIM4初始化
	TIMx_PWM_Config();
	
	//修改CCR比较值,调节不同的占空比
	//TIM_SetCompare1(TIM4,1000-1);
	
	uint16_t Compare1=1;
	uint16_t flag = 1;
	
	while(1)
	{
		
		Delay_ms(2);
		
		if(flag)
			Compare1+=10;
		else 
			Compare1-=10;
		
		if(Compare1>2000-1)
			flag=0;
		if(Compare1<=10)
			flag=1;

		TIM_SetCompare1(TIM14,Compare1);
		
	}	
}

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

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

相关文章

Java中的红黑树(如果想知道Java中有关红黑树的知识点,那么只看这一篇就足够了!)

前言&#xff1a;红黑树作为一种自平衡的二叉搜索树&#xff0c;在计算机科学领域具有极其重要的地位。它通过颜色约束和旋转操作保持树的高度平衡&#xff0c;从而保证了查找、插入、删除等操作的高效性。红黑树广泛应用于操作系统的调度算法、数据库索引、Java集合框架等领域…

「全球大模型竞技场」更新:DeepSeek-V2.5全面领跑国内模型

原文&#xff1a;深度求索 DeepSeek 月初&#xff0c;我们发布并开源了 DeepSeek-V2.5&#xff0c;一个融合通用与代码能力的全新模型。 近日&#xff0c;LMSYS 组织的全球大模型竞技场&#xff08;ChatBotArena&#xff09;更新结果发布&#xff0c;DeepSeek-V2.5 排名位列国…

额定剩余动作电流继电器有什么功能?

ASJ系列剩余电流动作继电器可与低压断路器或低压接触器等组装成组合式的剩余电流动作保护器&#xff0c;为现代电力系统设计&#xff0c;旨在提高电力系统的安全性和可靠性。其技术和多功能特性使其成为电力管理和监测的理想选择。主要适用于交流50Hz&#xff0c;额定电压为400…

iPhone 16系列:熟悉的味道,全新的体验

来看看iPhone 16和Plus这两个新成员&#xff0c;实话说&#xff0c;它们和之前曝光的样子几乎完全一致。下面我们就一起来细数一下这次的几大变化吧。 外观设计&#xff1a;焕然一新 首先&#xff0c;最显眼的变化就是后置镜头模组的布局调整为了垂直排列。这一改变使得整个背…

29912分页

拆分地址&#xff1a; 003FDFB0 0000 0000 0011 1111 1101 1111 1011 000000 0*8 00 0000 001 -> 1*8 1 1111 1101 -> 1FD*8 1111 1011 0000 -> FB0PROCESS 883ef7c8 SessionId: 1 Cid: 09b0 Peb: 7ffdf000 ParentCid: 0588DirBase: bf2484a0 ObjectTable: 98…

将多个pdf合并成一个文件?这几种合并方法很好用!

如何将多个pdf合并成一个文件&#xff1f;面对日益增长的PDF文档&#xff0c;我们时常陷入管理困境&#xff0c;这不仅仅关乎于时间与精力的巨大消耗&#xff0c;因为这些孤立的PDF文件如同散落的拼图碎片&#xff0c;让关键信息的搜寻变得如同大海捞针&#xff0c;严重拖慢了工…

双指针算法:快速解决问题的小技巧(Java代码实现)

“人的一生是短暂的&#xff0c;但如果卑鄙地过这短暂的一生&#xff0c;那就太长了。” 文章目录 前言文章有误敬请斧正 不胜感恩&#xff01;双指针简介对撞指针快慢指针例题聪明的小羊肖恩神奇的数组盛最多的水 总结 前言 写在开始&#xff1a; 双指针算法是一种经典且高效…

“中秋快乐”文字横幅的MATLAB代码生成

中秋快乐呀朋友们&#xff01;&#xff01;&#xff01; 给大家带来一个好玩的代码&#xff0c;能够生成“中秋快乐”的横幅文字&#xff0c;比较简单&#xff0c;当然你也可以根据自己的需求去更改文字和背景&#xff0c;废话不多说&#xff0c;直接展示。 文字会一直闪烁&…

智能BI项目第三期

AIGC AI 提问技巧 为了让 Al 更好地理解我们的输入&#xff0c;并给出预期精确的输出&#xff0c;需要严格控制我们的提问词。 1.使用系统预设 控制输入格式(便于Al精确地理解我们的需求) 你是一个数据分析师和前端开发专家&#xff0c;接下来我会按照以下固定格式给你提供…

《深度学习》PyTorch框架 优化器、激活函数讲解

目录 一、深度学习核心框架的选择 1、TensorFlow 1&#xff09;概念 2&#xff09;优缺点 2、PyTorch 1&#xff09;概念 2&#xff09;优缺点 3、Keras 1&#xff09;概念 2&#xff09;优缺点 4、Caffe 1&#xff09;概念 2&#xff09;优缺点 二、pytorch安装 1、安装 2、…

传输层协议 —— UDP协议

目录 0.前言 1.UDP协议格式 16位源端口和目的端口 16位UDP长度 16位校验和 2.UDP协议特点 无连接 不可靠 面向数据报 3.UDP的缓冲区 0.前言 首先&#xff0c;我们得明确一点&#xff0c;网络模型是分层的。自底向上分别是物理层、数据链路层、网络层、传输层、应用层…

Nginx反向代理出现502 Bad Gateway问题的解决方案

&#x1f389; 前言 前一阵子写了一篇“关于解决调用百度翻译API问题”的博客&#xff0c;近日在调用其他API时又遇到一些棘手的问题&#xff0c;于是写下这篇博客作为记录。 &#x1f389; 问题描述 在代理的遇到过很多错误码&#xff0c;其中出现频率最高的就是502&#x…

JavaEE:网络编程(套接字)

文章目录 Socket套接字TCP和UDP的区别有连接/无连接可靠传输/不可靠传输面向字节流/面向数据报全双工/半双工 UDP/TCP api的使用UDPDatagramSocketDatagramPacketInetSocketAddress练习 TCPServerSocketSocket练习 Socket套接字 Socket是计算机网络中的一种通信机制&#xff0…

驱动开发知识点

裸机开发 ——————————————linux驱动 SOC&#xff1a; 定义&#xff1a;SOC&#xff0c;全称System on Chip&#xff0c;是一种集成了多个功能模块的芯片&#xff0c;包括处理器、内存、外设、接口等。它将原本分散在多个芯片上的功能集成到一个芯片上&#xff0…

一个基于 laravel 和 amis 开发的后台框架, 友好的组件使用体验,可轻松实现复杂页面(附源码)

前言 随着互联网应用的发展&#xff0c;后台管理系统的复杂度不断增加&#xff0c;对于开发者而言&#xff0c;既要系统的功能完备&#xff0c;又要追求开发效率的提升。然而&#xff0c;传统的开发方式往往会导致大量的重复劳动&#xff0c;尤其是在构建复杂的管理页面时。有…

不限学历!这个证书在上海太香了!利于积分、落户、抵扣个税...

一、软考是什么&#xff1f; “软考”全称&#xff1a;计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试&#xff0c;关于它你需要知道&#xff1a; 1、软考是全国性考试&#xff1a;软考实行全国统一规划&#xff0c;实行统一大纲&#xff0c;统一试题&#xff…

【vulhub】Os-hackNos-1

&#x1f3d8;️个人主页&#xff1a; 点燃银河尽头的篝火(●’◡’●) 如果文章有帮到你的话记得点赞&#x1f44d;收藏&#x1f497;支持一下哦 【vulhub】Os-hackNos-1 环境搭建漏洞复现 环境搭建 进入vulnhub官网 https://vulnhub.com 下载镜像 在虚拟机中打开镜像文件…

100行Python代码实现FastAPI Websocket 聊天室(纯协程方案)

本文发表于入职啦(公众号: ruzhila) 大家可以访问入职啦学习更多的编程实战。 项目地址 代码已经开源&#xff0c; fastapi_chatroom &#x1f44f; 欢迎Star 代码运行效果&#xff1a; 所有的项目都在github上开源&#xff1a;100-line-code 欢迎Star &#x1f44f; 用100行…

open sora1.1容器构建教程指南

一、介绍 Open-Sora 1.1 项目是 Colossal AI 团队开发的一个完全开源的视频生成项目&#xff0c;该项目致力于高效制作高质量视频&#xff0c;并通过开源原则实现先进视频生成技术的低成本普及。 1. 项目背景与目标 Open-Sora 项目旨在通过提供开源的模型、工具和内容&#…

idea使用阿里云服务器运行jar包

说明&#xff1a;因为我用的阿里云服务器不是自己的&#xff0c;所以一些具体的操作可能不太全面。看到一个很完整的教程&#xff0c;供参考。 0. 打包项目 这里使用的是maven打包。 在pom.xml中添加以下模块。 <build><plugins><plugin><groupId>org…