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