在工業(yè)控制應(yīng)用、特別是要求閉環(huán)控制的實(shí)時(shí)應(yīng)用中,通常都需要實(shí)時(shí)采集模擬信號(hào)。因此作為一款面向?qū)崟r(shí)控制應(yīng)用的工控主板EM9380,配置了最多可達(dá)8路的AD轉(zhuǎn)換單元。為了實(shí)現(xiàn)閉環(huán)控制的高效操作,AD轉(zhuǎn)換是由板上獨(dú)立運(yùn)行的硬件協(xié)處理器(Cortex-M3)來直接操作。應(yīng)用程序通過驅(qū)動(dòng)程序,其設(shè)備文件名為“MCU2:”,來操作AD的功能。在標(biāo)準(zhǔn)配置的EM9380中,其AD單元的基本技術(shù)特性包括:
? 單端輸入采集,可進(jìn)一步選擇單通道、雙通道、4通道及8通道模式。
? 差分輸入采集,可進(jìn)一步選擇單通道、雙通道及4通道模式。
? 采集觸發(fā)模式方面,支持軟件觸發(fā)和閾值觸發(fā)兩種模式。軟件觸發(fā)指一旦應(yīng)用程序調(diào)用相關(guān)API函數(shù),即進(jìn)行數(shù)據(jù)采集;而閾值觸發(fā)模式是指當(dāng)應(yīng)用程序啟動(dòng)AD采集后,
只有當(dāng)輸入的數(shù)據(jù)超出所設(shè)置的門限閾值時(shí),才開始采集數(shù)據(jù),這種模式廣泛應(yīng)用于狀態(tài)監(jiān)測(cè)及波形捕捉等應(yīng)用。
? 采集數(shù)據(jù)方面,支持單點(diǎn)采集和波形采集兩種模式。單點(diǎn)采集指每個(gè)通道僅采集一個(gè)樣點(diǎn);而波形采集則是按設(shè)置的采樣間隔,采集一定長度的數(shù)據(jù)序列,這種模式一般
應(yīng)用于需要分析波形數(shù)據(jù)的場(chǎng)合,如需要做FFT,獲得波形的頻譜特征。
本文后續(xù)部分將針對(duì)EM9380的多通道AD在硬件、軟件方面的特性,具體介紹實(shí)現(xiàn)數(shù)據(jù)采集的相關(guān)步驟。
AD通道的硬件接口說明
EM9380中與AD關(guān)聯(lián)的管腳是GPIO8 – GPIO15,這8路GPIO在上電時(shí)的缺省配置是數(shù)字輸入模式。只有當(dāng)應(yīng)用程序調(diào)用AD轉(zhuǎn)換的API時(shí),其相應(yīng)的管腳才會(huì)轉(zhuǎn)換為模擬輸入狀態(tài)。EM9380共支持7種輸入模式,每種模式使用固定的通道配置,未使用的管腳則保持在GPIO模式。輸入模式與具體管腳的關(guān)系列表如下:
單通道單端輸入
AD通道號(hào) | 信號(hào)輸入管腳 | 備注 |
AD_CH0 | GPIO8 | 與公共GND構(gòu)成信號(hào)回路 |
雙通道單端輸入
AD通道號(hào) | 信號(hào)輸入管腳 | 備注 |
AD_CH0 | GPIO8 | 與公共GND構(gòu)成信號(hào)回路 |
AD_CH1 | GPIO9 | 與公共GND構(gòu)成信號(hào)回路 |
4通道單端輸入
AD通道號(hào) | 信號(hào)輸入管腳 | 備注 |
AD_CH0 | GPIO8 | 與公共GND構(gòu)成信號(hào)回路 |
AD_CH1 | GPIO9 | 與公共GND構(gòu)成信號(hào)回路 |
AD_CH2 | GPIO10 | 與公共GND構(gòu)成信號(hào)回路 |
AD_CH3 | GPIO11 | 與公共GND構(gòu)成信號(hào)回路 |
8通道單端輸入
AD通道號(hào) | 信號(hào)輸入管腳 | 備注 |
AD_CH0 | GPIO8 | 與公共GND構(gòu)成信號(hào)回路 |
AD_CH1 | GPIO9 | 與公共GND構(gòu)成信號(hào)回路 |
AD_CH2 | GPIO10 | 與公共GND構(gòu)成信號(hào)回路 |
AD_CH3 | GPIO11 | 與公共GND構(gòu)成信號(hào)回路 |
AD_CH4 | GPIO12 | 與公共GND構(gòu)成信號(hào)回路 |
AD_CH5 | GPIO13 | 與公共GND構(gòu)成信號(hào)回路 |
AD_CH6 | GPIO14 | 與公共GND構(gòu)成信號(hào)回路 |
AD_CH7 | GPIO15 | 與公共GND構(gòu)成信號(hào)回路 |
單通道差分輸入
AD通道號(hào) | 輸入管腳 | 輸入信號(hào) | 實(shí)際輸入信號(hào) |
AD_CH0 | GPIO8 | AD_CH0+ | AD_CH0+ / AD_CH0- |
GPIO9 | AD_CH0- |
雙通道差分輸入
AD通道號(hào) | 輸入管腳 | 輸入信號(hào) | 實(shí)際輸入信號(hào) |
AD_CH0 | GPIO8 | AD_CH0+ | AD_CH0+ / AD_CH0- |
GPIO9 | AD_CH0- | ||
AD_CH2 | GPIO10 | AD_CH2+ | AD_CH2+ / AD_CH2- |
GPIO11 | AD_CH2- |
4通道差分輸入
AD通道號(hào) | 輸入管腳 | 輸入信號(hào) | 實(shí)際輸入信號(hào) |
AD_CH0 | GPIO8 | AD_CH0+ | AD_CH0+ / AD_CH0- |
GPIO9 | AD_CH0- | ||
AD_CH2 | GPIO10 | AD_CH2+ | AD_CH2+ / AD_CH2- |
GPIO11 | AD_CH2- | ||
AD_CH4 | GPIO12 | AD_CH4+ | AD_CH4+ / AD_CH4- |
GPIO13 | AD_CH4- | ||
AD_CH6 | GPIO14 | AD_CH6+ | AD_CH6+ / AD_CH6- |
GPIO15 | AD_CH6- |
對(duì)于單端輸入,其輸入滿量程為0 – 2.5V,對(duì)應(yīng)的量化數(shù)據(jù)分別為0 – 4095(12-bit AD分辨率)。差分輸入時(shí),數(shù)據(jù)值與輸入電壓的關(guān)系如下表所示:
AD轉(zhuǎn)換數(shù)據(jù)(HEX) | CH+輸入電壓 | CH-輸入電壓 | 備注 |
4095(0xFFF) | 2.5V | 0V | 正向最大差 |
2048(0x800) | CH+ = CH- | ||
0(0x000) | 0 | 2.5V | 反向最大差 |
在標(biāo)準(zhǔn)配置下,各AD通道的輸入阻抗大致為40KΩ。為了保證AD轉(zhuǎn)換的精度,建議前端輸入的模擬信號(hào),應(yīng)根據(jù)實(shí)際信號(hào)的特點(diǎn),加入適當(dāng)?shù)男盘?hào)調(diào)理單元。
接口軟件說明
為了操作EM9380的AD采集功能,首先需要打開硬件協(xié)處理器的驅(qū)動(dòng)程序,其設(shè)備文件名為”MCU2:”(注意是MCU2,而不是MCU1):
#include
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ū)動(dòng)程序MCU2通過DeviceIoControl,支持以下AD采集命令:
MCU_GENERIC_ADC_SE1 // 單端輸入,單通道模式
MCU_GENERIC_ADC_SE2 // 單端輸入,雙通道模式
MCU_GENERIC_ADC_SE4 // 單端輸入,4通道模式
MCU_GENERIC_ADC_SE8 // 單端輸入,8通道模式
MCU_GENERIC_ADC_DI1 // 差分輸入,單通道模式
MCU_GENERIC_ADC_DI2 // 差分輸入,雙通道模式
MCU_GENERIC_ADC_DI4 // 差分輸入,4通道模式
同時(shí)以上命令需通過以下的數(shù)據(jù)結(jié)構(gòu)來設(shè)置相關(guān)參數(shù):
typedef struct
{
BYTE ucSize; // 本數(shù)據(jù)結(jié)構(gòu)大小 = 24字節(jié)
BYTE ucCmd; // AD命令碼:MCU_GENERIC_ADC_XXX
DWORD dwPeriod; // 采樣間隔,單位為us,= 0:軟件觸發(fā)
WORD wData[8]; // 返回的采集數(shù)據(jù)
bool bFlashed; // 保存本配置作為啟動(dòng)缺省功能
BYTE ucChkSum; // 校驗(yàn)和
} MCU_ADC_INFO, *PMCU_ADC_INFO; // struct for ADC
參數(shù)dwPeriod為采樣間隔,設(shè)置為0表示軟件觸發(fā)數(shù)據(jù)采集,不為0,則按設(shè)置的采樣間隔進(jìn)行AD轉(zhuǎn)換。最短采樣間隔為25us,即最高采樣率40Ksps。注意若啟動(dòng)多通道數(shù)據(jù)采集,則每通道的采樣周期為dwPeriod×通道數(shù)。
當(dāng)dwPeriod不為零時(shí),wData[ ]的前三個(gè)值將作為輸入?yún)?shù),其中wData[0]表示采集的總樣點(diǎn)數(shù),wData[1]表示閾值窗口的上限值(最大值=4095),wData[2]表示閾值窗口的下限值(最小值=0)。通過這些參數(shù)的合理邏輯組合,就可實(shí)現(xiàn)以下4種數(shù)據(jù)形式的采集:
dwPeriod | wData[0] | wData[1] | wData[2] | 采集數(shù)據(jù) |
= 0 | - | - | - | 軟件觸發(fā),單點(diǎn)采集 |
> 0 | 通道數(shù) | wData[1] > wData[2] | 閾值觸發(fā),單點(diǎn)采集 | |
> 0 | 通道數(shù)×N | 0 | 0 | 軟件觸發(fā),N點(diǎn)波形采集 |
> 0 | 通道數(shù)×N | wData[1] > wData[2] | 閾值觸發(fā),N點(diǎn)波形采集 |
對(duì)單點(diǎn)數(shù)據(jù)采集,MCU2驅(qū)動(dòng)將以MCU_ADC_INFO數(shù)據(jù)結(jié)構(gòu)的形式回傳采集結(jié)果,其中采集數(shù)據(jù)包含在wData[ ]中,分別對(duì)應(yīng)AD的CH0 – CH7。wData的數(shù)據(jù)格式為:
16-bit AD轉(zhuǎn)換數(shù)據(jù) | |
D15 – D12(4-bit) | D11 – D0(12-bit) |
通道號(hào)(0 – 7) | ADC實(shí)際轉(zhuǎn)換輸出的數(shù)據(jù)值(0 – 4095) |
對(duì)波形采集,為了提高效率,回傳的數(shù)據(jù)采用以下數(shù)據(jù)結(jié)構(gòu)的形式:
typedef struct
{
BYTE ucSize; // 本數(shù)據(jù)結(jié)構(gòu)大小 = 51字節(jié)
BYTE ucCmd; // AD命令碼:MCU_GENERIC_ADC_XXX
WORD wData[24]; // 返回的采集數(shù)據(jù)
BYTE ucChkSum; // 校驗(yàn)和
} MCU_ADC_FLOW, *PMCU_ADC_FLOW; // struct for ADC
24個(gè)采集數(shù)據(jù)將根據(jù)AD采集命令所使用的通道數(shù),順序循環(huán)排列。而每個(gè)數(shù)據(jù)的格式與單點(diǎn)采集數(shù)據(jù)的格式是一樣的。
以下代碼實(shí)現(xiàn)單端輸入8通道,軟件觸發(fā)單點(diǎn)采集:
MCU_ADC_INFO Info; //定義結(jié)構(gòu)對(duì)象
memset(&Info, 0, sizeof(MCU_ADC_INFO));//清零
//填寫所需的參數(shù)
Info.ucSize = sizeof(MCU_ADC_INFO);
Info.ucCmd = MCU_GENERIC_ADC_SE8; //單端8通道輸入
Info.dwPeriod = 0; //軟件觸發(fā),單點(diǎn)采集
// 生成chksum字節(jié)
Info.ucChkSum = ChkSum(&Info, sizeof(MCU_ADC_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_ADC_INFO), // in buffer size
&Info, // out buffer
sizeof(MCU_ADC_INFO), // out buffer size
NULL, // pointer to number of bytes returned
NULL)) // ignored (=NULL)
{
// 出錯(cuò)處理......
return FALSE;
}
// 對(duì)采集的數(shù)據(jù)Info.wData[]進(jìn)行處理......
成都英創(chuàng)信息技術(shù)有限公司 028-8618 0660