根据定时器的计数频率,我们就可以算出t1-t2的时间,从而得到高电平脉宽

计算公式

N * ARR + CCRx2

首先设置定时器通道为上升沿捕获,这样在t1时刻,就会捕获到当前的CNT值,然后立即清零CNT,并设置定时器通道为下降沿捕获,这样到t2时刻,又会发生捕获事件,得到此时的CNT值,记为CCRx2

输入捕获配置步骤

1.使能定时器时钟

2.使能GPIO时钟,配置引脚模式

3.初始化定时器参数,预分频器的值、自动重装载的值等设定

4.设置通用定时器的输入捕获参数,开启输入捕获功能

5.开启捕获和定时器溢出中断

6.初始化NVIC外设,设置定时器中断优先级

7.使能定时器

8.编写定时器中断处理函数

举例

typedef struct
{
uint16_t TIM_Channel; //通道
uint16_t TIM_ICPolarity; //捕获极性
uint16_t TIM_ICSelection; //直接/间接映射
uint16_t TIM_ICPrescaler; //分频因子
uint16_t TIM_ICFilter; //滤波
} TIM_ICInitTypeDef; #define ICPolarity_Rising 0x40
#define ICPolarity_Falling 0x80
#define Capture1_Max 0x3f void TIM5_IRQHandler()
{
if(TIM_GetITStatus(TIM5, TIM_IT_Update) == SET) //产生更新中断
{
if((TIM_sta & ICPolarity_Falling) == ICPolarity_Falling) //低电平捕获中
{
if((TIM_sta & Capture1_Max) == Capture1_Max) //达到计数值上限
{
TIM_sta = ICPolarity_Falling;
}
else
{
TIM_sta++; //更新次数
}
}
} if(TIM_GetITStatus(TIM5, TIM_IT_CC1) == SET)
{
if((TIM_sta & ICPolarity_Falling) == ICPolarity_Falling) //捕获到低电平
{
TIM_sta |= ICPolarity_Rising;
Capture1_val = TIM_GetCapture1(TIM5); //保存捕获值
TIM_OC1PolarityConfig(TIM5, TIM_ICPolarity_Rising); //设置上升沿捕获
}
else
{
TIM_sta = ICPolarity_Falling;
TIM_Cmd(TIM5, DISABLE);
TIM_OC1PolarityConfig(TIM5, TIM_ICPolarity_Falling); //设置下降沿捕获
TIM_SetCounter(TIM5, 0); //计数器值清零
TIM_Cmd(TIM5, ENABLE);
}
} TIM_ClearITPendingBit(TIM5, TIM_IT_Update | TIM_IT_CC1);
} void KEY_TIM5_init(u16 period, u16 prescaler)
{
TIM_TimeBaseInitTypeDef tim_tb = {0};
TIM_ICInitTypeDef tim_ic =
{
TIM_Channel_1, //通道1
TIM_ICPolarity_Rising, //上升沿
TIM_ICSelection_DirectTI, //直接映射
TIM_ICPSC_DIV1, //1分频
0
};
NVIC_InitTypeDef nvic =
{
TIM5_IRQn,
2,
2,
ENABLE
};
GPIO_InitTypeDef gpio =
{
GPIO_Pin_0,
GPIO_Speed_50MHz,
GPIO_Mode_IPD //下拉输入模式
}; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); //使能定时器时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_Init(GPIOA, &gpio); tim_tb.TIM_Prescaler = prescaler;
tim_tb.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
tim_tb.TIM_Period = period;
tim_tb.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM5, &tim_tb); //初始化定时器 TIM_ICInit(TIM5, &tim_ic); //设置通用定时器的输入捕获参数 TIM_ITConfig(TIM5, TIM_IT_Update | TIM_IT_CC1, ENABLE); //开启捕获和定时器溢出中断 NVIC_Init(&nvic); //初始化NVIC TIM_Cmd(TIM5, ENABLE); //使能定时器
} int main(void)
{
KEY_TIM5_init(0xffff, 72 - 1);
while(1)
{
if((TIM_sta & ICPolarity_Rising) == ICPolarity_Rising) //捕获到低电平
{
res_data = TIM_sta & Capture1_Max;
res_data *= 0xffff;
res_data += Capture1_val;
printf("高电平持续时间 %d um.\n", res_data);
TIM_sta = 0;
}
}
}

