STM32F407输入捕获应用--PWM 输入模式测量脉冲频率与宽度

2023-11-16

STM32F407输入捕获应用--PWM 输入模式测量脉冲频率与宽度


输入捕获一般应用在两个方面,一个方面是脉冲跳变沿时间测量,另一方面
是 PWM 输入测量。

一、测量脉宽或者频率

在这里插入图片描述
1.测量频率

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

2.测量脉宽

当捕获通道 TIx 上出现上升沿时,发生第一次捕获,计数器 CNT 的值会被锁存到捕获寄存器 CCR 中,而且还会进入捕获中断,在中断服务程序中记录一次捕获(可以用一个标志变量来记录),并把捕获寄存器中的值读取到 value1 中。然后把捕获边沿改变为下降沿捕获,目的是捕获后面的下降沿。当下降沿到来的时候,发生第二次捕获,计数器 CNT 的值会再次被锁存到捕获寄存器 CCR 中,并再次进入捕获中断,在捕获中断中,把捕获寄存器的值读取到 value3 中,并清除捕获记录标志。然后把捕获边沿设置为上升沿捕获。在测量脉宽过程中需要来回的切换捕获边沿的极性,如果测量的脉宽时间比较长,定时器就会发生溢出,溢出的时候会产生更新中断,我们可以在中断里面对溢出进行记录处理。

二、PWM 输入模式

测量脉宽和频率还有一个更简便的方法就是使用 PWM 输入模式。与上面那种只使用一个捕获寄存器测量脉宽和频率的方法相比,PWM 输入模式需要占用两个捕获寄存器。

在这里插入图片描述
当使用 PWM 输入模式的时候,因为一个输入通道(TIx)会占用两个捕获通道(ICx),所以一个定时器在使用 PWM 输入的时候最多只能使用两个输入通道(TIx)。我们以输入通道 TI1 工作在 PWM 输入模式为例来讲解下具体的工作原理,其他通道以此类推即可。

PWM 信号由输入通道 TI1 进入,因为是 PWM 输入模式的缘故,信号会被分为两路,一路是 TI1FP1,另外一路是 TI2FP2。其中一路是周期,另一路是占空比,具体哪一路信号对应周期还是占空比,得从程序上设置哪一路信号作为触发输入,作为触发输入的哪一路信号对应的就是周期,另一路就是对应占空比。作为触发输入的那一路信号还需要设置极性,是上升沿还是下降沿捕获,一旦设置好触发输入的极性,另外一路硬件就会自动配置为相反的极性捕获,无需软件配置。一句话概括就是:选定输入通道,确定触发信号,然后设置触发信号的极性即可,因为是 PWM 输入的缘故,另一路信号则由硬件配置,无需软件配置。当使用 PWM 输入模式的时候必须将从模式控制器配置为复位模式(配置寄存器 SMCR 的位 SMS[2:0]来实现),即当我们启动触发信号开始进行捕获的时候,同时把计数器 CNT 复位清零。

下面我们以一个更加具体的时序图来分析下 PWM 输入模式。

在这里插入图片描述

PWM 信号由输入通道 TI1 进入,配置 TI1FP1 为触发信号,上升沿捕获。当上升沿的时候 IC1 和 IC2 同时捕获,计数器 CNT 清零,到了下降沿的时候,IC2捕获,此时计数器 CNT 的值被锁存到捕获寄存器 CCR2 中,到了下一个上升沿的时候,IC1 捕获,计数器 CNT 的值被锁存到捕获寄存器 CCR1 中。其中 CCR2 测量的是脉宽,CCR1 测量的是周期。

从软件上来说,用 PWM 输入模式测量脉宽和周期更容易,付出的代价是需要占用两个捕获寄存器

三、软件实现

3.1、硬件准备

1、粤嵌开发板一套
在这里插入图片描述

2、迷你示波器一个

在这里插入图片描述

3.2代码

初始化代码

