增量式光電編碼器是工業自動化領域最常用的轉速測量傳感器。針對轉速測量的應用需求,我們在EM9280的硬件基礎上,設計了相應的驅動程序并提供標準的流式驅動程序API,為客戶應用程序增加轉速測量功能提供了一種快速低成本的實現途徑。本文主要介紹英創工控主板EM9280與增量式光電旋轉編碼器的軟硬件接口。
接口硬件說明
鑒于本應用主要是監測轉速信號,因此只需要接入增量式光電旋轉編碼器的A、B兩相脈沖信號即可。典型的A、B相信號的關系如下圖所示:
上圖的左面是A、B相在電機順時針方向旋轉時的波形,其特點是A相脈沖超前B相脈沖90o相位。而圖的右邊是點擊逆時針旋轉時的波形,此時B相超前A相90o相位。
一般說來,光電編碼器的A、B相信號需要經過隔離及電平轉換電路,方可接入EM9280的相應管腳。隔離整形后的A、B相輸出信號必須是3.3V的TTL信號,與EM9280連接如下表所示:
光電編碼器 | EM9280管腳 | 簡要說明 |
A相信號 | GPIO23 | 3.3V TTL電平信號 |
B相信號 | GPIO22 | 3.3V TTL電平信號 |
由于內部電路對A、B相信號進一步做了去抖動處理,因此要求輸入信號頻率不能高于5KHz,方能保證后續計數結果的正確。
從應用編程的角度看,光電編碼器的基本指標包括:(1)每分鐘最大轉速,(2)每轉輸出的脈沖數,也就是光電編碼器的分辨率。
接口軟件說明
光電編碼轉速測量的驅動程序已內置在EM9280的內核中,其設備文件名為”ROT1:”。當打開該設備文件后,EM9280的對應管腳(GPIO23和GPIO22)將自動轉為相應的脈沖輸入狀態。當然這兩個管腳不能再作為通用GPIO或I2C接口使用。
當調用CreateFile(_T(”ROT1:”), ….)打開設備文件后,可通過WriteFile設置光電編碼器的參數,參數包含在以下數據結構:
typedef struct _ROTARY_ENCODER_INFO
{
BYTE ucSize; // 填入本結構的字節數 = 21
DWORD dwMaxRotary; // 正常工況每分鐘旋轉圈數,單位為rpm
DWORD dwResolution; // 每轉輸出的脈沖數
DWORD dwAlarmRotaryHigh; // 轉速報警高限值,單位rpm,= 0: 禁止該功能
DWORD dwAlarmRotaryLow; // 轉速報警低限值,單位rpm,= 0: 禁止該功能
DWORD dwPeriod; // 采樣周期,單位為ms,= 0:自動設置采樣周期
} ROTARY_ENCODER_INFO, *PROTARY_ENCODER_INFO;
在上述數據結構中,dwMaxRotary設置的上限是編碼器的最高轉速,也可根據實際應用設置為正常工況的最高轉速。本驅動程序支持的采樣間隔共10檔,分別為1ms、2ms、5ms、10ms、20ms、50ms、100ms、200ms、500ms、1000ms。采樣周期與編碼器參數的關系為:
N =(dwMaxRotary×dwResolution / 60)× dwPeriod / 1000
上式中N表示在一個采樣間隔所采集的脈沖數,當N為正時,表示順時針旋轉,N為負數時,表示逆時針旋轉。在本驅動程序中,采集輸出的數據即為N,數據類型為帶符號的16-bit整型量。具體設置并啟動測量的API調用為:
ROTARY_ENCODER_INFO Info; //定義結構對象
DWORD dwReturnWritten; //實際寫入的字節數
//填寫數據結構參數
Info.ucSize = sizeof(ROTARY_ENCODER_INFO);
// … …
WriteFile(hROT, &Info, sizeof(ROTARY_ENCODER_INFO), &dwReturnWritten, 0);
上面調用中的hROT是CreateFile返回的文件句柄。若dwPeriod設置為自動(= 0),則可通過以下API讀取驅動實際使用的采樣周期:
ReadFile(hROT, &Info, sizeof(ROTARY_ENCODER_INFO), &dwReturnRead, 0);
若應用程序設置自動采樣周期,驅動程序將根據光電編碼器的基本參數(轉速和分辨率),選取滿足一定精度的最小采樣周期。
當通過WriteFile設置并啟動了轉速測量后,還可通過ReadFile隨時讀取當前轉速或截止當前時刻的轉速數據序列(即轉速曲線),具體調用方式為:
int short DBuf[1024]; // 16-bit 帶符號整型量數據buffer
DWORD dwBufLen; // buffer長度,必須兩字節對齊
DWORD dwReturnRead; // 返回的字節數
DWORD dwNbSamples;
dwBufLen = 20 * sizeof(int short); // 采集20個樣點
dwReturnRead = 0; // 必須置0
ReadFile(hROT, DBuf, dwBufLen, &dwReturnRead, 0);
dwNbSamples = dwReturnRead / sizeof(int short);
注意實際采集的點數有可能小于希望采集的點數。在驅動程序內部緩沖的最大數據點數為32K,即32768個樣點。上面調用中特別要注意的是dwBufLen必須為兩字節對齊,這是因為16-bit 帶符號整型量占用2個字節。
-
嵌入式主板
+關注
關注
7文章
6085瀏覽量
35297
發布評論請先 登錄
相關推薦
評論