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