標題: STM32定時器中斷掃描旋轉編碼器 [打印本頁]

作者: 小白EE    時間: 2022-12-28 09:38
標題: STM32定時器中斷掃描旋轉編碼器
用定時器中斷對編碼器進行掃描
下面是兩站編碼器的波形圖,前面這張是編碼器反轉的,后面這張是編碼器正轉的。在圖中可以看到,編碼器反轉時,A的下降沿對應B的高電平,編碼器正轉時,A的下降沿對應B的低電平。利用外部中斷可以對編碼器進行讀取,但是編碼器在旋轉的過程中,編碼器可能存在抖動,為了在讀取編碼器的同時消除抖動,可以采用定時器中斷的方法對編碼器進行讀取。

利用定時器中斷,我們可以對編碼器進行采樣,即每間隔一定的時間對編碼器兩個引腳進行讀取。編碼器引腳A和引腳PA11相連,編碼器引腳B和PA10相連,首先將引腳A的狀態(tài)保存在一個變量中,然后刷新引腳A的狀態(tài),通過比較A引腳前后兩次的狀態(tài)來決定是否對B引腳進行讀取。


定時器中斷函數(shù):
  1. void TIM2_IRQHandler(void)//定時器2中斷函數(shù)
  2. {
  3.         if(TIM_GetITStatus(TIM2,TIM_IT_Update))
  4.         {
  5.                 Pin11_LastStatus=Pin11_NowStatus;//保存上一次A引腳狀態(tài)
  6.                 Pin11_NowStatus=GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11);//刷新A引腳狀態(tài)
  7.                 if(Pin11_LastStatus==1 && Pin11_NowStatus==0)//如果引腳上一次為高電平,這一次為低電平
  8.                 {
  9.                         if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_10)==0)//判斷引腳B的狀態(tài)
  10.                         {
  11.                                 i++;
  12.                                 if(i>20)i=0;
  13.                         }else if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_10)==1)//判斷引腳B的狀態(tài)
  14.                         {               
  15.                                 i--;
  16.                                 if(i<0)i=20;
  17.                         }
  18.                 }
  19.         }
  20.         TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
  21. }
復制代碼





數(shù)碼管&amp;編碼器.7z

1.06 MB, 下載次數(shù): 33, 下載積分: 黑幣 -5






歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1