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