转载至另一个博主的方法,通过寄存器的溢出标志位进行判断。
void TIM2_IRQHandler(void) {
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
// 清除中断标志位
TIM_ClearITPendingBit(TIM2, TIM_FLAG_Update);
EncCnt=TIM4->CNT;
if((TIM4->CR1&0X10)==0X10)
{
if((TIM4->SR&0X01)==0X01)
{
TIM4->SR=TIM4->SR&0XFE;
N--;
}
}
else if((TIM4->CR1&0X10)==0X00)
{
if((TIM4->SR&0X01)==0X01)
{
TIM4->SR=TIM4->SR&0XFE;
N++;
}
}
if(EncCnt>1000000 || EncCnt<-1000000)
EncCnt=Last_EncCnt;
EncCnt=N*65535+TIM4->CNT;
Last_EncCnt=EncCnt;
speed=(EncCnt*0.4082)/(40000*0.01);
printf("speed%f,dis1%d,dis2%d\r\n",speed,EncCnt,distance1);
N=0;
TIM4->CNT=0;
}
}
其中
if(EncCnt>1000000 || EncCnt<-1000000)
EncCnt=Last_EncCnt;
是为了防止计数发生突变,采用上一次的计数。