01示例程序

#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;
							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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值