<strike id="kiyse"></strike>
  • <tr id="kiyse"></tr>
  • <strike id="kiyse"></strike><samp id="kiyse"><tbody id="kiyse"></tbody></samp>
    <strike id="kiyse"><s id="kiyse"></s></strike>
    <tr id="kiyse"></tr>
    <noframes id="kiyse"><code id="kiyse"></code></noframes>
    <th id="kiyse"></th>
    <samp id="kiyse"></samp>
  • <th id="kiyse"><s id="kiyse"></s></th>
  • ESM7000異構(gòu)CPU實(shí)時(shí)應(yīng)用——支持高分辨率旋轉(zhuǎn)編碼器

     2022-8-10     作者:劉乾坤 黃志超         

    ESM7000是英創(chuàng)基于i.MX7D處理器開發(fā)的低功耗高性能工控主板,支持雙網(wǎng)口、6串口、雙CAN總線接口、PCIe、ISA總線等豐富的通訊接口,支持18-bit并行RGB或LVDS顯示接口。主CPU i.MX7D是NXP推出的異構(gòu)多核處理器,配置了主頻高達(dá)1GHz的ARM Cortex-A7雙核和一顆運(yùn)行速度240MHz、帶硬件浮點(diǎn)運(yùn)算的ARM Cortex-M4內(nèi)核。Linux系統(tǒng)在Cortex-A7核心上運(yùn)行,對于一些實(shí)時(shí)性要求極高的應(yīng)用,Linux系統(tǒng)可能無法滿足對中斷事件的及時(shí)響應(yīng),而且頻繁的中斷響應(yīng)也會(huì)大大的降低操作系統(tǒng)性能。對這類應(yīng)用場合就可充分利用i.MX7D異構(gòu)多核結(jié)構(gòu),由高性能的Cortex-A7(Linux系統(tǒng))完成人機(jī)交互、數(shù)據(jù)處理、通訊管理等復(fù)雜運(yùn)算,而對于實(shí)時(shí)的數(shù)據(jù)采集、高速的中斷事件響應(yīng)等實(shí)時(shí)任務(wù)交由Cotex-M4完成。


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


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


    接口硬件說明


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

    image.png


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


    ESM7000的GPIO僅支持3.3V TTL電平信號(hào)輸入,旋轉(zhuǎn)編碼器的脈沖信號(hào)通常需要經(jīng)過隔離及電平轉(zhuǎn)換電路后,才能接入ESM7000的相應(yīng)管腳。ESM7000支持兩路旋轉(zhuǎn)編碼器對應(yīng)的管腳如下:

    編碼器編碼器信號(hào)ESM7000管腳簡要說明
    旋轉(zhuǎn)編碼器1ESM8000異構(gòu)CPU實(shí)時(shí)應(yīng)用——支持高分辨率旋轉(zhuǎn)編碼器.pngGPIO18支持最高100KHz脈沖輸入,3.3V TTL電平
    ESM8000異構(gòu)CPU實(shí)時(shí)應(yīng)用——支持高分辨率旋轉(zhuǎn)編碼器.pngGPIO19
    旋轉(zhuǎn)編碼器2ESM8000異構(gòu)CPU實(shí)時(shí)應(yīng)用——支持高分辨率旋轉(zhuǎn)編碼器.pngGPIO20
    ESM8000異構(gòu)CPU實(shí)時(shí)應(yīng)用——支持高分辨率旋轉(zhuǎn)編碼器.pngGPIO21


    接口軟件說明


    在ESM7000的Linux系統(tǒng)中,可以通過RPMsg和Crotex-M4進(jìn)行通訊來獲取相關(guān)的信息,關(guān)于RPMsg的介紹可以參考《ESM7000異構(gòu)CPU實(shí)時(shí)應(yīng)用之二基于rpmsg的通訊機(jī)制》。為了方便使用,英創(chuàng)公司以字符設(shè)備的方式提供了相應(yīng)的驅(qū)動(dòng)文件,加載后會(huì)在/dev目錄下生成em_rpmsg_rot0和em_rpmsg_rot1兩個(gè)設(shè)備節(jié)點(diǎn),分別對應(yīng)兩路旋轉(zhuǎn)編碼器的硬件接口。在驅(qū)動(dòng)中會(huì)通過RPMsg和Crotex-M4進(jìn)行通信以及數(shù)據(jù)的處理,但對于用戶來說是不需要關(guān)心的,直接使用標(biāo)準(zhǔn)的字符設(shè)備操作函數(shù)即可。驅(qū)動(dòng)會(huì)將用戶程序?qū)υO(shè)備的操作通過RPMsg發(fā)送給Crotex-M4,然后由Crotex-M4實(shí)際對硬件執(zhí)行對應(yīng)的操作,如下圖所示:

                                                                                                 

    image.png

    驅(qū)動(dòng)文件在系統(tǒng)啟動(dòng)完成后會(huì)自動(dòng)加載,如下圖:

    image.png


    可以看到在/dev目錄下會(huì)生成相應(yīng)的設(shè)備節(jié)點(diǎn),按照字符設(shè)備的操作操作流程,首先需要調(diào)用open函數(shù)打開設(shè)備節(jié)點(diǎn),成功后會(huì)就返回句柄:

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



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

    #define ROT_POL_NEGATIVE     0        //負(fù)極性,初始電平為低  
    #define ROT_POL_POSITIVE     1        //正極性,初始電平為高  
    #define ROT_START            2        //啟動(dòng)旋轉(zhuǎn)編碼器采集  
    #define ROT_RESET            3        //復(fù)位計(jì)數(shù)  
    #define ROT_STOP             4        //停止旋轉(zhuǎn)編碼器采集  
      
    int cmd;  
      
    //設(shè)置負(fù)極性    
    cmd = ROT_POL_NEGATIVE;    
    ret = write(fd, &cmd, sizeof(cmd));    
    if(ret < 0) {    
          printf("write cmd failed!\n");    
    }    
            
    //啟動(dòng)    
    cmd = ROT_START;    
    ret = write(fd, &cmd, sizeof(cmd));    
    if(ret < 0) {    
          printf("write cmd failed!\n");    
    }


    當(dāng)啟動(dòng)了旋轉(zhuǎn)編碼器之后,程序中可以通過read函數(shù)來讀取當(dāng)前的計(jì)數(shù)值,計(jì)數(shù)值為一個(gè)整型數(shù)據(jù),正負(fù)代表方向。根據(jù)計(jì)數(shù)值,根據(jù)實(shí)際應(yīng)用的不同就可以計(jì)算出位置,角度等數(shù)據(jù)。

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


    本文中僅通過旋轉(zhuǎn)編碼器來獲取位置信息,同樣的方法也可用來實(shí)現(xiàn)對轉(zhuǎn)速的監(jiān)控,感興趣的客戶,可以和英創(chuàng)的工程師聯(lián)系,索取完整的測試代碼。

    99国产精品欧美一区二区三区 | 国语自产偷拍精品视频偷拍| 99久久99久久久精品齐齐| 久久久久国产精品三级网| 免费无码精品黄AV电影| 99热这里有精品| 国产系列高清精品第一页| 精品国产高清久久久久久小说 | 国产亚洲精品成人AA片| 国产精品va无码一区二区| 一区二区精品视频| 国产精品无码AV不卡| 精品无码人妻一区二区三区品| 久久久精品国产Sm最大网站| 国精品午夜福利视频不卡757| 91在线精品中文字幕| 亚洲av午夜福利精品一区人妖| 国产精品内射久久久久欢欢| 苍井空亚洲精品AA片在线播放 | 色播精品免费小视频| 久久国产精品61947| 9久久9久久精品| 国产99久久九九精品无码| 国产精品国产高清国产av| 亚洲精品无码aⅴ中文字幕蜜桃| 99j久久精品久久久久久| 精品乱人伦一区二区三区| 精品视频在线观看你懂的一区| 国产成人精品无码专区| 国产精品国产AV片国产| 热久久视久久精品18| 精品成人乱色一区二区| 3d动漫精品一区视频在线观看| 亚洲精品国产成人99久久| 国产精品国产三级国产普通话| 国产在线精品一区二区高清不卡| 国产成人精品a视频一区| 无码人妻一区二区三区精品视频| 国产精品国产三级国快看| 日本精品视频一区二区三区| 国产精品久久久久久久小说 |