标题: STM32定时器中断扫描旋转编码器 [打印本页]

作者: 小白EE    时间: 2022-12-28 09:38
标题: STM32定时器中断扫描旋转编码器
用定时器中断对编码器进行扫描
下面是两站编码器的波形图,前面这张是编码器反转的,后面这张是编码器正转的。在图中可以看到,编码器反转时,A的下降沿对应B的高电平,编码器正转时,A的下降沿对应B的低电平。利用外部中断可以对编码器进行读取,但是编码器在旋转的过程中,编码器可能存在抖动,为了在读取编码器的同时消除抖动,可以采用定时器中断的方法对编码器进行读取。

利用定时器中断,我们可以对编码器进行采样,即每间隔一定的时间对编码器两个引脚进行读取。编码器引脚A和引脚PA11相连,编码器引脚B和PA10相连,首先将引脚A的状态保存在一个变量中,然后刷新引脚A的状态,通过比较A引脚前后两次的状态来决定是否对B引脚进行读取。


定时器中断函数:
  1. void TIM2_IRQHandler(void)//定时器2中断函数
  2. {
  3.         if(TIM_GetITStatus(TIM2,TIM_IT_Update))
  4.         {
  5.                 Pin11_LastStatus=Pin11_NowStatus;//保存上一次A引脚状态
  6.                 Pin11_NowStatus=GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11);//刷新A引脚状态
  7.                 if(Pin11_LastStatus==1 && Pin11_NowStatus==0)//如果引脚上一次为高电平,这一次为低电平
  8.                 {
  9.                         if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_10)==0)//判断引脚B的状态
  10.                         {
  11.                                 i++;
  12.                                 if(i>20)i=0;
  13.                         }else if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_10)==1)//判断引脚B的状态
  14.                         {               
  15.                                 i--;
  16.                                 if(i<0)i=20;
  17.                         }
  18.                 }
  19.         }
  20.         TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
  21. }
复制代码





数码管&amp;编码器.7z

1.06 MB, 下载次数: 33, 下载积分: 黑币 -5






欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1