增量式編碼器在實際應用中還是很常見。stm32的定時器帶的也有編碼器模式。所用的編碼器是有ABZ三相,其中ab相是用來計數,z相輸出零點信號。AB相根據旋轉的方向不同,輸出的波形如下圖所示:
從圖上可以看出來,cw方向A相會超前B相90度左右,相反CCW方向,B相會超前A相90度左右。不過方向判斷stm32自己是可以完成的。下面裂下使用stm32cubeMx配置的過程。
軟件:stm32cubemx mdk
芯片型號:stm32F407IGH6
使用的是定時器2
首先打開timer2的encoder模式:
配置系統時鍾為168mhz。
下面才是重點,配置具體定時器的參數:
選擇的encoderMode是 TI1和TI2模式。這種模式下,AB兩相的上升沿和下降沿都會計數,所以計數值是實際值的4倍,需要做分頻。也就是第一個參數,分頻值設為3,實際上是3+1=4分頻。
還有個地方需要解釋一下,我剛開始的時候就是把這里的設置沒搞清楚,看Polarity參數設置的是Rising Edge。這個參數的意思是在檢測到上升沿的時候就觸發encoder捕獲AB相的值,而並不是這里設置的是上升沿就只檢測AB相的上升沿,下降沿還是同樣會計數的。
Input Filter濾波值是從1-15,看情況設定,是用來濾除一些雜波的。
這樣基本就配置好了,生成mdk工程。
然后就是添加應用代碼了。
在初始化中添加打開定時器的encoder模式:
HAL_TIM_Encoder_Start(&htim2, TIM_CHANNEL_ALL);
然后定期調用下面這一句函數就可以獲取到encoder編碼器的計數值:
enc1 = (uint32_t)(__HAL_TIM_GET_COUNTER(&htim2));//獲取定時器的值