输入捕获的应用
输入捕获一般是用来测量输入信号的频率,占空比这些信息。
输入捕获的原理
捕获的原理:
1、信号从某个通道输入,比如通道1(CH1);
2、经过滤波和边沿检测后产生两个一模一样的信号TI1FP1和TI1FP2,TI1FP1送给捕获通道IC1,TI1FP2送给捕获通道IC2;
3、定时器设置为复位模式,将TI1FP1作为复位触发信号,将捕获通道IC1设置为上升沿触发,这样每当TI1FP1上升沿到来的时候,就将定时器复位;
4、当首次检测到TI1FP1的上升沿,定时器复位,计数器CNT的值为0;
5、IC2设置为下降沿触发,当TI1FP2的下降沿到来时,CCR2记录CNT寄存器此时的值X;
6、当IC1再次检测到TI1FP1上升沿的时候,CCR1记录CNT此时CNT寄存器的值Y;
这个X是不是可以理解为高电平持续的时间,这个Y是不是可以理解为整个信号的周期,X/Y就是信号的占空比了。
基本思想就是让两个捕获通道来检测同一个信号,捕获通道IC1检测信号的上升沿,捕获通道IC2检测信号的下降沿,第一个上升沿来复位定时器,第二个上升沿来记录信号的周期值,下降沿就是
使用STM32CubeMX配置,用TIM3的CH1通道来捕获
用定时器2来产生一个频率1000Hz,占空比为50%的周期信号作为信号源,让TIM3来捕获
extern uint16_t CCR1_Cnt;
extern uint16_t CCR2_Cnt;
extern float duty;
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
{
CCR1_Cnt = HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_1);
duty = (float)(CCR2_Cnt+1) / (CCR1_Cnt+1);
}
if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
{
CCR2_Cnt = HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_2);
}
}
main函数中开启输入捕获
HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_1);
HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_2);
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
while (1)
{
printf("Frequency = %d \r\n",(uint16_t)(CCR1_Cnt+1));
printf("Duty = %.2f \r\n",duty*100);
HAL_Delay(1000);
}
完整的工程代码在链接
STM32定时器输入捕获资源-CSDN文库