|
用定時器中斷對編碼器進行掃描
下面是兩站編碼器的波形圖,前面這張是編碼器反轉的,后面這張是編碼器正轉的。在圖中可以看到,編碼器反轉時,A的下降沿對應B的高電平,編碼器正轉時,A的下降沿對應B的低電平。利用外部中斷可以對編碼器進行讀取,但是編碼器在旋轉的過程中,編碼器可能存在抖動,為了在讀取編碼器的同時消除抖動,可以采用定時器中斷的方法對編碼器進行讀取。
編碼器反轉.png (131.2 KB, 下載次數: 41)
下載附件
2022-12-28 08:39 上傳
編碼器正轉.png (135.54 KB, 下載次數: 33)
下載附件
2022-12-28 08:39 上傳
利用定時器中斷,我們可以對編碼器進行采樣,即每間隔一定的時間對編碼器兩個引腳進行讀取。編碼器引腳A和引腳PA11相連,編碼器引腳B和PA10相連,首先將引腳A的狀態保存在一個變量中,然后刷新引腳A的狀態,通過比較A引腳前后兩次的狀態來決定是否對B引腳進行讀取。
采樣.PNG (137.94 KB, 下載次數: 39)
下載附件
2022-12-28 08:45 上傳
定時器中斷函數:
- void TIM2_IRQHandler(void)//定時器2中斷函數
- {
- if(TIM_GetITStatus(TIM2,TIM_IT_Update))
- {
- Pin11_LastStatus=Pin11_NowStatus;//保存上一次A引腳狀態
- Pin11_NowStatus=GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11);//刷新A引腳狀態
- if(Pin11_LastStatus==1 && Pin11_NowStatus==0)//如果引腳上一次為高電平,這一次為低電平
- {
- if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_10)==0)//判斷引腳B的狀態
- {
- i++;
- if(i>20)i=0;
- }else if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_10)==1)//判斷引腳B的狀態
- {
- i--;
- if(i<0)i=20;
- }
- }
- }
- TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
- }
復制代碼
|
-
-
數碼管&編碼器.7z
2022-12-28 09:38 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
1.06 MB, 下載次數: 33, 下載積分: 黑幣 -5
|