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假期呀.好了..言归正传,大家听过吸星大法吧..在 ...
随机推荐
- sudo内容
[root@bogon ~]# cat /etc/sudoers## Sudoers allows particular users to run various commands as## the ...
- Java点滴-List<Integer> list; 中尖括号的意思
这是jdk1.5后版本才有的新特性,泛型,指定传入的类型.这样定义之后,这个list只能接收Integer的对象. 以前没有加这个,传入的都是Object类型的,取出来的时候要强制类型转换为自己想要的 ...
- css 命名规范参考[转]
命名空间 另外最好的实践就是当命名你的类名的时候,使用命名空间前缀来进行分类.这些前缀会在你的命名前添加一组字符,但是这个值能立刻标记每一个类的目的,在你看 HTML 或者样式的时候是很需要的.我使用 ...
- Javascript的原型链与继承
目录 1. ES5最经典的寄生组合式继承图 2. ES5和ES6的继承 Javascript语言的继承机制,它没有"子类"和"父类"的概念,也没有"类 ...
- DefaultListBeanFactory的子类之SimpleAliasRegistry
DefaultListBeanFactory类结构层次图 从继承图看,SimpleAliasRegistry是DefaultListBeanFactory继承类中最底层的实现类. SimpleAlia ...
- 帝国cms 批量替换语句
UPDATE www_92game_net_cnys_ecms_caipu SET titlepic=REPLACE(titlepic,'http://file.92game.net', '') ; ...
- 【Docker】:docker安装ELK(logstash,elasticsearch,kibana)
一:安装logstash 1.拉取镜像 docker pull logstash:5.6.11 2.创建目录 mkdir /docker/logstash cd /docker/logstash 3. ...
- C++基础--函数重载
函数重载定义: 在相同的作用域中具有相同的函数名而函数形参列表(参数类型.参数个数.参数顺序)不同的两个函数,称之为函数重载.注意:函数返回值类型并不是重载的条件. 函数重载优点: 可以使用相同的函数 ...
- 剑指offer36:两个链表的第一个公共结点
1 题目描述 输入两个链表,找出它们的第一个公共结点. 2 思路和方法 方法一: 用两个指针同时从两个链表的表头开始走,当走到自己的链表结尾的时候开始从另一个链表的表头开始向后走.终止条件就是两个指针 ...
- Counting Cliques(HDU-5952)【DFS】
题目链接:https://vjudge.net/problem/HDU-5952 题意:有一张无向图,求结点数量为S的团的数量. 思路:如果不加一点处理直接用DFS必然会超时,因为在搜索过程中会出现遍 ...