高速讀取正交編碼器信號(hào)(比如1MHz,或1m/s,分辨率是1μm)通常需要專用硬件。本設(shè)計(jì)實(shí)例展示了一種簡(jiǎn)單的方案,它只使用了一個(gè)型號(hào)為ATtiny2313A的AVR微控制器就能實(shí)現(xiàn)這個(gè)功能(圖)。當(dāng)然,微控制器也可以通過串口連接到其它器件,或者將測(cè)量到的位置信息顯示在與端口PB連接的本地液晶顯示器上。另外,還可以將一個(gè)或多個(gè)LED增加到信號(hào)誤差條件中。 圖:用ATtiny2313A讀取正交信號(hào);Z索引信號(hào)是可選的。 在這個(gè)實(shí)現(xiàn)中,中斷處理程序非常重要。它可以在不到1μs的時(shí)間內(nèi)讀取輸入信號(hào)A和B。差分信號(hào)AP/N和BP/N由SN75157接收器處理,如果你的編碼器輸出的是邏輯電平信號(hào),甚至無需處理。 處理器經(jīng)配置可以根據(jù)端口PD引腳的任何變化產(chǎn)生中斷。這個(gè)中斷位于中斷矢量表的最后,因此無需跳轉(zhuǎn)指令,進(jìn)而可以減少2-3個(gè)時(shí)鐘(100~150ns)的中斷服務(wù)時(shí)間。 通過以前信號(hào)和當(dāng)前信號(hào)之間的異或(XOR)操作(Aold?Bnew 或Anew ?Bold)可以判斷當(dāng)前位置是在以前位置基礎(chǔ)上增加了還是減少了。Aold和Bold是狀態(tài)改變前的A和B信號(hào),Anew和Bnew是在中斷發(fā)生后的值。中斷處理程序在PCIsubroutine1.txt文件中。 中斷處理程序的執(zhí)行時(shí)間是800~850ns(16~17個(gè)時(shí)鐘)。為了盡量減少中斷服務(wù)例程(ISR)的執(zhí)行時(shí)間,需要使用一些專門的寄存器,這些寄存器一定不能再被主程序使用: ·R10用于保存SREG,并檢測(cè)新中斷的激活 ·R11和R12用于新舊狀態(tài) ·R24和R25用于位置傳感器 計(jì)算當(dāng)前位置只需一個(gè)時(shí)鐘周期。缺點(diǎn)是位置只有65536個(gè)值。你可以用3個(gè)或4個(gè)字節(jié)來判斷位置,此時(shí)子程序的執(zhí)行時(shí)間由于增加了必要的指令(使用寄存器對(duì)R24、R26、R28或R30)而增加到18-19個(gè)周期。 中斷處理程序在退出當(dāng)前ISR之前會(huì)檢查是否有新的中斷。這種情況由SREG中的T位置位通知。實(shí)現(xiàn)這種檢查后的執(zhí)行時(shí)間將增加3個(gè)周期。我們用RB6029(每個(gè)圈(rotation)有4000個(gè)脈沖)以最快速度測(cè)試了子程序的運(yùn)行,沒有發(fā)現(xiàn)錯(cuò)誤。 在激活中斷之前,必須將PCIE2值放進(jìn)寄存器R12(在使能PCINT2中斷和SREG-I標(biāo)志置位之前先要讀取PIND寄存器)。 如果你想使用Z索引信號(hào),位置需要存儲(chǔ)在三個(gè)寄存器中,因?yàn)橛?024000個(gè)值(4000個(gè)/圈;256個(gè)圈)。中斷處理程序讀取數(shù)據(jù)的過程比較復(fù)雜,詳見PCIsubroutine2.txt文件。當(dāng)Z處于激活狀態(tài),同時(shí)當(dāng)前位置增加時(shí),長(zhǎng)度是19個(gè)周期或20個(gè)周期。 如果Z索引是激活狀態(tài),我們清除角度位置,增加圈的數(shù)量,同時(shí)檢查前面的角度位置是3999。在這個(gè)子程序中檢測(cè)到三個(gè)錯(cuò)誤:一個(gè)錯(cuò)誤是疊加了新的中斷(就像前一例子中那樣),兩個(gè)錯(cuò)誤與Z索引(檢查以前角度位置的正確性)有關(guān)。誤差計(jì)數(shù)寄存器rerr1、rerr2和rerr3應(yīng)該由用戶來定義。為了初始化系統(tǒng),需要執(zhí)行InitIndexZ.txt程序,它會(huì)等待Z被激活。 |