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

EM9380多路任意脈沖發(fā)生器及應(yīng)用

 2013-8-1              

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

 

接口硬件說明

 

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

 

接口軟件說明

 

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

        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)

 

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

 

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

 

        對于本應(yīng)用來說,首先需要把所選擇的GPIO設(shè)置為輸出模式,具體代碼如下:
        MCU_GPIO_INFO Info; //定義結(jié)構(gòu)對象

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

        // 調(diào)用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;
        }

 

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

 

        接著的生成ChkSum字節(jié)和調(diào)用DeviceIoControl操作和上一步是一樣的,不再贅述。

 

        設(shè)置了更新周期后,硬件協(xié)處理器已處于脈沖輸出狀態(tài),只等驅(qū)動程序MCU2下傳相應(yīng)的數(shù)據(jù)流了。下傳的數(shù)據(jù)流將按以下數(shù)據(jù)結(jié)構(gòu)分包逐一下傳:
        typedef struct
        {
                BYTE ucSize; //本數(shù)據(jù)結(jié)構(gòu)大小 = 64字節(jié)
                BYTE ucCmd; // = MCU_GENERIC_GPIO_OF
                BYTE ucRawDat[60]; // 更新數(shù)據(jù)字節(jié)
                BYTE ucChkSum; //
        } MCU_GPIO_FLOW, *PMCU_GPIO_FLOW; // struct for GPIO

 

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

 

        下傳數(shù)據(jù)流,同樣需要做ChkSum,再調(diào)用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;
        }

 

數(shù)據(jù)更新流程說明

 

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

 

        DWORD dwReturn = 0; // 返回狀態(tài),= 1:數(shù)據(jù)請求,= 0:超時 
        DWORD dwTimeout = 12; // 12ms,2倍正常下傳間隔

        // 初始下傳一個數(shù)據(jù)包,然后進入主循環(huán)。
        // ......

        // 主循環(huán):等待下傳數(shù)據(jù)請求
        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)
                {
                        // 下傳數(shù)據(jù)包(4包)......
                        dwReturn = 0; // 清標(biāo)志
                }
        }

主站蜘蛛池模板: 欧美一区二区三区国产精品| 亚洲大片免费观看| 国产最新地址| 91免费看视频| 久久精品中文| 色综合精品| 亚洲一区二区色| 一级毛片一级毛片一级级毛片| 午夜久久久| 成人欧美视频在线看免费| 欧美噜噜噜| 国产伦精一区二区三区| 黄网在线免费看| 99ri国产在线观看| 国产亚洲精品福利| 欧美无遮挡一区二区三区| 亚洲精品国产男人的天堂| 99久久伊人| 九九精品在线视频| 日韩一级片网址| 午夜草草| 亚洲综合色婷婷中文字幕| 免费一级a毛片在线播放视 | 青青免费视频在线| 亚洲系列在线| 9191国语精品高清在线最新| 三级毛片免费| 久久欧美精品欧美九久欧美| 日韩视频在线观看免费| 亚洲国产精品一区二区久久| 成人做爰免费网站| 欧美一级毛片在线| 欧美激情一区二区三级高清视频| 国产在线视频自拍| 国产欧美日韩一区二区三区视频| 国产精品美女视频| 国产精品视频免费观看| 国产精品第一页在线| 热re99久久国产精品| 谁有毛片网址| 香港三级理论在线观看网站|