定时器输入捕获实验

输入捕获简介:
输入捕获模式可以用来测量脉冲宽度或者测量频率。STM32 的定时器,除了 TIM6 和 TIM7,其他定时器都有输入捕获功能。STM32 的输入捕获,简单的说就是通过检测 TIMx_CHx 上的边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定时器的值(TIMx_CNT)存放到对应的通道的捕获/比较寄存器(TIMx_CCRx)里面,完成一次捕获。同时还可以配置捕获时是否触发中断/DMA 等。
STM32 PWM工作过程:
在这里插入图片描述
STM32 输入捕获工作过程(通道1为例):
在这里插入图片描述
一句话总结工作过程:通过检测TIMx_CHx上的边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定时器的值(TIMx_CNT)存放到对应的捕获/比较寄存器(TIMx_CCRx)里面,完成一次捕获。

  • 步骤1:设置输入捕获滤波器(通道1为例)

在这里插入图片描述
在这里插入图片描述

  • 步骤2:设置输入捕获极性(通道1为例)

在这里插入图片描述在这里插入图片描述

  • 步骤三:设置输入捕获映射通道(通道1为例)
    在这里插入图片描述在这里插入图片描述
  • 步骤四:设置输入捕获分频器(通道1为例)

在这里插入图片描述在这里插入图片描述在这里插入图片描述

  • 步骤五:捕获到有效信号可以开启中断

在这里插入图片描述

  • 最后:看看定时器通道对应引脚TIM5为例

在这里插入图片描述
输入捕获通道初始化函数:

void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct);ypedef struct
{uint16_t TIM_Channel; //捕获通道1-4   uint16_t TIM_ICPolarity; //捕获极性uint16_t TIM_ICSelection; //映射关系uint16_t TIM_ICPrescaler; //分频系数uint16_t TIM_ICFilter;  //滤波器
} TIM_ICInitTypeDef;TIM5_ICInitStructure.TIM_Channel = TIM_Channel_1; //选择输入端 IC1 
TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获
TIM5_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到 TI1 上
TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频
TIM5_ICInitStructure.TIM_ICFilter = 0x00; //IC1F=0000 配置输入滤波器 不滤波
TIM_ICInit(TIM5, &TIM5_ICInitStructure); //初始化 TIM5 输入捕获通道 1

通道极性设置独立函数:

void TIM_OCxPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity)

获取通道捕获值

uint32_t TIM_GetCapture1(TIM_TypeDef* TIMx)

输入捕获的一般配置步骤:

1、初始化定时器和通道对应IO的时钟

  • 初始化IO口,模式为输入:
GPIO_Init();
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0 输入
  • 初始化定时器ARR,PSC
TIM_TimeBaseInit();

2、初始化输入捕获通道

TIM_ICInit();

3、如果要开启捕获中断

 TIM_ITConfig();NVIC_Init();

4、使能定时器:

TIM_Cmd();

5、编写中断服务函数:

TIMx_IRQHandler();

更新中断和捕获中断

