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假期呀.好了..言归正传,大家听过吸星大法吧..在 ...
随机推荐
- osg Shader 着色器
#ifdef _WIN32 #include <Windows.h> #endif // _WIN32 #include <osg/Group> #include <os ...
- spring-core-5.0.6.RELEASE-sources.jar中java源代码不全
笔者最近在调试一段代码,进入spring-core以后,IDEA帮我反编译出源码,其中MethodProxy.java如下 // // Source code recreated from a .cl ...
- shutter 安装和设置快捷键
1. 打开系统设置 2. 打开 Keyboard 键盘设置 3. 添加成功的状态 4. 单击右侧 Disabled,然后快速按下 Ctrl+Alt+A 如下图 5. Ctrl+Alt+A 测试OK. ...
- 无法连接App Store
试了很多网上的方法,都没有效果,最后把hosts文件清空了,就可以了,不知道是为啥,同一份hosts文件在屋里能用,公司就不能用.
- Docker 容器的运行(八)
目录 一.运行容器 1.运行第一个容器 2.让容器长期运行 二.进入容器 1.attach 2.exec 3.attach VS exec 4.容器内部都在干些什么 三.停止/启动/重启容器 四.暂停 ...
- 安装android sdk,后出现导出错误,提示命令行找不到解决方案
The steps. Rename android sdk tool folder : [Your Android SDK root]/tools -> toolsXXXX Download S ...
- 二十四 java 多线程一些知识点
1:blocked线程和waiting的线程的区别? 如何唤醒? java线程中含有waiting与blocked两种状态: 线程的 blocked状态往往是无法进入同步方法/代码块来完成的(BLOC ...
- OpenGL学习笔记 之一 (基本的图形绘制)
参考网址:http://www.cnblogs.com/FredCong/archive/2012/10/13/2722893.html #include <glut.h> #includ ...
- TCP使用
TCP使用注意事项总结 目录 发送或者接受数据过程中对端可能发生的情况汇总 本端TCP发送数据时对端进程已经崩溃 本端TCP发送数据时对端主机已经崩溃 本端TCP发送数据时对端主机已经关机 某个连 ...
- Codis的安装配置
codis是分布式redis解决方案 centos系统下安装codis需要安装相关的依赖,将图中的依赖上传至centos系统中 依次进行安装: 一.go环境的安装配置 解压到install目录下: . ...