<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>
  • EM9380多路任意脈沖發生器及應用

     2013-8-1              

            EM9380是面向實時控制應用的一款工控主板,這里所說的實時控制是指那些控制周期可能短至幾十微妙的控制應用。EM9380通過板上獨立運行的硬件協處理器(Cortex-M3),可很好的滿足這類應用的需求。多路任意脈沖發生器,就是按照用戶預設的流程,按設定的時間間隔(最短25us),同時更新多路(最多8路)數字輸出的電平狀態,從而構成多路任意周期的脈沖信號輸出。多路任意脈沖發生器功能,可用于步進電機的控制,在紡織、印刷設備中有廣泛的應用。本文后續部分將主要介紹在應用程序中實現任意脈沖發生器功能的流程。

     

    接口硬件說明

     

            EM9380中的GPIO0–GPIO15是由其硬件協處理器直接控制的,它們均可作為任意脈沖發生器的輸出,輸出的總數不超過8路。對選定作為意脈沖輸出的GPIO,首先需要設置成輸出模式。因為在EM9380上電或復位啟動后,GPIO0 – GPIO15均處于輸出狀態的,由于內部100KΩ上拉,其電平均為高電平(管腳懸空時)。在實際應用中,若需要脈沖輸出的初始電平為低電平,可在其管腳接10KΩ的下拉電阻至地。

     

    接口軟件說明

     

            為了操作GPIO0–GPIO15這組GPIO,首先需要打開硬件寫處理器的驅動程序,其設備文件名為”MCU2:”(注意是MCU2,而不是MCU1):
            #include <bsp_drivers.h> // 數據類型定義

            HANDLE hMCU2;

            hMCU2 = CreateFile(_T(“MCU2:”), // name of device
                    GENERIC_READ|GENERIC_WRITE, // desired access
                    FILE_SHARE_READ|FILE_SHARE_WRITE, // sharing mode
                    NULL, // security attributes (ignored)
                    OPEN_EXISTING, // creation disposition
                    FILE_FLAG_RANDOM_ACCESS, // flags/attributes
                    NULL); // template file (ignored)

     

            驅動程序MCU2通過DeviceIoControl,支持以下GPIO命令:
            MCU_GENERIC_GPIO_OE // 輸出使能 
            MCU_GENERIC_GPIO_OD // 輸出禁止,作為數字輸入
            MCU_GENERIC_GPIO_SET // 輸出高電平
            MCU_GENERIC_GPIO_CLR // 輸出低電平
            MCU_GENERIC_GPIO_PIN // 讀取輸入管腳電平狀態
            MCU_GENERIC_GPIO_OF // 實時控制輸出流

     

            其中前5個命令通過以下的數據結構來設置相關參數,從而實現GPIO的命令:
            typedef struct
            {
                    BYTE ucSize; // 本數據結構大小 = 17字節
                    BYTE ucCmd; // GPIO命令碼:MCU_GENERIC_GPIO_XXX
                    DWORD dwPins; // 操作的管腳位
                    DWORD dwStatus; // 返回的管腳電平狀態
                    DWORD dwPeriod; // 實時控制周期,單位us;= 0: 常規功能
                    bool bFlashed; // 保存本配置作為啟動缺省功能
                    BYTE ucChkSum; // 校驗和
            } MCU_GPIO_INFO, *PMCU_GPIO_INFO; // struct for GPIO

     

            對于本應用來說,首先需要把所選擇的GPIO設置為輸出模式,具體代碼如下:
            MCU_GPIO_INFO Info; //定義結構對象

            memset(&Info, 0, sizeof(MCU_GPIO_INFO));//清零
            //填寫所需的參數
            Info.ucSize = sizeof(MCU_GPIO_INFO);
            Info.ucCmd = MCU_GENERIC_GPIO_OE; //設置為輸出模式
            Info.dwPins = GPIO3 | GPIO2 | GPIO1 | GPIO0; //設置4路脈沖輸出
            // 生成chksum字節
            Info.ucChkSum = ChkSum(&Info, sizeof(MCU_GPIO_INFO)-1);

            // 調用DeviceIoControl
            if (!DeviceIoControl(hMCU2, // File handle to the driver 
                    MCU_IOCTL_ACCESS, // I/O control code
                    &Info, // input buffer
                    sizeof(MCU_GPIO_INFO), // in buffer size
                    NULL, // out buffer
                    0, // out buffer size 
                    NULL, // pointer to number of bytes returned
                    NULL)) // ignored (=NULL)
            {
                    // 出錯處理...... 
                    return FALSE;
            }

     

            其次是設置脈沖的初始電平及脈沖的更新周期,其主要代碼如下:
            memset(&Info, 0, sizeof(MCU_GPIO_INFO));//清零
            //填寫所需的參數
            Info.ucSize = sizeof(MCU_GPIO_INFO);
            Info.ucCmd = MCU_GENERIC_GPIO_SET; //輸出的初始電平為高電平
            //Info.ucCmd = MCU_GENERIC_GPIO_CLR; //輸出的初始電平為低電平
            Info.dwPins = GPIO3 | GPIO2 | GPIO1 | GPIO0; //設置4路脈沖輸出
            Info.dwPeriod = 25; //設置更新周期為25us

     

            接著的生成ChkSum字節和調用DeviceIoControl操作和上一步是一樣的,不再贅述。

     

            設置了更新周期后,硬件協處理器已處于脈沖輸出狀態,只等驅動程序MCU2下傳相應的數據流了。下傳的數據流將按以下數據結構分包逐一下傳:
            typedef struct
            {
                    BYTE ucSize; //本數據結構大小 = 64字節
                    BYTE ucCmd; // = MCU_GENERIC_GPIO_OF
                    BYTE ucRawDat[60]; // 更新數據字節
                    BYTE ucChkSum; //
            } MCU_GPIO_FLOW, *PMCU_GPIO_FLOW; // struct for GPIO

     

            每一個更新數據字節對應著一次更新,所以一包數據可供60個更新周期使用。數據字節的格式是按GPIO的編號右對齊的,即設置的GPIO中,編號最小的那一路,其更新的bit為更新數據字節的LSB(D0),其他數據按編號遞增,向左排列至MSB(D7)。

     

            下傳數據流,同樣需要做ChkSum,再調用DeviceIoControl:
            if (!DeviceIoControl(hMCU2, //File handle to the driver
                    MCU_IOCTL_ACCESS, // I/O control code
                    &Flow, // input buffer
                    sizeof(MCU_GPIO_FLOW), // in buffer size 
                    NULL, // out buffer
                    0, // out buffer size
                    NULL, // pointer to number of bytes returned
                    NULL)) // ignored (=NULL)
            {
                    // 出錯處理......
                    return FALSE;
            }

     

    數據更新流程說明

     

            對任意脈沖發生器功能,EM9380硬件協處理器內部設置有一對256字節的乒乓Buffer。這樣驅動程序MCU2在下傳數據包時,每次可發送4個數據包(第一次下傳1個包即可),這樣可進一步提高主CPU的工作效率。對25us更新周期來說,就表示驅動程序下傳數據的間隔為6ms。一旦第一包數據下傳至硬件協處理器,實質性啟動任意脈沖波形輸出后,當有空閑的乒乓Buffer時,硬件協處理器會立即通知驅動程序MCU2。應用程序可設置專門線程獲取數據請求事件,從而啟動數據下傳。其基本的流程如下:

     

            DWORD dwReturn = 0; // 返回狀態,= 1:數據請求,= 0:超時 
            DWORD dwTimeout = 12; // 12ms,2倍正常下傳間隔

            // 初始下傳一個數據包,然后進入主循環。
            // ......

            // 主循環:等待下傳數據請求
            for(; ;)
            {
                    if (!DeviceIoControl(hMCU2, // File handle to the driver
                            MCU_IOCTL_WAIT_FOR_DATA, // I/O control code
                            &dwTimeout, // input buffer
                            sizeof(DWORD), // in buffer size
                            NULL, // out buffer
                            0, // out buffer size 
                            &dwReturn, // pointer to number of bytes returned
                            NULL)) // ignored (=NULL)
                    {
                            // 出錯處理......
                    }

                    if(dwReturn)
                    {
                            // 下傳數據包(4包)......
                            dwReturn = 0; // 清標志
                    }
            }

    狠狠色伊人久久精品综合网| 亚洲精品无码久久久久久久| 国产精品东北一极毛片| 亚洲国产精品美女| 久久精品免费观看| 国产vA免费精品高清在线观看 | 国产精品igao视频| 国产乱码精品一区二区三区麻豆| 伊人久久大香线蕉精品| 99re国产精品视频首页| 精品一区二区三区中文| 国产精品麻豆欧美日韩WW| 亚洲精品在线免费观看| 无码人妻精品中文字幕| 国产一区二区精品久久凹凸 | 国产精品高清免费网站| 日本精品一区二区三本中文| 国产精品1024永久免费视频| 久久久国产精品无码免费专区| 亚洲线精品一区二区三区| 亚洲日韩国产精品乱| 国产在线精品国自产拍影院同性| 国内精品久久国产| 国产成人精品综合网站| 99re66热这里只有精品17| 久久国产精品久久国产片| 免费精品99久久国产综合精品| 国产精品无码免费专区午夜| 国产AV一区二区精品凹凸| 国产精品模特hd在线| 日本精品啪啪一区二区三区| 国内一级特黄女人精品毛片| 久久久久国产精品免费免费搜索| 亚洲国产精品日韩av不卡在线 | 国内揄拍高清国内精品对白| 成人区精品一区二区不卡 | 国产精品极品美女免费观看| 国产精品一品二区三区的使用体验 | 国产综合精品在线| 欧洲精品免费一区二区三区| 精品国产自在现线久久|