u8  TIM5CH1_CAPTURE_STA=0;	//输入捕获状态		    				
u16	TIM5CH1_CAPTURE_VAL;	//输入捕获值//定时器5中断服务程序	 
void TIM5_IRQHandler(void)
{ if((TIM5CH1_CAPTURE_STA&0X80)==0)//还未成功捕获	{	  if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET){	    if(TIM5CH1_CAPTURE_STA&0X40)//已经捕获到高电平了{if((TIM5CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了{TIM5CH1_CAPTURE_STA|=0X80;//标记成功捕获了一次TIM5CH1_CAPTURE_VAL=0XFFFF;//计数器的最大值}else TIM5CH1_CAPTURE_STA++;//标记有几次更新事件}	 }if (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET)//捕获1发生捕获事件{	if(TIM5CH1_CAPTURE_STA&0X40)		//捕获到一个下降沿 		{	  			TIM5CH1_CAPTURE_STA|=0X80;		TIM5CH1_CAPTURE_VAL=TIM_GetCapture1(TIM5);//标记成功捕获到一次高电平脉宽TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获}else  								//还未开始,第一次捕获上升沿{TIM5CH1_CAPTURE_STA=0;			//清空TIM5CH1_CAPTURE_VAL=0;TIM_SetCounter(TIM5,0);TIM5CH1_CAPTURE_STA|=0X40;		//标记捕获到了上升沿TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling);		//CC1P=1 设置为下降沿捕获}		    }			     	    					   }TIM_ClearITPendingBit(TIM5, TIM_IT_CC1|TIM_IT_Update); //清除中断标志位}

main.c部分代码:

#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "timer.h"extern u8  TIM5CH1_CAPTURE_STA;		//输入捕获状态		    				
extern u16	TIM5CH1_CAPTURE_VAL;	//输入捕获值	int main(void){		u32 temp=0; delay_init();	    	 //延时函数初始化	  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);	 //设置NVIC中断分组2:2位抢占优先级,2位响应优先级uart_init(115200);	 //串口初始化为115200LED_Init();			     //LED端口初始化TIM3_PWM_Init(899,0); 		//不分频。PWM频率=72000/(899+1)=80KhzTIM5_Cap_Init(0XFFFF,72-1);	//以1Mhz的频率计数 while(1){delay_ms(10);TIM_SetCompare2(TIM3,TIM_GetCapture2(TIM3)+1);if(TIM_GetCapture2(TIM3)==300)TIM_SetCompare2(TIM3,0);	if(TIM5CH1_CAPTURE_STA&0X80)//成功捕获到了一次上升沿{temp=TIM5CH1_CAPTURE_STA&0X3F;temp*=65536;//溢出时间总和temp+=TIM5CH1_CAPTURE_VAL;//得到总的高电平时间printf("HIGH:%d us\r\n",temp);//打印总的高点平时间TIM5CH1_CAPTURE_STA=0;//开启下一次捕获}}}

看中断部分代码时建议从下向上看,从else向上看,最开始初始化设置的就是上升沿捕获,所以先执行最后一个else然后再进行下降沿的捕获进入if语句,从而完成了一次高电平脉宽的测量,若脉宽比较长在计时器溢出后还没有变为低电平,则在判断是否发生更新事件,若发生,则执行TIM5CH1_CAPTURE_STA++,记录溢出的次数,最大为2的6次方,若TIM5CH1_CAPTURE_STA&0x3f==0x3f,说明已达到TIM5CH1_CAPTURE_STA所能记录的最大溢出次数,所以就结束捕获,然后就会进入main函数进行计算高电平的脉宽。

(以上是个人理解,若有错误请指正)

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

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

相关文章

Linux查看内置命令和非内置命令帮助的几种方法(man、help、info)

❤️作者主页:IT技术分享社区 ❤️作者简介:大家好,我是IT技术分享社区的博主,从事C#、Java开发九年,对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️个人荣誉: 数据库领域优质创作者🏆&#x…

电容触摸按键 实验

RC充放电电路原理: RC电路充放电公式: Vt V0(V1-V0)* [1-exp(-t/RC)]V0 为电容上的初始电压值; V1 为电容最终可充到或放到的电压值; Vt 为t时刻电容上的电压值。如果V0为0,也就是从0V开始充…

tomcat调优方案Maximum number of threads (200) created for connector with address null and port 8091...

1.tomcat6大并发出现:INFO: Maximum number of threads (200) created for connector with address null and port 8091 说明:最大线程数错误 解决方案:使用线程池,用较少的线程处理较多的访问,可以提高tomcat处理请…

SFTP是什么?与FTP之间有什么区别

什么是SFTP? SFTP是一种安全的文件传输协议,一种通过网络传输文件的安全方法;它确保使用私有和安全的数据流来安全地传输数据。 SFTP要求客户端用户必须由服务器进行身份验证,并且数据传输必须通过安全通道(SSH&#x…

C++基础( C++初识、数据类型、运算符、程序流程结构、)

前言&#xff1a; C专栏笔记来源于观看视频笔记 配套视频&#xff1a; https://www.bilibili.com/video/BV1et411b73Z?p16 基本代码框架&#xff1a; #include <iostream> using namespace std; int main() {system("pause");//等待程序return 0; }输出Hell…

C#判断某天是否是周末或者节假日示例

/// <summary> /// 判断是不是周末/节假日 /// </summary> /// <param name"date">日期</param> /// <returns>周末和节假日返回true&#xff0c;工作日返回false</returns> public static async Task<bool> IsHolidayByD…

查看docker版本命令docker version

查看docker版本 docker version

spring security原理

spring security通过一系列过滤器实现其功能&#xff0c;入口过滤器如下&#xff08;web.xml&#xff09;&#xff1a; <filter> <filter-name>springSecurityFilterChain</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilt…

程序员太牛了 公司年会整成代码讨论会

作者丨前端小乔 https://blog.csdn.net/weixin_44330260/article/details/86478512 公司年底年会&#xff0c;被程序员开成代码讨论大会&#xff0c;是一种什么样的体验&#xff01;最近某公司举行了一场年会&#xff0c;本来热热闹闹&#xff0c;结果被程序员给搅煳了&#xf…

嵌入式C语言基础(一)

嵌入式C语言基础&#xff1a; system函数&#xff1a;功能是运行windows命令 #include <stdio.h> #include <stdlib.h> int main() {//main是程序的入口&#xff0c;操作系统运行程序先找mainsystem("ipconfig");//在windows下ipconfig查看本地的网络状…

docker info 显示 Docker 系统信息

docker info : 显示 Docker 系统信息&#xff0c;包括镜像和容器数

Syncd - 开源自动化部署工具

官网地址&#xff1a;https://gitee.com/dreamans/syncd/issues syncd是一款开源的代码部署工具&#xff0c;它具有简单、高效、易用等特点&#xff0c;可以提高团队的工作效率. 目前只支持类Linux系统. 特性 Go语言开发&#xff0c;编译简单、运行高效 Web界面访问&#xff0…

Linus中帮助命令man

使用方法&#xff1a;man 可以查看想要使用命令的详细使用方法 man 命令

大牛是怎么思考设计SQL优化方案的?

作者&#xff1a;惨绿少年https://www.cnblogs.com/clsn/p/8214048.html在进行MySQL的优化之前&#xff0c;必须要了解的就是MySQL的查询过程&#xff0c;很多查询优化工作实际上就是遵循一些原则&#xff0c;让MySQL的优化器能够按照预想的合理方式运行而已。图-MySQL查询过程…

用 Git 和 Github 提高效率的 10 个技巧!

Git 和 GitHub 都是非常强大的工具。即使你已经使用他们很长时间&#xff0c;你也很有可能不知道每个细节。我整理了 Git 和 GitHub 可能提高日常效率的10个常用技巧。GitHub1、快捷键: t 和 w在你的源码浏览页面&#xff0c;按 t 可以快速进入模糊文件名搜索模式&#xff1a;在…

docker显示镜像的摘要信息

显示镜像的摘要信息 docker images --digests

docker搜索镜像

docker search 要下载的 OFFICIAL 为ok的表示是官方镜像

C#操作HttpClient工具类库

using System; using System.Collections.Generic; using System.Net.Http; using System.Windows.Forms; using System.Configuration; using System.IO; using Newtonsoft.Json; namespace Dcflow { public class HttpHelper { //获取Configuration对象 public static string…