STM32位编码器溢出问题

转载至另一个博主的方法,通过寄存器的溢出标志位进行判断。

https://blog.csdn.net/kobesdu/article/details/79741094?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7EPayColumn-1-79741094-blog-52253380.235%5Ev43%5Epc_blog_bottom_relevance_base9&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7EPayColumn-1-79741094-blog-52253380.235%5Ev43%5Epc_blog_bottom_relevance_base9&utm_relevant_index=1

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;

是为了防止计数发生突变,采用上一次的计数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值