?? sys.cpp
字號:
// 本程序演示了如何進行AD采樣的過程
#include "stdafx.h"
#include "conio.h"
#include "USB2814.h"
char key;
int InputRange;
int SelectInputRange(void);
int main(int argc, char* argv[])
{
HANDLE hDevice; // 設備對象句柄
int DeviceLgcID; // 物理設備ID號(由板上JP1決定)
BOOL bReturn; // 函數的返回值
int nReadSizeWords; // 每次讀取AD數據個數
LONG nRetWords; // 實際讀取的數據個數
int nChannelCount = 0; // 采樣通道數
WORD ADBuffer[ 32768 ]; // 接收AD 數據的緩沖區
float Volt; // 將AD原始數據轉換為電壓值
int nRemainder = 0;
USB2814_PARA_AD ADPara; // 初始化AD的參數結構
ADPara.CheckStsMode = USB2814_CHKSTSMODE_HALF; // 查詢FIFO的非空標志
ADPara.ADMode = USB2814_ADMODE_SEQUENCE; // 選擇連續采集模式
ADPara.FirstChannel = 0; // 首通道0
ADPara.LastChannel = 3; // 末通道3
ADPara.Frequency = 25000; // 采樣頻率設為25KHz
ADPara.GroupInterval = 1000; // 組間間隔設為1000微秒
ADPara.LoopsOfGroup = 1; // 組內循環次數設為1次
ADPara.Gains = USB2814_GAINS_1MULT; // 使用1倍增益
ADPara.TriggerMode = USB2814_TRIGMODE_SOFT; // 觸發模式選擇軟件內觸發
ADPara.TriggerType = USB2814_TRIGTYPE_EDGE; // 觸發類型選擇邊沿觸發
ADPara.ClockSource = USB2814_CLOCKSRC_IN;
ADPara.bClockOutput = FALSE;
InputRange = SelectInputRange();
nChannelCount = ADPara.LastChannel - ADPara.FirstChannel + 1; // 采樣通道數
DeviceLgcID = 0; // 設備ID號, 假設系統中只有一個USB2814設備,即DeviceLgcID=0;
hDevice = USB2814_CreateDevice(DeviceLgcID); // 創建設備對象
if(hDevice == INVALID_HANDLE_VALUE) { printf("Create Device Error\n"); return 0; }
// USB2814_ListDeviceDlg();
bReturn = USB2814_InitDeviceAD( hDevice, &ADPara ); // 初始化AD
if (!bReturn)
{
printf( "USB2814_InitDeviceAD Error\n" );
getch();
goto ExitReleaseDevice;
}
nReadSizeWords = 2048;
nRemainder = 2048 % nChannelCount;
nReadSizeWords = 2048 - nRemainder; // 讀取數據的大小(整個RAM長度64K)
while (!kbhit()) // kbhit()探測用戶是否有按鍵動作,若有按鍵則退出
{
if(!USB2814_ReadDeviceAD(hDevice, ADBuffer, nReadSizeWords, &nRetWords)) // 讀取AD轉換數據
{
printf("ReadDeviceAD Error...\n");
getch();
goto ExitReleaseDeviceAD;
}
int nChannel = ADPara.FirstChannel;
for (int Index=0; Index<64; Index++) // 總共顯示64個點的AD數據
{
switch(InputRange) // 根據量程選擇,將AD原碼按相應公式換算成電壓值
{
case USB2814_INPUT_N10000_P10000mV: // ±10V
Volt = (float)((20000.00/65536) * ADBuffer[Index] - 10000.00); // 將AD數據轉換為電壓值
break;
case USB2814_INPUT_N5000_P5000mV: // ±5V
Volt = (float)((10000.00/65536) * ADBuffer[Index] - 5000.00); // 將AD數據轉換為電壓值
break;
case USB2814_INPUT_N2500_P2500mV: // ±2.5V
Volt = (float)((5000.00/65536) * ADBuffer[Index] - 2500.00); // 將AD數據轉換為電壓值
break;
case USB2814_INPUT_0_P10000mV: // 0~10V
Volt = (float)((10000.00/65536) * ADBuffer[Index]); // 將AD數據轉換為電壓值
break;
case USB2814_INPUT_0_P5000mV: // 0~5V
Volt = (float)((5000.00/65536) * ADBuffer[Index]); // 將AD數據轉換為電壓值
break;
}
printf( "[AI%d]=%8.2f\t", nChannel, Volt);
nChannel++; // 通道號遞加,準備換算下一個通道的數據
if (nChannel>ADPara.LastChannel) // 如果換算到末通道,再回到首通道
{
printf("\n"); // 將顯示光標位置移到下一項
nChannel = ADPara.FirstChannel;
}
} // 多點數據換算顯示
} // 循環采集
ExitReleaseDeviceAD:
USB2814_ReleaseDeviceAD(hDevice); // 釋放AD,停止AD數據轉換
ExitReleaseDevice:
USB2814_ReleaseDevice(hDevice); // 釋放設備對象
return 0;
}
//////////////////////////////////////////////////////
// 獲取用戶選擇的輸入量程
int SelectInputRange(void)
{
LONG InputRange;
Repeat:
printf("\n");
printf("0. -10V ~ +10V\n");
printf("1. -5V ~ +5V\n");
printf("2. -2.5V ~ +2.5V\n");
printf("3. 0V ~ +10V\n");
printf("4. 0V ~ +5V\n");
printf("Please Select Input Range[0-4]:");
scanf("%d", &InputRange);
if(InputRange<0 || InputRange>4) goto Repeat; // 判斷用戶選擇的量程是否合法,不合法,則重新選擇
return InputRange;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -