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