STM8SF903K3T6定时器1输入捕获
简介
最近接了个转速仪的项目,原理是计频率。最开始是用外部中断,然后根据定时器定时一秒来取值,转速是rpm,所以还要乘以60.
因为需要反映快所以后来改用定时捕捉。采用TIM1的通道一PC1来捕捉。
代码流程
1.开启系统时钟(可以选择内部或者外部)
void CLK_Configuration(void)
{CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); //HSI = 16M (1分频)
}
2.开启定时器设置,开启溢出中断,是因为在捕获两个信号时,时间大于定时器最大计数时间,算出溢出时间。
void TIM1_CAP_Configuration(void)
{TIM1_DeInit();//分频系数(15+1) 向上计数 最大计数值65535TIM1_TimeBaseInit(15, TIM1_COUNTERMODE_UP, 65535, 0);//捕获通道1 下降沿 选择TI1 不滤波TIM1_ICInit(TIM1_CHANNEL_1, TIM1_ICPOLARITY_FALLING, TIM1_ICSELECTION_DIRECTTI,TIM1_ICPSC_DIV1, 0x00);//使能输入捕获通道一中断请求,更新中断TIM1_ITConfig( TIM1_IT_CC1, ENABLE);TIM1_ITConfig( TIM1_IT_UPDATE, ENABLE); //加入更新中断是因为要加入溢出计数。//清除输入捕获通道一中断标志位。更新中断标志位。TIM1_ClearFlag(TIM1_FLAG_CC1);TIM1_ClearFlag(TIM1_FLAG_UPDATE);//开启定时器TIM1_Cmd(ENABLE);
}
3.中断函数设置。
//更新中断
INTERRUPT_HANDLER(TIM1_UPD_OVF_TRG_BRK_IRQHandler, 11)
{if(TIM1_GetFlagStatus(TIM1_FLAG_UPDATE) != RESET && Start_Count_Flag){if(TIM1CH1_CAPTURE_STA==0xff) //计数溢出{loop = 0; //重新捕获TIM1CH1_CAPTURE_STA = 0; //状态清0}else{TIM1CH1_CAPTURE_STA++;}}TIM1_ClearITPendingBit( TIM1_IT_UPDATE ); //清除溢出中断标志位TIM1_ClearFlag( TIM1_FLAG_UPDATE ); //清除溢出标志位
}
//输入捕获中断
INTERRUPT_HANDLER(TIM1_CAP_COM_IRQHandler, 12)
{//TIM1_FLAG_CC1通道一捕捉信号通道位。if(TIM1_GetFlagStatus(TIM1_FLAG_CC1) != RESET && Start_Count_Flag){//为了能检测每一个波形的周期,加入了以下检测方法。switch(loop){case 0: //开启捕获后第一个信号TIM1_SetCounter(0); //计数器清0loop = 1;break;case 1: //下一个信号TIM1CH1_CAPTURE_VAL = TIM1_GetCapture1(); //读取计数值TIM1_SetCounter(0); //计数器清0TIM1CH1_CAPTURE_SUCCEED = 1; //捕获成功temp=TIM1CH1_CAPTURE_STA&0xff; //读取数据temp*=65536; //溢出时间总和 temp+=TIM1CH1_CAPTURE_VAL; //加上计数器时间TIM1CH1_CAPTURE_STA=0; //溢出计数清0break;default :loop = 0;break;}}TIM1_ClearITPendingBit( TIM1_IT_CC1 ); //清除更新中断标志位TIM1_ClearFlag( TIM1_FLAG_CC1 ); //清除输入捕获标志位
}