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假期呀.好了..言归正传,大家听过吸星大法吧..在 ...
随机推荐
- 33Flutter仿京东商城项目 登录 注册相关页面布局
加群452892873 下载对应33课文件,运行方法,建好项目,直接替换lib目录 以下列出的是本课涉及的文件. User.dart import 'package:flutter/material. ...
- css简单学习属性3---css属性选择器
1:通配符 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- SpringMVC+Ajax实现文件批量上传和下载功能实例代码
需求: 文件批量上传,支持断点续传. 文件批量下载,支持断点续传. 使用JS能够实现批量下载,能够提供接口从指定url中下载文件并保存在本地指定路径中. 服务器不需要打包. 支持大文件断点下载.比如下 ...
- PAT 甲级 1051 Pop Sequence (25 分)(模拟栈,较简单)
1051 Pop Sequence (25 分) Given a stack which can keep M numbers at most. Push N numbers in the ord ...
- nginx conf 文件
server { listen ; server_name local.light.com; index index.html index.htm index.php; root /home/wwwr ...
- iOS从App跳转至系统设置菜单各功能项
跳到系统设置里的WiFi界面 info里面设置: 在项目中的info.plist中添加 URL types 并设置一项URL Schemes为prefs,如下图 代码: 复制代码 代码如下: NSUR ...
- Egret入门学习日记 --- 第十篇(书中 2.9~2.13节 内容)
第十篇(书中 2.9~2.13节 内容) 好的 2.9节 开始! 总结一下重点: 1.之前通过 ImageLoader 类加载图片的方式,改成了 RES.getResByUrl 的方式. 跟着做: 重 ...
- excel自学笔记 from av50264533
1.函数公式 MINUTE(serial_number) 函数解读 Serial_number 表示一个时间值,其中包含要查找的分钟 函数公式 NOW() 函数解读 显示出现在的时间 计算通话时 ...
- C语言 班级档案管理系统实现
代码地址:github地址 班级档案管理系统 原题目要求是对一个有N个学生的班级,通过该系统实现对该班级学生的基本信息进行录入. 显示.修改.删除.保存等操作的管理. 由于个人需要,我单独将项目改造为 ...
- leetcode903 Valid Permutations for DI Sequence
思路: dp[i][j]表示到第i + 1个位置为止,并且以剩下的所有数字中第j + 1小的数字为结尾所有的合法序列数. 实现: class Solution { public: int numPer ...