基于STM32F407的
直流減速電機(jī)編碼器方案
首先,什么是編碼器?
編碼器是將信號(hào)或數(shù)據(jù)進(jìn)行編制、轉(zhuǎn)換為可用以通訊、傳輸和存儲(chǔ)的信號(hào)形式的設(shè)備。在這里,編碼器就是能夠?qū)㈦姍C(jī)的轉(zhuǎn)動(dòng)信息(比如轉(zhuǎn)速、轉(zhuǎn)動(dòng)角度等)轉(zhuǎn)換為脈沖信號(hào)的設(shè)備。按照原理可分為(常見的)光電編碼器(光學(xué)式)和霍爾編碼器(磁式)。
編碼器的作用以及為什么要用編碼器?
如上所述,編碼器能夠?qū)㈦姍C(jī)的機(jī)械幾何位移轉(zhuǎn)化為脈沖信號(hào)或數(shù)字量。也就是說,有了編碼器,我們通過檢測(cè)編碼器輸出的脈沖信號(hào),就能獲取電機(jī)轉(zhuǎn)動(dòng)角度、轉(zhuǎn)速等相關(guān)信息。這樣我們不但能定性的控制電機(jī)的轉(zhuǎn)向、轉(zhuǎn)速,還能定量的測(cè)量。
編碼器的原理是什么以及怎么運(yùn)用呢?
簡(jiǎn)單來說,就是電機(jī)帶動(dòng)碼盤轉(zhuǎn)動(dòng),碼盤的結(jié)構(gòu)使得當(dāng)電機(jī)在轉(zhuǎn)動(dòng)時(shí)會(huì)產(chǎn)生A、B兩相的脈沖信號(hào),且這兩路脈沖信號(hào)的相位差為90度(即正交)。如下圖:
由于A、B信號(hào)正交,因此可以根據(jù)兩個(gè)信號(hào)哪個(gè)先哪個(gè)后來判斷方向,根據(jù)每個(gè)信號(hào)脈沖數(shù)量的多少及每圈電機(jī)產(chǎn)生多少脈沖數(shù)就可以算出當(dāng)前行走的距離,如果再加上定時(shí)器的話還可以計(jì)算出速度。
好了,現(xiàn)在我們的處境是,我們有一個(gè)帶編碼器的直流減速電機(jī),我們知道當(dāng)電機(jī)轉(zhuǎn)動(dòng)的時(shí)候,它會(huì)產(chǎn)生A、B兩相正交脈沖信號(hào),通過檢測(cè)脈沖信號(hào)我們就可以獲取電機(jī)的運(yùn)動(dòng)狀況。
我們通過什么手段來檢測(cè)脈沖數(shù)呢?
其中一種思路是,我們通過定時(shí)器的輸入捕獲或者GPIO引腳的外部中斷來檢測(cè)邊沿變化,以此來檢測(cè)脈沖數(shù)。這方法好像沒毛病,當(dāng)電機(jī)正常運(yùn)轉(zhuǎn)時(shí)行得通。但是如果電機(jī)輸出的脈沖信號(hào)出現(xiàn)了毛刺呢?這樣誤差就來了,怎么辦?通過軟件編寫算法來濾去毛刺似乎有點(diǎn)困難,于是我們想到通過硬件來處理這個(gè)毛刺。(而STM32正好有硬件編碼器,nice?。?br />
這里的脈沖輸入是一種特殊的輸入捕獲情況,因此stm32專門在定時(shí)器中提供了編碼器模式,可大大簡(jiǎn)化解析過程。
STM32的編碼器接口模式
在該模式下能計(jì)算電機(jī)輸出脈沖信號(hào)的個(gè)數(shù),且stm32根據(jù)其內(nèi)部機(jī)制能夠消除毛刺的干擾。
配置過程:
由于編碼器接口模式是一種特殊的輸入捕獲,所以要先配置一下輸入捕獲(畢竟你要通過捕獲邊沿來檢測(cè)脈沖)。在輸入捕獲過程中,我們把A6、A7復(fù)用為TIM3,作為輸入捕獲的引腳,對(duì)電機(jī)的A、B相脈沖進(jìn)行輸入捕獲。
輸入捕獲配置完成之后再配置一下編碼器模式就可以開始工作了。
于是緊接著我們來看看編碼器模式的配置函數(shù)TIM_EncoderInterfaceConfig:
其輸入?yún)?shù)中,TIMx就是輸入捕獲時(shí)設(shè)置的TIM3,polarity就分別是TI1和TI2的捕獲極性(TI1是定時(shí)器輸入通道1,TI2同理),即A、B兩相信號(hào)的捕獲極性(上升沿捕獲或者下降沿捕獲),重點(diǎn)來說說編碼器的模式TIM_EncoderMode:
當(dāng)模式選為TIM_EncoderMode_TI1時(shí),計(jì)數(shù)器僅在TI1的邊沿處計(jì)數(shù)
當(dāng)模式選為TIM_EncoderMode_TI2時(shí),計(jì)數(shù)器僅在TI2的邊沿處計(jì)數(shù)
當(dāng)模式選為TIM_EncoderMode_TI12時(shí),計(jì)數(shù)器在TI1和TI2邊沿處均計(jì)數(shù)
也就是說,模式1,我只以A相的脈沖信號(hào)為我的檢測(cè)信號(hào),TI2我就不管了。(B只是相對(duì)A滯后了90度,其它都是一樣的,所以檢測(cè)A就夠了)。其它同理。
模式1和模式2顯然就沒什么差別了,那模式3前者有何不同呢?
這就涉及到網(wǎng)友們所說的編碼器軟件四倍頻技術(shù)了:
如圖,A、B兩相正交信號(hào),如果根據(jù)模式1或模式2對(duì)脈沖信號(hào)進(jìn)行檢測(cè),假設(shè)我們上升沿捕獲一次,那么圖中的信號(hào)我們只檢測(cè)到3個(gè)上升沿,也就是三個(gè)脈沖。但是如果采用模式3,對(duì)TI1和TI2檢測(cè)上升沿,那么同一段時(shí)間我們檢測(cè)到6個(gè)上升沿。如果下降沿也檢測(cè),那么一共就是12個(gè)邊沿跳變。每個(gè)實(shí)際來的脈沖會(huì)被檢測(cè)4次,同樣是12/4=3個(gè)脈沖,但是這樣的話精度大大提高了。
入口參量:(TIM3, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising ,TIM_ICPolarity_Rising);
通過這樣配置,我們就完成了編碼器軟件的初始化。通過以上配置,我們完成了TIM3輸入捕獲的初始化以及編碼器接口模式的相關(guān)配置,每來一個(gè)跳變沿,計(jì)數(shù)值變化一次。
至此,為了避免我們忘了初衷,現(xiàn)在我們來回顧一下我們最開始用編碼器的初衷,前面我們說要用編碼器來干嘛來著?獲取電機(jī)轉(zhuǎn)動(dòng)角度、轉(zhuǎn)速。
現(xiàn)在的處境是,我們通過STM32的TIM3的編碼器模式,能夠測(cè)出任意時(shí)刻的脈沖值了?,F(xiàn)在要解決的就是如何將這個(gè)脈沖值轉(zhuǎn)換成我們所要得到的信息(即轉(zhuǎn)動(dòng)角度、轉(zhuǎn)速)。
首先,根據(jù)帶編碼器的直流減速電機(jī)的原理,顯然無論電機(jī)的轉(zhuǎn)速如何,每轉(zhuǎn)產(chǎn)生的脈沖數(shù)是固定的。這里假設(shè)電機(jī)每轉(zhuǎn)產(chǎn)生260個(gè)脈沖(具體數(shù)據(jù)各位自行查看自己的電機(jī)參數(shù)啦),那么只要我們用‘電機(jī)已產(chǎn)生的脈沖數(shù)’除以‘260個(gè)/轉(zhuǎn)’,就可以得到電機(jī)轉(zhuǎn)了多少圈,一圈即為360度,由此便可將脈沖數(shù)和轉(zhuǎn)動(dòng)角度聯(lián)系起來。
這里要注意一點(diǎn),由于我們用的是編碼器模式3(也就是TIM_EncoderMode_TI12),我們得到的脈沖數(shù)是電機(jī)實(shí)際產(chǎn)生的脈沖數(shù)的四倍。則電機(jī)實(shí)際產(chǎn)生的脈沖數(shù)應(yīng)為‘得到的計(jì)數(shù)值’除以4。于是,電機(jī)轉(zhuǎn)動(dòng)圈數(shù)為脈沖數(shù)除以260再除以4。
轉(zhuǎn)動(dòng)角度算出來了,轉(zhuǎn)速呢?則是根據(jù)計(jì)數(shù)方向(遞增計(jì)數(shù)或遞減計(jì)數(shù))來判斷的,所以我們接下來的工作就是要搞清楚計(jì)數(shù)方向和編碼器信號(hào)的關(guān)系。
讓我們來看一下STM32的中文參考手冊(cè):
網(wǎng)上幾乎在這張表的講解上都是一帶而過,真正能把這張表講清楚的幾乎沒有。后來看到一個(gè)人在表格上做了類似上圖的注釋,我才終于搞懂了。
大家還記得我們前面提到的TIM_EncoderInterfaceConfig函數(shù)嗎,里面有個(gè)參量就是選擇模式的,對(duì)吧。讓我們?cè)賮砘仡櫼幌拢?br />
注意到各模式后面的“xx edge depending on xx level”了嗎?這就是上面這個(gè)表里的第二縱列所提到的“相反信號(hào)的電平”。
TIM_EncoderMode_TI1: Counter counts on TI1FP1 edge depending on TI2FP2 level,意思就是當(dāng)選擇模式1時(shí),計(jì)數(shù)器根據(jù)TI2的電平高低來記錄TI1的邊沿信號(hào)。
這樣說可能不好理解,我們來舉個(gè)具體的例子:
如上圖,電機(jī)轉(zhuǎn)動(dòng)時(shí)產(chǎn)生A、B兩相信號(hào)通過TI1、TI2輸入到TIM3。
假設(shè)我們選擇的是模式1,即計(jì)數(shù)器僅在TI1的邊沿處計(jì)數(shù)。我們觀察TI1的上升沿,若此時(shí)對(duì)應(yīng)的TI2信號(hào)處于低電平(下圖紅框),于是根據(jù)表格我們可以得到計(jì)數(shù)方向?yàn)檫f增,假設(shè)計(jì)數(shù)器遞增時(shí)電機(jī)正向轉(zhuǎn)動(dòng),則可判斷此時(shí)電機(jī)正轉(zhuǎn)。
再譬如,假設(shè)我們選擇模式2,即計(jì)數(shù)器僅在TI2的邊沿處計(jì)數(shù)。我們觀察TI2的下降沿,若此時(shí)對(duì)應(yīng)的TI1信號(hào)為高電平(下圖藍(lán)框),于是根據(jù)表格我們可以得到計(jì)數(shù)方向?yàn)檫f減,假設(shè)計(jì)數(shù)器遞減時(shí)電機(jī)反向轉(zhuǎn)動(dòng),則可判斷此時(shí)電機(jī)反轉(zhuǎn)。
也就是說,當(dāng)以TI1為計(jì)數(shù)信號(hào)時(shí),需要根據(jù)TI2的電平(也就是第二縱列的“相對(duì)信號(hào)的電平”)來進(jìn)行判斷是向上計(jì)數(shù)還是向下計(jì)數(shù)。TI2也同理。
e.g.如果“僅在TI1計(jì)數(shù)”,當(dāng)TI1為“上升”沿(表中第三縱列),此時(shí)要根據(jù)TI2的電平來做判斷。根據(jù)下圖,可知當(dāng)TI1為上升沿的時(shí)候TI2為低電平,則根據(jù)上表可得知計(jì)數(shù)器為向上計(jì)數(shù)。這在下圖得到了驗(yàn)證。
再例如,如果“僅在TI2計(jì)數(shù)”時(shí),當(dāng)TI2為下降沿時(shí),如果TI1為低電平,則為向上計(jì)數(shù)(上圖左側(cè));當(dāng)TI2為下降沿時(shí),如果TI1為高電平,則為向下計(jì)數(shù)(上圖中部);當(dāng)TI2為上升沿時(shí),如果TI1為高電平,則為向上計(jì)數(shù)(上圖左部);當(dāng)TI2為上升沿時(shí),如果TI1為低電平,則為向下計(jì)數(shù)(圖中中部);
至此為止,我們便實(shí)現(xiàn)了這樣的操作:通過使用帶編碼器的直流減速電機(jī)產(chǎn)生正交脈沖,通過STM32的TIM的編碼器模式對(duì)脈沖進(jìn)行計(jì)數(shù),根據(jù)計(jì)數(shù)方向和編碼器信號(hào)的關(guān)系來判斷電機(jī)轉(zhuǎn)動(dòng)方向,利用脈沖計(jì)數(shù)值來計(jì)算電機(jī)轉(zhuǎn)動(dòng)位移。
接下來是代碼部分,有些容易讓人迷惑的地方:
輸入捕獲初始化時(shí)Period和Prescaler的作用:
這里的period即為計(jì)數(shù)器的重裝載值,prescaler即為預(yù)分頻系數(shù)。注意在編碼器模式時(shí),要把TIM理解為計(jì)數(shù)器,而不是定時(shí)器,這樣的話,時(shí)鐘信號(hào)就不是系統(tǒng)內(nèi)部產(chǎn)生的,而是通過PA6、PA7輸入到TIM3的TI1和TI2的。
有了這么個(gè)理解,再來看Period和Prescaler就不難理解了。Period就是計(jì)數(shù)器每一次能檢測(cè)脈沖的最大值,每來一個(gè)脈沖計(jì)數(shù)值就加一,當(dāng)計(jì)數(shù)值超過period就溢出中斷。Prescaler就是對(duì)電機(jī)產(chǎn)生的脈沖信號(hào)進(jìn)行分頻的分頻系數(shù)。比如當(dāng)分頻系數(shù)為2時(shí),每當(dāng)電機(jī)產(chǎn)生兩個(gè)脈沖,stm32才認(rèn)為接收到一個(gè)有效脈沖,計(jì)數(shù)值才加一。
了解更多
編碼器相關(guān)知識(shí),敬請(qǐng)關(guān)注西安德伍拓自動(dòng)化傳動(dòng)系統(tǒng)有限公司網(wǎng)站。公司技術(shù)團(tuán)隊(duì)為您免費(fèi)提供編碼器的選型、安裝、調(diào)試、保養(yǎng)等技術(shù)指導(dǎo)服務(wù),盡量避免企業(yè)因?yàn)榫幋a器技術(shù)人員的短缺帶來的損失,采取“線上+線下”服務(wù)的服務(wù)形式,幫助企業(yè)解決技術(shù)難題。