通常在STM32芯片的通用TIMER或高級TIMER都帶編碼器功能,支持基于1路或2路輸入的編碼脈沖計數。我們一般外接正交編碼器,使用2路輸入。TIMER硬件基于2路輸入的相差特征來確定計數方向并依據方向對計數器做遞增或遞減操作。
正交編碼器一般使用5根線連接,分別為A、B、
Z信號線及VCC和GND電源線。其中,A、B兩路是存在相差的同頻信號。Z信號即零點信號,當編碼器旋轉到某位置時,它會發出一個脈沖表示約定的零位。VCC、GND分別是電源線和地線。至于編碼器線數,是指旋轉一圈A(B)端會輸出的脈沖個數
,二者轉一圈所發出的脈沖數相同,但存在90°相差。編碼器的線數越高代表其能夠反應的位置精度越高。
關于STM32片內TIMER編碼器接口的工作原理,這里就不介紹了。更多細節請參考STM32的相應系列的參考手冊。這里想重點分享的是,如果手頭沒有正交編碼器實物,如何來驗證或體驗TIMER的編碼器接口功能呢?
其實,TIMER編碼器處理單元就是對外來的兩路同頻但輸出具有前后時序差的脈沖信號進行方向辨認后做TIMER計數器的遞增或遞減計數。既然手頭沒有編碼器實物,我們何不利用STM32片內的TIEMR產生2路帶相差的同頻信號,再接到另一個支持編碼器接口的TIMER不就OK了嗎?
當然,使用STM32的TIMER產生2路帶相差的同頻信號,有多種方法。比方通過2個定時器主從級聯、單個定時器使用OC
toggle模式加以DMA輔助、利用非對稱PWM輸出模式來實現。
其中,前2種方法在STM32芯片里通用性好,每個STM32系列都支持。而非對稱PWM輸出模式雖然可以非常方便地實現帶相差的同頻輸出信號,但不是所有STM32系列支持。當然,不支持的主要是ST推出得比較早的STM32系列,比方STM32F1\\STM32F2\\STM32F4這些老舊的系列,后來推出的STM32系列,比方STM32L4,STM32G4,STM32C0、STM32U5、STM32F7、STM32H7、STM32H5等都支持非對稱PWM輸出模式。
我這里采用非對稱PWM輸出模式并使用STM32L4開發板來演示實現過程。先用TIM1結合非對稱PWM輸出模式輸出2路帶相差的同頻信號,然后連接到TIM2的編碼器接口。另外,我還用了個按鍵【接到PC13】動態調整TIM1兩路輸出相差的前后關系,以觀察TIM2計數器的計數變化情況,即遞增還是遞減計數。
我先配置TIM1的CH1/CH2,實現2路帶相差的PWM輸出?!娟P于TIMER非對稱PWM輸出模式這里不介紹了,此處直接上配置。下面鏈接有相關文章介紹,或者自行研讀STM32參考手冊相關內容。】
基于CubeMx配置后生成初始化工程,添加2行上圖中的代碼就可以輸出了。
我這里使用ARM MDK IDE自帶的邏輯分析儀就可以看到下面波形。2路波形分別從GPIOA_PIN8/GPIOA_PIN9輸出。
然后我將這兩路輸出分別連接到TIM2的編碼器接口腳【GPIOA_PIN0、GPIOA_PIN1】。
我把有關TIM2編碼器應用的CubeMx配置也截圖出來供參考。【其中ARR可按需調整,為了便于查看效果,后來我將其改為1000了。這點不影響功能演示?!浚?/p>
然后,添加啟動TIMER編碼器功能的API函數?!続PI函數里啟動了2個通道的輸入捕獲中斷,我這里只保留通道1的而關閉了通道2的。即每次在TIM2通道1的捕獲中斷里讀取其計數器的值?!?/p>
編譯、除錯后運行,即可在IDE的邏輯分析儀上看到下面的結果。其中CNT_value就是TIM2的計數器動態值。目前看到的是TIM2的編碼器接口針對當前2路輸入信號進行周期計數。綠色和紫色是上面提到過的兩路輸入信號【因顯示分辨率的關系下面相關圖形變成單色方塊了】。
當然,我們可以通過按鍵來調整TIM1兩路輸出信號的相差時序,進而改變TIM2編碼器計數的方向。不難看出下圖中3個圓圈的地方就是切換計數方向的位置。
我們還可以調整TIM1的參數改變輸出給TIM2的信號頻率。整個過程就是利用TIMER的非對稱PWM輸出模式構造2路帶相差的編碼器信號,從而讓TIMER的編碼器接口電路實現對外部編碼輸入信號的計數。實現這些基本功能之后,可以進一步研究應用中可能涉及的各種測量功能。
聊到這里,可能有人對上面邏輯分析儀的配置感興趣。之前我在本公眾號專門介紹過,這里簡單就今天查看的幾個變量的配置過程介紹下。
這里的CNT_value連續記錄TIM2計數器的值,這里為Analog量。
Level_PA8記錄GPIOA_PIN8的電平情況,1或0兩個值之一,為Bit量。
Level_PA9跟Level_PA8是完全相同的數據類型,不過顯示的是GPIOA_PIN9的電平。顯然,邏輯分析儀配置里關于Level_PA9的顯示算式的屏蔽數應該是0x00000200,右移位為9。我目前是在SYSTICK的毫秒中斷里讀取GPIOA-》IDR的值即管腳電平到變量Level_PA8和Level_PA9的。
-
編碼器
+關注
關注
45文章
3596瀏覽量
134162 -
STM32
+關注
關注
2266文章
10871瀏覽量
354825 -
控制
+關注
關注
4文章
1010瀏覽量
122628
發布評論請先 登錄
相關推薦
評論