/*****************************************
引脚说明:
PB6

TIM4_CH1(TIM4 -- APB1 16位  84MHZ)

*****************************************/


void Pwm_PB6_InputInit(void)
{
	GPIO_InitTypeDef 			GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef  	TIM_TimeBaseStructure;
	NVIC_InitTypeDef 			NVIC_InitStructure;
	TIM_ICInitTypeDef			TIM4_ICInitStructure;
	
	
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//时钟使能
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);//使能GPIOB时钟
	
	
	GPIO_InitStructure.GPIO_Pin 	= GPIO_Pin_6; 			//GPIOB6
	GPIO_InitStructure.GPIO_Mode 	= GPIO_Mode_AF;			//复用功能
	GPIO_InitStructure.GPIO_Speed 	= GPIO_Speed_100MHz;	//速度100MHz
	GPIO_InitStructure.GPIO_OType 	= GPIO_OType_PP; 		//推挽复用输出
	GPIO_InitStructure.GPIO_PuPd 	= GPIO_PuPd_NOPULL; 		//下拉
	GPIO_Init(GPIOB,&GPIO_InitStructure); 					//初始化
	
	// 定时器复用引脚
	GPIO_PinAFConfig(GPIOB,GPIO_PinSource6,GPIO_AF_TIM4);

	TIM_TimeBaseStructure.TIM_Prescaler		= 83;  					//定时器分频
	TIM_TimeBaseStructure.TIM_CounterMode	= TIM_CounterMode_Up; 	//向上计数模式
	TIM_TimeBaseStructure.TIM_Period		= 49999;   				//自动重装载值
	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; 		//分频因子 配置死区时会用到
	
	TIM_TimeBaseInit(TIM4,&TIM_TimeBaseStructure);


	//初始化TIM2输入捕获参数
	TIM4_ICInitStructure.TIM_Channel 	= TIM_Channel_1;   			//通道1
	TIM4_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;	//上升沿捕获
	TIM4_ICInitStructure.TIM_ICSelection= TIM_ICSelection_DirectTI; //映射到TI1上
	TIM4_ICInitStructure.TIM_ICPrescaler= TIM_ICPSC_DIV1;	 		//配置输入分频,不分频 
	TIM4_ICInitStructure.TIM_ICFilter   = 0x05;						//IC3F=0000 配置输入滤波器 不滤波
	// 初始化 PWM 输入模式
	TIM_PWMIConfig(TIM4, &TIM4_ICInitStructure);
		
	

	// 当工作做 PWM 输入模式时,只需要设置触发信号的那一路即可(用于测量周期)
	// 另外一路(用于测量占空比)会由硬件自带设置,不需要再配置
	
	// 选择输入捕获的触发信号
	TIM_SelectInputTrigger(TIM4, TIM_TS_TI1FP1);

	// 选择从模式: 复位模式
	// PWM 输入模式时,从模式必须工作在复位模式,当捕获开始时,计数器 CNT 会被复位
	TIM_SelectSlaveMode(TIM4, TIM_SlaveMode_Reset);
	TIM_SelectMasterSlaveMode(TIM4,TIM_MasterSlaveMode_Enable);

	// 使能捕获中断,这个中断针对的是主捕获通道(测量周期那个)
	TIM_ITConfig(TIM4, TIM_IT_CC1, ENABLE);
	TIM_ClearITPendingBit(TIM4, TIM_IT_CC1);
	
	NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级2
	NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;		//子优先级0
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器、
	
	//TIM_ITConfig(TIM4,TIM_IT_Update|TIM_IT_CC2,ENABLE);				//允许更新中断 ,允许CC2IE捕获中断	
	
	TIM_Cmd(TIM4,ENABLE ); 	//使能定时器4
	
}


主函数代码

u32 IC1Value, IC2Value;
float DutyCycle,Frequency;


