激情综合丁香-激情综合六月-激情综合婷婷亚洲图片-激情综合图区-激情综合网五月

ESM8000異構CPU實時應用——支持高分辨率旋轉編碼器

 2021-10-14     作者:劉乾坤 黃志超         
文章標簽:ESM8000系列rpmsg

  ESM8000工控主板搭載了NXP i.MX8M Mini Quad 64位異構處理器,包含了一顆主頻1.6GHz的四核ARM Cortex-A53和一顆主頻400MHz 的ARM Cortex-M4。Linux系統在Cortex-A53核心上運行,對于一些實時性要求極高的應用,Linux系統可能無法滿足對中斷事件的及時響應,而且頻繁的中斷響應也會大大的降低操作系統性能。對這類應用場合就可充分利用i.MX8MM異構多核結構,由高性能的Cortex-A53(Linux系統)完成人機交互、數據處理、通訊管理等復雜運算,而對于實時的數據采集、高速的中斷事件響應等實時任務交由Cotex-M4完成。


  旋轉編碼器是工業領域最常見的傳感器之一,通過對編碼器輸出的A/B脈沖信號個數及相位的識別,就可以得到精確的轉速或位置信息。以歐姆龍的E6B2系列旋轉編碼器為例,當編碼器分辨率200個脈沖/轉,每分鐘旋轉3000轉時,編碼器輸出脈沖頻率為10KHz,如果將編碼器分辨率提高到2000個脈沖/轉,則編碼器輸出脈沖頻率為100KHz。對于高分辨率旋轉編碼器的支持,通常需要SOC內部具有專門針對編碼器硬件的硬件脈沖計數器,或通過獨立的單片機來實現。


  對于ESM8000工控主板,主CPU i.MX8MM內部沒有專門的硬件脈沖計數器,但我們可充分利用ESM8000的異構CPU結構,由i.MX8MM內的Cortex-M4 來對編碼器脈沖信號進行解析和計算,而Linux系統只需要直接從M4處獲取計算結果即可。這樣就將高速中斷的響應和處理全部交給了M4,Linux系統幾乎沒有任何負載。我們在M4上運行了FreeRTOS操作系統,具有很高的實時性,根據實際測試可以滿足同時兩路100KHz頻率的脈沖輸入。在Linux側設計了相應的驅動程序和提供相應的驅動程序API,為客戶外接高分辨率旋轉編碼器提供了一種快速低成本的解決方案。


接口硬件說明


  下面是歐姆龍旋轉編碼器E6B2-CWZ1X輸出的脈沖信號,對于速度或位置監測,只需要接入A相和B相信號,如果選擇接入?A /?B相,只需要在軟件設置中將初始電平極性設置為1(高電平)即可。


ESM8000異構CPU實時應用——支持高分辨率旋轉編碼器.png


  上圖的左邊是A、B相在編碼器順時針方向旋轉時的波形,其特點是A相脈沖超前B相脈沖90°相位。而圖的右邊是編碼器逆時針旋轉時的波形,此時B相超前A相90°相位。


  ESM8000的GPIO僅支持3.3V TTL電平信號輸入,旋轉編碼器的脈沖信號通常需要經過隔離及電平轉換電路后,才能接入ESM8000的相應管腳。ESM8000支持兩路旋轉編碼器對應的管腳如下:


編碼器編碼器信號ESM8000管腳簡要說明
旋轉編碼器1
ESM8000異構CPU實時應用——支持高分辨率旋轉編碼器.pngGPIO18支持最高100KHz脈沖輸入3.3V TTL電平信號
ESM8000異構CPU實時應用——支持高分辨率旋轉編碼器.pngGPIO19
旋轉編碼器2ESM8000異構CPU實時應用——支持高分辨率旋轉編碼器.pngGPIO20
ESM8000異構CPU實時應用——支持高分辨率旋轉編碼器.pngGPIO21


接口軟件說明


  在ESM8000的Linux系統中,可以通過RPMsg和Crotex-M4進行通訊來獲取相關的信息,關于RPMsg的介紹可以參考《ESM7000異構CPU實時應用之二基于rpmsg的通訊機制》。為了方便使用,英創公司以字符設備的方式提供了相應的驅動文件,加載后會在/dev目錄下生成em_rpmsg_rot0和em_rpmsg_rot1兩個設備節點,分別對應兩路旋轉編碼器的硬件接口。在驅動中會通過RPMsg和Crotex-M4進行通信以及數據的處理,但對于用戶來說是不需要關心的,直接使用標準的字符設備操作函數即可。驅動會將用戶程序對設備的操作通過RPMsg發送給Crotex-M4,然后由Crotex-M4實際對硬件執行對應的操作,如下圖所示:


ESM8000異構CPU實時應用——支持高分辨率旋轉編碼器.png


  驅動文件在系統啟動完成后會自動加載,如下圖:


ESM8000異構CPU實時應用——支持高分辨率旋轉編碼器.png


  可以看到在/dev目錄下會生成相應的設備節點,按照字符設備的操作操作流程,首先需要調用open函數打開設備節點,成功后會就返回句柄:


int fd;  
fd = open("/dev/em_rpmsg_rot1", O_RDWR);  
if(fd < 0) {  
    printf("open device failed!\n");  
    return fd;  
}

 

  通過返回的句柄,就可以調用write和read函數來操作設備了,我們使用write函數用于設置旋轉編碼器的采集,我們一共定義了五種操作,分別是設置正極性,設置負極性,開始,停止以及復位。具體定義以及通過write函數設置的代碼如下:


#define ROT_POL_NEGATIVE     0        //負極性,初始電平為低  
#define ROT_POL_POSITIVE     1        //正極性,初始電平為高  
#define ROT_START            2        //啟動旋轉編碼器采集  
#define ROT_RESET            3        //復位計數  
#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函數來讀取當前的計數值,計數值為一個整型數據,正負代表方向。根據計數值,根據實際應用的不同就可以計算出位置,角度等數據。


int val;  
  
//讀取計數值,計數值為一個整型數據,正負代表方向  
ret = read(fd, &val, sizeof(int));  
if(ret < 0) {  
    printf("read cmd failed!\n");  
}  
printf("val = %d\n", val);

 

  本文中僅通過旋轉編碼器來獲取位置信息,同樣的方法也可用來實現對轉速的監控,感興趣的客戶,可以和英創的工程師聯系,索取完整的測試代碼。

文章標簽:ESM8000系列rpmsg
主站蜘蛛池模板: 亚洲国产精品一区二区久久hs | 精品一区二区影院在线| 在线观看片| 国产成人精品综合网站| 久久精品韩国三级| 97视频在线| 达达兔欧美午夜国产亚洲| 看免费一级毛片| 久久5| 97视频在线免费| 久久三级网站| 免费a级毛片在线播放| 香港一级毛片| 国产免费观看视频| 亚洲区精品| 日本一区二区不卡视频| 欧美一级毛片欧美毛片视频| 蜜柚mv在线观看| 久久精品中文| 欧美性野久久久久久久久| redtube日本| 丝袜美足国产一区在线| 国产aⅴ精品一区二区三区久久| 爆操欧美美女| 成人在线视频网| 青青青亚洲精品国产| 一区二区三区国模大胆| 丝袜国产| 亚洲欧美二区三区久本道| 欧美亚洲三级| 国产精品99爱免费视频| 久久精品在| 免费国产片| 亚洲欧美网址| 三级黄色毛片网站| 亚洲一欧洲中文字幕在线| 欧美aaaa在线观看视频免费| 国产黄在线播放免费观看| 精品九九在线| 黄色网页免费大全| 国产亚洲精彩视频|