STM32——输入捕获实验

一、通用定时器输入捕获概述

STM32 PWM工作过程

STM32输入捕获工作过程(通道1为例)

通过检测TIMx_CHx上的边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定时器的值(TIMx_CNT)存放到对应的捕获/比较寄存器(TIMx_CCRx)里面,完成一次捕获。

1、设置输入捕获滤波器(通道1为例)

假设IC1F[3:0]=0011,并设置IC1映射到通道1上,且为上升沿触发,那么在捕获到上升沿的时候再以fDTS的频率连续采样到8次通道1的电平,如果都是高电平,则说明是一个有效触发,就会触发输入捕获中断,这样就可以滤除掉那些高电平脉宽低于8个采样周期的脉冲信号,从而达到滤波的效果。如果不做滤波处理,则设置IC1F[3:0]=0000,只要采集到上升沿就触发捕获。

2、设置输入捕获极性(通道1为例)

假设设置为上升沿,当边沿检测器检测到上升沿时就会捕获。

CC1通道配置为输出:

0:OC1高电平有效                                                              1:OC1低电平有效

CC1通道配置为输入:(选择IC1还是IC1的反相信号作为触发或捕获信号)

0:不反相:捕获发生在IC1的上升沿:当用作外部触发器时,IC1反相。

1:反相:捕获发生在IC1的下降沿:当用作外部触发器时,IC1反相。

3、设置输入捕获映射通道(通道1为例)

IC1可以映射到TI1上也可以映射到TI2上;IC2可以映射到TI2上也可以映射到TI1上。

4、设置输入捕获分频器(通道1为例)

1分频:一个上升沿触发一次捕获

2分频:每2个事件触发一次捕获(每检测到两个上升沿才会捕获一下)

4分频:每4个事件触发一次捕获

8分频:每8个事件触发一次捕获

触发捕获就是将计数器的值装载到捕获寄存器里面

5、捕获到有效信号可以开启中断

比如上升沿捕获并且不分频,那么每捕获到一个上升沿就触发一个捕获,同时如果开启了捕获中断,就会触发中断。

即:先滤波,再判断上升沿还是下降沿,再映射最后分频选择中断事件何时发生

二、库函数配置输入捕获

输入捕获通道初始化函数:

void TIM_ICInit (TIM_TypeDef* TIMx , TIM_ICInitTypeDef* TIM_ICInitStruct);

typedef struct
{
  uint16_t TIM_Channel;//捕获通道1-4
  uint16_t TIM_ICPolarity;//捕获极性
  uint16_t TIM_ICSelection;//映射关系
  uint16_t TIM_ICPrescaler;//分频系数
  uint16_t TIM_ICFilter;//滤波器
} TIM_ICInitTypeDef;

TIM5_ICInitABC.TIM_Channel=TIM_Channel_1;
TIM5_ICInitABC.TIM_ICPolarity=TIM_ICPolarity_Rising;
TIM5_ICInitABC.TIM_INSelection=TIM_ICSelection_DirectTI;
TIM5_ICInitABC.TIM_ICPrescaler=TIM_ICPSC_DIV1;
TIM5_ICInitABC.TIM_ICFilter=0x00;
TIM_ICInit(TIM5,&TIM5_ICInitABC);

通道极性设置独立函数:

void TIM_OCxPolarityConfig(TIM_TypeDef* TIMx , uint16_t TIM_OCPolarity);

获取通道捕获值:

uint32_t TIM_GetCapture1(TIM_TypeDef* TIMx);

三、输入捕获的一般配置步骤:

1、初始化定时器和通道对应IO时钟。

2、初始化IO口,模式为复用: GPIO_Init();

3、设置引脚复用映射:GPIO_PinAFConfig();

4、初始化定时器ARR、PSC:TIM_TimeBaseInit();

5、初始化输入捕获通道:TIM_ICInit();

6、开启捕获中断:TIM_ITConfig();  NVIC_init();

7、使能定时器:TIM_Cmd();

8、编写中断服务函数:TIMx_IRQHandler();

实验目的:测量信号的脉冲宽度

测量原理:TIM5_Cap_Init函数执行的时候就设置好了,然后等待上升沿中断到来,当捕获到上升沿中断,此时如果TIM5CH1_CAPTURE_STA的第6位为0,则表示还没有捕获到新的上升沿,就先把TIM5CH1_CAPTURE_STA、TIM5CH1_CAPTURE_VAL和TIM5->CNT等清零,然后再设置TIM5CH1_CAPTURE_STA的第6位为1,标记捕获到高电平,最后设置为下降沿捕获,等待下降沿到来。如果等待下降沿到来期间,定时器发生了溢出,就在TIM5CH1_CAPTURE_STA里面对溢出时间进行计数,当最大溢出时间到来的时候,就强制标记捕获完成(此时还没有捕获到下降沿)。当下降沿到来的时候,先设置TIM5CH1_CAPTURE_STA的第7位为1,标记成功捕获一次高电平,然后读取此时定时器的值到TIM5C1_CAPTURE_VAL里面,最后设置为上升沿捕获,回到初始状态。只要TIM5CH1_CAPTURE_STA的第7位一直为1,那么就不会进行第二次捕获。

输入捕获实验

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值