//定时器4中断服务程序	 
void TIM4_IRQHandler(void)
{ 		    

	/* 清除定时器捕获/比较 1 中断 */
	TIM_ClearITPendingBit(TIM4, TIM_IT_CC1);

	/* 获取输入捕获值 */
	IC1Value = TIM_GetCapture1(TIM4);
	IC2Value = TIM_GetCapture2(TIM4);
	//printf("IC1Value = %d IC2Value = %d ",IC1Value,IC2Value);
	// 注意:捕获寄存器 CCR1 和 CCR2 的值在计算占空比和频率的时候必须加 1
	if (IC1Value != 0) 
	{
		flag = 1;
	} 

}


int main(void)
{
	
	unsigned int count = 0;
	
	
	//设置NVIC分组 第二分组 抢占优先级范围:0~3  响应优先级范围:0~3
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	Delay_Init();
	//对LED初始化
	Led_Init();

	Usart1_Init(115200);
	Pwm_PB6_InputInit();
	
	while(1)
	{

		//每隔500ms计算一次占空比与频率。
		if(flag == 1)
		{
			
			/* 占空比计算 */
			DutyCycle = (float)((IC2Value+1) * 100) / (IC1Value+1);

			/* 频率计算 */
			Frequency = 84000000/(83+1)/(float)(IC1Value+1);			
			
			
			printf("占空比:%0.2f%% 频率:%0.2fHz\r\n",DutyCycle,Frequency);
			
			DutyCycle = 0;
			Frequency = 0;
			flag = 0;
		}
			
		delay_ms(500);
			
	}
	return 0;
}

3.4 验证

在这里插入图片描述

最后发现有一定的误差,未知是不是这几百块的示波器产生的问题,还是软件的问题。还待验证,到时再找台高精度的脉冲发生器看看了。有了解的码农可以互相讨论下。

程序链接:https://download.csdn.net/download/wwwqqq2014/87148727

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32F407输入捕获应用--PWM 输入模式测量脉冲频率与宽度 的相关文章

