ESM7000是英創(chuàng)基于i.MX7D處理器開發(fā)的低功耗高性能工控主板,支持雙網(wǎng)口、6串口、雙CAN總線接口、PCIe、ISA總線等豐富的通訊接口,支持18-bit并行RGB或LVDS顯示接口。主CPU i.MX7D是NXP推出的異構多核處理器,配置了主頻高達1GHz的ARM Cortex-A7雙核和一顆運行速度240MHz、帶硬件浮點運算的ARM Cortex-M4內核。Linux系統(tǒng)在Cortex-A7核心上運行,對于一些實時性要求極高的應用,Linux系統(tǒng)可能無法滿足對中斷事件的及時響應,而且頻繁的中斷響應也會大大的降低操作系統(tǒng)性能。對這類應用場合就可充分利用i.MX7D異構多核結構,由高性能的Cortex-A7(Linux系統(tǒng))完成人機交互、數(shù)據(jù)處理、通訊管理等復雜運算,而對于實時的數(shù)據(jù)采集、高速的中斷事件響應等實時任務交由Cotex-M4完成。
旋轉編碼器是工業(yè)領域最常見的傳感器之一,通過對編碼器輸出的A/B脈沖信號個數(shù)及相位的識別,就可以得到精確的轉速或位置信息。以歐姆龍的E6B2系列旋轉編碼器為例,當編碼器分辨率200個脈沖/轉,每分鐘旋轉3000轉時,編碼器輸出脈沖頻率為10KHz,如果將編碼器分辨率提高到2000個脈沖/轉,則編碼器輸出脈沖頻率為100KHz。對于高分辨率旋轉編碼器的支持,通常需要SOC內部具有專門針對編碼器硬件的硬件脈沖計數(shù)器,或通過獨立的單片機來實現(xiàn)。
對于ESM7000工控主板,主CPU i.MX7D內部沒有專門的硬件脈沖計數(shù)器,但我們可充分利用ESM7000的異構CPU結構,由i.MX7D內的Cortex-M4 來對編碼器脈沖信號進行解析和計算,而Linux系統(tǒng)只需要直接從M4處獲取計算結果即可。這樣就將高速中斷的響應和處理全部交給了M4,Linux系統(tǒng)幾乎沒有任何負載。我們在M4上運行了FreeRTOS操作系統(tǒng),具有很高的實時性,根據(jù)實際測試可以滿足同時兩路100KHz頻率的脈沖輸入。在Linux側設計了相應的驅動程序和提供相應的驅動程序API,為客戶外接高分辨率旋轉編碼器提供了一種快速低成本的解決方案。
接口硬件說明
下面是歐姆龍旋轉編碼器E6B2-CWZ1X輸出的脈沖信號,對于速度或位置監(jiān)測,只需要接入A相和B相信號,如果選擇接入`A /`B相,只需要在軟件設置中將初始電平極性設置為1(高電平)即可。
上圖的左邊是A、B相在編碼器順時針方向旋轉時的波形,其特點是A相脈沖超前B相脈沖90°相位。而圖的右邊是編碼器逆時針旋轉時的波形,此時B相超前A相90°相位。
ESM7000的GPIO僅支持3.3V TTL電平信號輸入,旋轉編碼器的脈沖信號通常需要經(jīng)過隔離及電平轉換電路后,才能接入ESM7000的相應管腳。ESM7000支持兩路旋轉編碼器對應的管腳如下:
編碼器 | 編碼器信號 | ESM7000管腳 | 簡要說明 |
旋轉編碼器1 | ![]() | GPIO18 | 支持最高100KHz脈沖輸入,3.3V TTL電平 |
![]() | GPIO19 | ||
旋轉編碼器2 | ![]() | GPIO20 | |
![]() | GPIO21 |
接口軟件說明
在ESM7000的Linux系統(tǒng)中,可以通過RPMsg和Crotex-M4進行通訊來獲取相關的信息,關于RPMsg的介紹可以參考《ESM7000異構CPU實時應用之二基于rpmsg的通訊機制》。為了方便使用,英創(chuàng)公司以字符設備的方式提供了相應的驅動文件,加載后會在/dev目錄下生成em_rpmsg_rot0和em_rpmsg_rot1兩個設備節(jié)點,分別對應兩路旋轉編碼器的硬件接口。在驅動中會通過RPMsg和Crotex-M4進行通信以及數(shù)據(jù)的處理,但對于用戶來說是不需要關心的,直接使用標準的字符設備操作函數(shù)即可。驅動會將用戶程序對設備的操作通過RPMsg發(fā)送給Crotex-M4,然后由Crotex-M4實際對硬件執(zhí)行對應的操作,如下圖所示:
驅動文件在系統(tǒng)啟動完成后會自動加載,如下圖:
可以看到在/dev目錄下會生成相應的設備節(jié)點,按照字符設備的操作操作流程,首先需要調用open函數(shù)打開設備節(jié)點,成功后會就返回句柄:
int fd; fd = open("/dev/em_rpmsg_rot1", O_RDWR); if(fd < 0) { printf("open device failed!\n"); return fd; }
通過返回的句柄,就可以調用write和read函數(shù)來操作設備了,我們使用write函數(shù)用于設置旋轉編碼器的采集,我們一共定義了五種操作,分別是設置正極性,設置負極性,開始,停止以及復位。具體定義以及通過write函數(shù)設置的代碼如下:
#define ROT_POL_NEGATIVE 0 //負極性,初始電平為低 #define ROT_POL_POSITIVE 1 //正極性,初始電平為高 #define ROT_START 2 //啟動旋轉編碼器采集 #define ROT_RESET 3 //復位計數(shù) #define ROT_STOP 4 //停止旋轉編碼器采集 int cmd; //設置負極性 cmd = ROT_POL_NEGATIVE; ret = write(fd, &cmd, sizeof(cmd)); if(ret < 0) { printf("write cmd failed!\n"); } //啟動 cmd = ROT_START; ret = write(fd, &cmd, sizeof(cmd)); if(ret < 0) { printf("write cmd failed!\n"); }
當啟動了旋轉編碼器之后,程序中可以通過read函數(shù)來讀取當前的計數(shù)值,計數(shù)值為一個整型數(shù)據(jù),正負代表方向。根據(jù)計數(shù)值,根據(jù)實際應用的不同就可以計算出位置,角度等數(shù)據(jù)。
int val; //讀取計數(shù)值,計數(shù)值為一個整型數(shù)據(jù),正負代表方向 ret = read(fd, &val, sizeof(int)); if(ret < 0) { printf("read cmd failed!\n"); } printf("val = %d\n", val);
本文中僅通過旋轉編碼器來獲取位置信息,同樣的方法也可用來實現(xiàn)對轉速的監(jiān)控,感興趣的客戶,可以和英創(chuàng)的工程師聯(lián)系,索取完整的測試代碼。
成都英創(chuàng)信息技術有限公司 028-8618 0660