SSPC-Tester/Docs/PCIe8586驱动接入资料/Samples/VC/Simple/AD/Finite/Sys.cpp
2026-06-30 12:10:29 +08:00

290 lines
7.0 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 说明: 本程序演示了如何用程序查询方式读取AD数据
#include "stdafx.h"
#include "windows.h"
#include "stdio.h"
#include "conio.h"
#include "ACTS1000.h"
#define AD_DATA_LEN 256*1024 // 要读取和处理的AD数据长度点或字
USHORT ADBuffer[AD_DATA_LEN]; // 分配缓冲区(存储原始数据)
int main(int argc, char* argv[])
{
HANDLE hDevice;
int DeviceLgcID;
ULONG ulDDR2Length = 0;
ACTS1000_PARA_AD ADPara; // 硬件参数
ACTS1000_STATUS_AD ADStatus;
ULONG nRetSizeWords;
ULONG nAvailSampsPoints;
ULONGLONG nReadSizeRemain;
ULONGLONG nReadSizeWords;
ULONG nRead;
ULONG InputRange = ACTS1000_INPUT_N1000_P1000mV;
int nADChannel = 0;
WORD ADData;
float fVolt;
ACTS1000_AD_MAIN_INFO ADMainInfo;
WORD wMaxLSB = 0x3FFF;
float fLsbCount = 16384.0;
DeviceLgcID = 0;
printf("请输入逻辑ID:");
scanf_s("%d", &DeviceLgcID);
hDevice = ACTS1000_CreateDevice(DeviceLgcID); // 创建设备对象
if(hDevice == INVALID_HANDLE_VALUE)
{
printf("CreateDevice error...\n");
_getch();
return 0; // 如果创建设备对象失败,则返回
}
ACTS1000_GetMainInfo(hDevice,&ADMainInfo); // DDR2的长度(单位MB)
switch (ADMainInfo.nDeviceType>>16)
{
case 0x2012:
printf("PXIE%04X\n",ADMainInfo.nDeviceType&0xFFFF);
break;
case 0x2111:
printf("PCIE%04X\n",ADMainInfo.nDeviceType&0xFFFF);
break;
default:
printf("ACTS1000-%04X\n",ADMainInfo.nDeviceType);
}
wMaxLSB = (WORD)(ADMainInfo.nSampCodeCount - 1);
fLsbCount = (float)ADMainInfo.nSampCodeCount;
ULONG nRevisionID = 0;
if(!ACTS1000_GetBusInfo(hDevice, NULL, NULL, NULL, &nRevisionID))
{
printf("ACTS1000_GetBusInfo error...\n");
}
memset(&ADPara, 0x00, sizeof(ADPara)); // 将各项参数复位至确定值0(强烈建议)
// 预置硬件参数
ADPara.SampleMode = ACTS1000_SAMPMODE_FINITE; // 有限点采样
ADPara.FreqDivision = 1;
for (int nCH=0; nCH<ADMainInfo.nChannelCount; nCH++)
{
ADPara.bChannelArray[nCH] = TRUE; // 允许通道0采样
ADPara.InputRange[nCH] = ACTS1000_INPUT_N1000_P1000mV; // 量程只支持±1000mV
ADPara.CouplingType[nCH] = ACTS1000_COUPLING_DC; // 直流耦合
}
ADPara.M_Length = 0; // M长度
ADPara.N_Length = 536870912; // N长度
ADPara.PFISel = ACTS1000_PFISEL_TRIG_IN;
ADPara.TriggerMode = ACTS1000_TRIGMODE_POST; // 硬件中间触发(包括预触发、后触发功能)
ADPara.TriggerSource = ACTS1000_TRIGMODE_SOFT; // 软件触发
ADPara.TriggerDir = ACTS1000_TRIGDIR_NEGATIVE; // 下降沿触发
ADPara.TrigLevelVolt = 0;
ADPara.ReferenceClock = ACTS1000_RECLK_ONBOARD; // 使用内部时钟
ADPara.TimeBaseClock = ACTS1000_TBCLK_IN;
ADPara.bMasterEn = 0;
ADPara.TrigCount = 1; // 为0时表示无限触发
ADPara.SyncTrigSignal = ACTS1000_STS_TRIGGER0;
ADPara.bClkOutEn = 0;
ADPara.ClkOutSel = ACTS1000_CLKOUT_REFERENCE;
ADPara.bTrigOutEn = 0;
ADPara.TrigOutPolarity = ACTS1000_TOP_POSITIVE;
ADPara.TrigOutWidth = 50;
ADPara.bSaveFile = 0;
_stprintf_s(ADPara.chFileName, 256, _T("%s"), L"I:\\3.pci");
if(!ACTS1000_InitDeviceAD(hDevice, &ADPara)) // 初始化硬件
{
printf("InitDeviceAD error...\n");
_getch();
return 0; // 如果创建设备对象失败,则返回
}
int ChannelCount = 0;
for(nADChannel=0; nADChannel<ADMainInfo.nChannelCount; nADChannel++)
{
if(ADPara.bChannelArray[nADChannel] == TRUE)
{
ChannelCount++;
}
}
if (ADPara.TriggerMode == ACTS1000_TRIGMODE_MIDL)
{
nReadSizeWords = (ADPara.M_Length + ADPara.N_Length)*ChannelCount;
}
else
{
nReadSizeWords = ADPara.N_Length;
nReadSizeWords = nReadSizeWords*ChannelCount;
}
if (ADPara.TriggerMode == ACTS1000_TRIGMODE_POST || ADPara.TriggerMode == ACTS1000_TRIGMODE_DELAY)
{
if (ADPara.TrigCount==0)
{
nReadSizeWords = 0xFFFFFFFFFFFFFFFF;
}
else
{
nReadSizeWords = nReadSizeWords*ADPara.TrigCount;
}
}
LONG ulTime = GetTickCount();
double dResult;
__int64 i64Cnt=0;
LONG ulTmp=0;
LONG ulSecCnt=-1;
if(!ACTS1000_StartDeviceAD(hDevice)) // 启动设备
{
printf("StartDeviceAD Error...\n");
_getch();
}
if(!ACTS1000_SetDeviceTrigAD(hDevice)) // 触发AD
{
printf("SetDeviceTrigAD Error...\n");
_getch();
}
ulTime = GetTickCount();
printf("请等待,您可以按任意键退出,但请不要直接关闭窗口强制退出...\n");
if (ADPara.bSaveFile) // 自动存盘
{
while(TRUE)
{
if(!ACTS1000_GetDevStatusAD(hDevice, &ADStatus))
{
printf("GetDevStatusAD Error\n");
goto ExitRead;
}
if(ADStatus.bComplete) // 自动存盘单次有限点任务是否完成
{
printf("有限采样完成按任意键退出\n");
goto ExitRead;
}
else
{
if(_kbhit())
goto ExitRead; // 如果用户按键,则退出
Sleep(1);
ulTmp = GetTickCount()-ulTime;
if (ulTmp/1000>ulSecCnt)
{
ulSecCnt = ulTmp/1000;
dResult = ADStatus.lSavePoints*1.00/((ulTmp+1)/1000.0);
dResult=dResult/1000000.0;
printf("%dS ",ulSecCnt);
printf("%.3fM点/秒\n",dResult);
}
}
}
}
else
{
nReadSizeRemain = nReadSizeWords;
while (nReadSizeRemain>0)
{
if (nReadSizeRemain>=AD_DATA_LEN)
{
nRead = AD_DATA_LEN;
}
else
{
nRead = nReadSizeRemain;
}
NextRead:
if(_kbhit()) goto ExitRead;
if(!ACTS1000_ReadDeviceAD(hDevice, ADBuffer, nRead, &nRetSizeWords, &nAvailSampsPoints,1.0))
{
printf("ReadDeviceAD error...\n");
_getch();
goto ExitRead;
}
if (nRetSizeWords<=0)
{
goto NextRead;
}
nReadSizeRemain = nReadSizeRemain-nRetSizeWords;
#if 1
ulTmp = GetTickCount()-ulTime;
if (ulTmp/1000>ulSecCnt)
{
ulSecCnt = ulTmp/1000;
dResult = (nReadSizeWords-nReadSizeRemain)*1.00/((ulTmp+1)/1000.0);
dResult=dResult/1000000.0;
printf("%dS ",ulSecCnt);
printf("%.3fM点/秒\n",dResult);
ULONG nTChannel = 0;
for(int Index=0; Index<8; Index++)
{
for(nADChannel=nTChannel; nADChannel<ChannelCount; nADChannel++)
{
if(ADPara.bChannelArray[nADChannel] == TRUE) // 如果此通道被采样
{
nTChannel = nADChannel + 1;
ADData = ADBuffer[Index]&wMaxLSB;
// 将原码转换为电压值
switch(InputRange)
{
case ACTS1000_INPUT_N1000_P1000mV: // -1000mV - +1000mV
fVolt = (float)((2000.0/fLsbCount) * ADData - 1000.0);
break;
case ACTS1000_INPUT_N5000_P5000mV: // -5000mV - +5000mV
if (nRevisionID == 0xD0)
{
fVolt = (float)((20000.0/fLsbCount) * ADData - 10000.0); // -1000mV - +1000mV
}
else
{
fVolt = (float)((10000.0/fLsbCount) * ADData - 5000.0);
}
break;
case ACTS1000_INPUT_N10000_P10000mV: // -10000mV - +10000mV
fVolt = (float)((20000.0/fLsbCount) * ADData - 10000.0);
break;
default:
break;
}
printf("CH%02d=%6.2f\t", nADChannel, fVolt); // 显示电压值
if ((Index+1) % ChannelCount == 0)
{
nTChannel = 0;
printf("\n");
}
break;
}
}
} // for(Index=0; Index<64; Index++)
}
#endif
}
if (nReadSizeRemain==0)
{
printf("有限点采样(%I64d字节)完成按任意键退出\n", nReadSizeWords*2);
}
}
ExitRead:
ACTS1000_StopDeviceAD(hDevice); // 停止AD
ACTS1000_ReleaseDeviceAD(hDevice); // 释放AD
ACTS1000_ReleaseDevice(hDevice); // 释放设备对象
_getch();
return 0;
}