1。編碼器原理
什么是正交?如果兩個(gè)信號(hào)相位相差90度,則這兩個(gè)信號(hào)稱為正交。由于兩個(gè)信號(hào)相差90度,因此可以根據(jù)兩個(gè)信號(hào)哪個(gè)先哪個(gè)后來判斷方向。
這里使用了TI12模式,例如當(dāng)T1上升沿,T2在低電平時(shí);T1下降沿,T2在高電平時(shí),向上計(jì)數(shù),這樣的好處是當(dāng)有毛刺產(chǎn)生的時(shí)候,會(huì)自動(dòng)+1 -1過濾掉毛刺。
2。編碼器的中斷
由于編碼器是基于定時(shí)器的,所以編碼器的中斷實(shí)際上就是定時(shí)器的中斷。也就是說定時(shí)器是每隔一定時(shí)間加一個(gè)數(shù)(或減一個(gè)數(shù) ),當(dāng)數(shù)到達(dá)預(yù)設(shè)值時(shí)就產(chǎn)生中斷,而編碼器是每一個(gè)有效脈沖就加一個(gè)數(shù)(或減一個(gè)數(shù) ),當(dāng)數(shù)到達(dá)預(yù)設(shè)值時(shí)就產(chǎn)生中斷。若預(yù)設(shè)值為1000則編碼器與定時(shí)器中斷不同的是,當(dāng)編碼器反轉(zhuǎn)時(shí)值到達(dá)999產(chǎn)生一次中斷,而當(dāng)編碼器正轉(zhuǎn)到達(dá)0時(shí)同 樣產(chǎn)生一次中斷。在硬件上這兩個(gè)中斷是沒法區(qū)分的,這也就造成了有種情況的誤判。
3。STM32編碼器沒有考慮的情況
想象一下,如果編碼器的預(yù)設(shè)值為1000,當(dāng)某次我們使得編碼器正轉(zhuǎn)產(chǎn)生中斷后,立即反轉(zhuǎn)則又該怎么辦呢?根據(jù)上面的說法,這時(shí)候會(huì)產(chǎn)生兩次一樣的中斷。 如果在算法上沒有處理的話,極有可能認(rèn)為是行走了兩次正向。但實(shí)際上并沒有。所以這個(gè)時(shí)候必須結(jié)合方向來判斷行走的情況(判斷方向使用的是DIR寄存器 位)或者在產(chǎn)生中斷后讀一次count寄存器位(看看是999還是0,以此來判斷當(dāng)前的方向)。只有上一次為正且這一次同樣為正,距離才是相加的。
4。STM32f1系列定時(shí)器16位的問題
我用STM32的定時(shí)器3工作于編碼器方式,可以正常得到編碼器位置,但由于現(xiàn)在只有16位計(jì)數(shù),位數(shù)不夠,我想擴(kuò)展到32位,可以先用定時(shí)器內(nèi)部連接,將定時(shí)器3 的溢出送到定時(shí)器2,用定時(shí)器2做高位,在正轉(zhuǎn)的時(shí)候正常,但反向的時(shí)候出錯(cuò)。換了個(gè)思路,做個(gè)每10ms產(chǎn)生一次的中斷,在中斷中調(diào)用下面的代碼,下述代碼中MAX_COUNT是 比 10ms內(nèi)可能出現(xiàn)的計(jì)數(shù)最大值還要大的值,ENCODER_TIM_PERIOD是定時(shí)器的period值,最好比MAX_COUNT大,然后定義一個(gè)32位的有符號(hào)變量,如currentCount,然后每隔10ms執(zhí)行一次currentCount += Enc_GetCount();只需要去讀取currentCount的值就可以得到位移信息了。
s16 Enc_GetCount(void)
{
static u16 lastCount = 0;
u16 curCount = ENCODER_TIM-》CNT;
s32 dAngle = curCount - lastCount;
if(dAngle 》= MAX_COUNT){
dAngle -= ENCODER_TIM_PERIOD;
}else if(dAngle 《 -MAX_COUNT){
dAngle += ENCODER_TIM_PERIOD;
}
lastCount = curCount;
return (s16)dAngle;
}
5。其它一些得到的信息
1.編碼器有個(gè)轉(zhuǎn)速上限,超過這個(gè)上限是不能正常工作的,這個(gè)是硬件的限制,原則上線數(shù)越多轉(zhuǎn)速就越低,這點(diǎn)在選型時(shí)要注意,編碼器的輸出一般是開漏的,所以單片機(jī)的io一定要上拉輸入狀態(tài)。
2.定時(shí)器初始化好以后,任何時(shí)候CNT寄存器的值就是編碼器的位置信息,正轉(zhuǎn)他會(huì)加反轉(zhuǎn)他會(huì)減這部分是不需要軟件干預(yù)的,初始化時(shí)給的TIM_Period 值應(yīng)該是碼盤整圈的刻度值,在減溢出會(huì)自動(dòng)修正為這個(gè)數(shù)。加超過此數(shù)值就回0.
3.如果要擴(kuò)展成多圈計(jì)數(shù)需要溢出中斷,程序上圈計(jì)數(shù)加減方向位就行了。
4.每個(gè)定時(shí)器的輸入腳可以通過軟件設(shè)定濾波
5.應(yīng)用中如果沒有絕對(duì)位置信號(hào)或者初始化完成后還沒有收到絕對(duì)位置信號(hào)前的計(jì)數(shù)只能是相對(duì)計(jì)數(shù)。收到絕對(duì)位置信號(hào)后重新修改一次CNT的值就行了。碼盤一般都有零位置信號(hào),結(jié)合到定時(shí)器捕獲輸入就行。上電以后要往返運(yùn)動(dòng)一下找到這個(gè)位置。
6.即便有濾波計(jì)數(shù)值偶爾也會(huì)有出錯(cuò)誤的情況,一圈多計(jì)一個(gè)或少計(jì)一個(gè)數(shù)都是很正常的特別是轉(zhuǎn)速比較高的時(shí)候尤其明顯,有個(gè)絕對(duì)位置信號(hào)做修正是很有必要的。絕對(duì)位置信號(hào)不需要一定在零位置點(diǎn),收到這個(gè)信號(hào)就將CNT修正為一個(gè)固定的數(shù)值即可。
7.開啟定時(shí)器的輸入中斷可以達(dá)到每個(gè)步計(jì)數(shù)都作處理的效果,但是高速運(yùn)轉(zhuǎn)的時(shí)候你可能處理不過來.
-
編碼器
+關(guān)注
關(guān)注
45文章
3646瀏覽量
134648 -
STM32
+關(guān)注
關(guān)注
2270文章
10904瀏覽量
356338 -
定時(shí)器
+關(guān)注
關(guān)注
23文章
3250瀏覽量
114914
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論