随机推荐

  • 神经网络随手记-1

    目录 sigmod函数主要缺点 Relu 线性整流函数 Leaky ReLU 随机梯度下降法 sigmod函数主要缺点 在输入值变大时 梯度会变得非常小甚至消失 这意味着 在训练神经网络时 如果发生这种饱和 我们将无法根据梯度来更新权重 函
  • 传感器尺寸与像素密度对相片分辨率的影响

    在人们日常生活摄影中 相机的传感器尺寸以及像素素往往决定了一幅图像的清晰度 当然 不同的镜头 不同的CMOS质量等等都会对相片的质量产生影响 今天就简单讨论讨论传感器尺寸和像素密度对图像分辨率的影响 当传感器尺寸一定时 像素越多 也就是像素
  • Python-集合

    探索Python集合的奇妙世界 在Python编程中 集合 Set 是一种强大且有用的数据结构 它用于存储多个不重复的元素 集合的独特之处在于它的元素是无序的 并且每个元素都是唯一的 这使得集合在处理去重和进行快速成员检查时非常有效 创建集
  • 手把手带你打造自己的UI样式库(第五章)之常用页面切图的设计与开发

    常用页面切图的设计与开发 在一些大的前端团队中 前端工程师这个职位会出现一个分支 叫做重构工程师 重构工程师主要负责 HTML 和 CSS 的制作 也就是把设计稿转换成 HTML 和 CSS 代码 重构工作完成以后 把制作好的 HTML 和
  • 【第十四届蓝桥杯单片机组底层驱动测试】

    第十四届蓝桥杯单片机组底层驱动测试 下面分享的是第十四届蓝桥杯单片机组底层驱动代码的测试和相关说明 今年官方提供的资料包中底层驱动代码和以往有了变化 主要代码还是提供给了我们 只是此次没有了相关头文件iic h ds1302 onewire
  • win10剪贴板快捷键win+v

    win v可以出现最近10多次粘贴的数据
  • Ioc容器refresh总结(3)--- Spring源码从入门到精通(三十三)

    上篇文章介绍了 调用bean工厂的后置处理器 主要分为两步 他是在beanFactory预准备标准初始化之后执行invokBeanFactoryPostProcessor 先调用beanDefinitionRegistryPostProce
  • [paper] MTCNN

    MTCNN 论文全称 Joint Face Detection and Alignment using Multi task Cascaded Convolutional Networks 论文下载链接 https arxiv org ab
  • vue.js基础学习(模板语法)

    基础入门 vue js模板语法 1 模板语法 methods 给vue定义方法 this 指向当前vue实例 v html 让内容以HTML形式编译 v bind 绑定动态数据 v noce 当数据发生改变时 插值处内容不发生改变 动态属性
  • maven相关

    1 webxml attribute is required or pre existing WEB INF web xml if executing in update 原因 web项目下缺少 WEB INF web xml 在servl
  • 【AWS】API Gateway创建Rest API--从S3下载文件

    一 背景 在不给AK SK的前提下 用户查看s3上文件 从s3下载文件 二 创建API 1 打开API Gateway 点击创建API 选择REST API REST API和HTTP API区别 来自AWS官网 REST API 和 HT
  • 算法——查找

    文章目录 一 基本概念和评价 1 相关概念 2 查找表 2 1 常见操作 2 2 分类 3 查找算法的评价指标 二 线性结构查找 1 顺序查找算法 1 1 定义 1 2 算法思想 1 3 特点 1 4 分类 1 无哨兵的无序线性表的顺序查找
  • Unity 安卓报错 failed to extract resources needed by IL2cpp

    Unity打出来的包在自己的PC放置好文件后 运行能够正常运行 但是git提交之后 别的机器拉代码下来报错 failed to extract resources needed by IL2cpp 这里推测原因是 安卓包打出来的Asset
  • TikTok逆向,全球的小姐姐们,我来啦!

    作者 AYJk 链接 https juejin im post 5c19a38ae51d453e0a209256 开源地址 首先抛出GitHub地址吧 多多支持指点 谢谢 AYTikTokPod https github com AYJk
  • 知识索引目录

    author skate time 2012 11 22 存储 io系统的压力测试工具 fio http blog csdn net wyzxg article details 7454072 iozone使用 http blog csdn
  • 从零开发一套完整的react项目开发环境

    不管是工作需要还是面试加分 除了Vue相关技术以外 React技术栈也已经成为了前端开发工程师必备的技术点 接下来 我将从零开发一套完整的React全家桶项目开发环境 提供给需要的同行小伙伴观看也方便自己以后复习 篇幅很长 请需要的小伙伴耐
  • ZLMediaKit+wvp-GB28181-pro 安装文档

    文章目录 前言 1 安装zlm 1 1 镜像说明 1 2 docker安装 1 2 1 docker安装命令 1 2 2 docker compose安装 1 3 zlm配置和日志重点说明 2 安装wvp 2 1 目录结构说明 2 1 1
  • 汇编宏伪指令介绍

    1 汇编宏伪指令介绍 macro macname macargs endm 1 macro 和 endm 表示宏定义的开始和结束 2 macro 后面接着宏定义的名字 然后是参数 参数后面的宏定义的实现 3 在宏定义中使用参数 需要添加前缀
  • Eclipse中Web项目开发与Tomcat发布的的路径问题详解

    本人以前对Web项目的开发路径和发布路径等一直都很懵逼 今天找到了一片文章 里面写得很详细 在这里转载分享给大家 https www cnblogs com teach p 5669873 html
  • STM32F407输入捕获应用--PWM 输入模式测量脉冲频率与宽度

    STM32F407输入捕获应用 PWM 输入模式测量脉冲频率与宽度 一 测量脉宽或者频率 二 PWM 输入模式 三 软件实现 3 1 硬件准备 3 2代码 3 4 验证 输入捕获一般应用在两个方面 一个方面是脉冲跳变沿时间测量 另一方面 是