stm32 输入捕获的更多相关文章

  1. STM32输入捕获模式设置并用DMA接收数据

    参考: STM32的PWM输入模式设置并用DMA接收数据 Input capture mode The input stage samples the corresponding TIx input ...

  2. STM32 输入捕获配置

    在STM32 的定时器,除了 TIM6 和 TIM7,就是通过检测 TIMx_CHx 上的 边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候, 将当时定时器 的值(TIMx_CNT) 存放到对 ...

  3. [置顶] STM32 输入捕获的脉冲宽度及频率计算

    输入捕获模式可以用来测量脉冲宽度或者测量频率.STM32 的定时器,除了 TIM6 和 TIM7,其他定时器都有输入捕获功能.以下是对脉冲宽度及频率的计算. 1.脉冲宽度 如下图所示,采集该高电平脉冲 ...

  4. stm32 输入捕获学习(二)

    (本文参考STM32  开发指南 V1.3   -- ALIENTEK 战舰 STM32 开发板库函数教程 ) 1. 实验设计 我们用 TIM5 的通道 1(PA0)来做输入捕获,捕获 PA0 上高电 ...

  5. stm32 输入捕获学习(一)

    输入捕获模式可以用来测量脉冲宽度或者测量频率.STM32 的定时器,除了 TIM6 和 TIM7,其他定时器都有输入捕获功能.STM32 的输入捕获,简单地说就是通过检测 TIMx_CHx 上的边沿信 ...

  6. STM32——输入捕获实验原理及配置步骤

    输入捕获实验原理及配置步骤 一.输入捕获概念 STM32的输入捕获,简单的说就是通过检测 TIMx_CHx (定时器X的通道X)上的 边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定 ...

  7. STM32 输入捕获的脉冲宽度及频率计算

    输入捕获模式可以用来测量脉冲宽度或者测量频率.STM32 的定时器,除了 TIM6 和 TIM7,其他定时器都有输入捕获功能.以下是对脉冲宽度及频率的计算. 1.脉冲宽度 如下图所示,采集该高电平脉冲 ...

  8. STM32输入捕获TIM2四通道

    相比于一通道,原子的例程里因为清了计数时间,所以要对程序进行修改. 记录上升沿后的计数,然后记录下降沿的计数.相减后计算高电平时间,对于定时器中断间隔的边界要分开处理. 这里因为我的接收机时间是1ms ...

  9. STM32之输入捕获以及小小应用(库)

    五一之际,先祝大家五一快乐.其实快乐很简单,工作的人有假放,学习的人也有假放,像我,有假放才有更多的时间学自己想学的东西.51假期学51,可惜没有32假期呀.好了..言归正传,大家听过吸星大法吧..在 ...

随机推荐

  1. ubuntu server 18.04 有线网卡默认关闭,需要手工配置才能使用的方法

    1.安装完ubuntu server 18.04 后,笔记本电脑的有线网卡已经识别了,但是没有ip, 并且插上网线后端口灯不亮. 解决方法: 第一步.配置端口链路状态为 up # ip link se ...

  2. C++线程互斥、同步

     一.线程互斥 如果多个线程需要访问且可能修改同一个变量,那么需要加锁,保证同一时刻只有一个线程可以访问,这个动作即最小“原子操作” 方式1: 使用c++提供的类mutex,lock,unlock即可 ...

  3. Dubbo -- 关于 api接口调用不使用强依赖

    首先,我们都知道  Dubbo 调用api 需要提供暴露  接口,   消费端才通过 ZK 可以调用 通常我们都会使用 提供 api  jar包 的方式 使用  这样既方便又快捷 简单 只需要在spr ...

  4. ideal配置使用Git

    1.git简介 git是目前流行的分布式版本管理系统.它拥有两套版本库,本地库和远程库,在不进行合并和删除之类的操作时这两套版本库互不影响.也因此其近乎所有的操作都是本地执行,所以在断网的情况下任然可 ...

  5. 使用wsimport生成webservice客户端代码

    服务端 package com.xc.webservice; import javax.jws.WebService; import javax.xml.ws.Endpoint; @WebServic ...

  6. ElasticSearch——路由(_routing)机制

    前言 一条数据是如何落地到对应的shard上的? 当索引一个文档的时候,文档会被存储到一个主分片中. Elasticsearch 如何知道一个文档应该存放到哪个分片中呢? 首先这肯定不会是随机的,否则 ...

  7. Mac 高效 软件

    彻底卸载软件: cleanmymac 软件转移: AppDelete,选择一个软件归档,换台电脑从归档安装 finder类chrme标签页: XtraFinder

  8. PostgreSQL学习笔记——摘要

    因为PostgreSQL和MySQL.DB2等数据库均遵循SQL语法,所以这篇随笔仅记录一些PostgreSQL中和别的数据库有差别或之前学习中遗漏的地方,以及一些我觉得比较重点的地方. 通过psql ...

  9. 第二十四章 在线会话管理——《跟我学Shiro》

    目录贴:跟我学Shiro目录贴 有时候需要显示当前在线人数.当前在线用户,有时候可能需要强制某个用户下线等:此时就需要获取相应的在线用户并进行一些操作. 本章基于<第十六章 综合实例>代码 ...

  10. tomcat 是如何做到不同webapp 类隔离的

    这个问题的核心是classloader 上图中 启动类加载器,扩展类加载器,应用程序类加载器是 jvm 自带的类加载器. comm  catalina  shared webapp 是tomcat 扩 ...