一、通用定时器输入捕获概述
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,那么就不会进行第二次捕获。
输入捕获实验