stm32 输入捕获
根据定时器的计数频率,我们就可以算出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 输入捕获的更多相关文章
- STM32输入捕获模式设置并用DMA接收数据
参考: STM32的PWM输入模式设置并用DMA接收数据 Input capture mode The input stage samples the corresponding TIx input ...
- STM32 输入捕获配置
在STM32 的定时器,除了 TIM6 和 TIM7,就是通过检测 TIMx_CHx 上的 边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候, 将当时定时器 的值(TIMx_CNT) 存放到对 ...
- [置顶]
STM32 输入捕获的脉冲宽度及频率计算
输入捕获模式可以用来测量脉冲宽度或者测量频率.STM32 的定时器,除了 TIM6 和 TIM7,其他定时器都有输入捕获功能.以下是对脉冲宽度及频率的计算. 1.脉冲宽度 如下图所示,采集该高电平脉冲 ...
- stm32 输入捕获学习(二)
(本文参考STM32 开发指南 V1.3 -- ALIENTEK 战舰 STM32 开发板库函数教程 ) 1. 实验设计 我们用 TIM5 的通道 1(PA0)来做输入捕获,捕获 PA0 上高电 ...
- stm32 输入捕获学习(一)
输入捕获模式可以用来测量脉冲宽度或者测量频率.STM32 的定时器,除了 TIM6 和 TIM7,其他定时器都有输入捕获功能.STM32 的输入捕获,简单地说就是通过检测 TIMx_CHx 上的边沿信 ...
- STM32——输入捕获实验原理及配置步骤
输入捕获实验原理及配置步骤 一.输入捕获概念 STM32的输入捕获,简单的说就是通过检测 TIMx_CHx (定时器X的通道X)上的 边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定 ...
- STM32 输入捕获的脉冲宽度及频率计算
输入捕获模式可以用来测量脉冲宽度或者测量频率.STM32 的定时器,除了 TIM6 和 TIM7,其他定时器都有输入捕获功能.以下是对脉冲宽度及频率的计算. 1.脉冲宽度 如下图所示,采集该高电平脉冲 ...
- STM32输入捕获TIM2四通道
相比于一通道,原子的例程里因为清了计数时间,所以要对程序进行修改. 记录上升沿后的计数,然后记录下降沿的计数.相减后计算高电平时间,对于定时器中断间隔的边界要分开处理. 这里因为我的接收机时间是1ms ...
- STM32之输入捕获以及小小应用(库)
五一之际,先祝大家五一快乐.其实快乐很简单,工作的人有假放,学习的人也有假放,像我,有假放才有更多的时间学自己想学的东西.51假期学51,可惜没有32假期呀.好了..言归正传,大家听过吸星大法吧..在 ...
随机推荐
- windows下打开binlog
上篇我们介绍了binlog(参见mysql的binlog),配置文件用的是linux下的my.cnf,那么在windows下如何打开binlog呢?道理是相同的,配置文件是不一样的.在windows下 ...
- 阶段5 3.微服务项目【学成在线】_day18 用户授权_15-细粒度授权-我的课程细粒度授权-实现
先定义接口 实现接口 service 需要通过conpanyId去查询课程的列表 定义dao 要查课程的图片 名称 等相关信息.所以使用Mybatis来实现 定义Mapper 看这个dao里面方法在哪 ...
- ABAP编辑器输入中文变成问号
在ABAP编辑器里输入汉字,点击空格后显示问号? 中英文环境下编辑都出现乱码 实用程序->设置 ->基于文本的编辑器 如果用老式编辑器,可以输入中文 试试打个补丁 GUI740 补丁17 ...
- Ehcache开启JMX支持
Ehcache提供了基于JMX的监控支持,支持对以下几类信息的监控. CacheManager Cache CacheConfiguration CacheStatistics 按照JMX的规范,为了 ...
- ufile开公钥私钥
https://docs.ucloud.cn/storage_cdn/ufile/guide/token登陆UCloud官方控制台,进入UFile—令牌管理
- jquery入口函数的测试
/*编写一个自定义的jquery框架*/ (function (window,undefined) { var njquery=function (selector ,) { return new j ...
- Alt+~,Alt+Tab
Alt+~可以很方便的切换同一个软件中的内容. Alt+Tab可以很方便的切换不同软件之间的内容. 熟练使用,很方便.
- fiddler手机抓包1
1.手机抓包配置教程:https://www.jianshu.com/p/724097741bdf 2.
- 基于聚类K-Means方法实现图像分割
”“”K-Means to realize Image segmentation “”“ import numpy as np import PIL.Image as image from sklea ...
- Python之字符与编码笔记
概述 类型 str 字符串 bytes 字节 bytearray 字节数组 字符串编码架构 字符集:赋值一个编码到某个字符,以便在内存中表示 编码 Ecoding:转换字符到原始字节形式 解码 Dec ...