使用C++通过USB控制NI-9263实现模拟电压输出

发布于:2022-08-07 ⋅ 阅读:(1900) ⋅ 点赞:(2)

(一)写入单个电压

1,下载NI DAQmx 

2,USB连接DAQ仪器;NI MAX中查看是否找到DAQ仪器 (这里是9171机箱+9263DAQ)并测试自检 电压输出是否正常

3,NI提供了C++ 的sample 

C:\Users\Public\Documents\National Instruments\NI-DAQ\Examples\DAQmx ANSI C

4,打开C++的sample之后 需要进行配置头文件目录和库目录

5,配置Windows SDK 8.1 (7条消息) 彻底解决VS中找不到 Windows SDK 版本 8.1的错误_振华OPPO的博客-CSDN博客_找不到windowssdk版本8.1

 6,C++ 代码中的设备名称修改为与NI MAX显示的一致 

 data为输出的电压,经测试,输出电压与写入电压一致。

(二)输出波形

1,NI-DAQmax提供了模拟输出的例程

 2,选择Analog Out 模拟电压输出 其中有根据内部时钟任意波形输出

 3,需要依照(一)中说明配置好 头文件和库目录 代码说明添加到注释中


#include <NIDAQmx.h>
#include <stdio.h>
#include <math.h>

#define DAQmxErrChk(functionCall) if( DAQmxFailed(error=(functionCall)) ) goto Error; else

#define PI	3.1415926535

int32 CVICALLBACK DoneCallback(TaskHandle taskHandle, int32 status, void *callbackData);

int main(void)
{
	int32       error=0;
	TaskHandle  taskHandle=0;
	float64     data[1000];
	char        errBuff[2048]={'\0'};
	int         i=0;

	for(;i<1000;i++)
		data[i] = 9.95*sin((double)i*2.0*PI/1000.0);

	/*********************************************/
	// DAQmx Configure Code
	/*********************************************/
	DAQmxErrChk (DAQmxCreateTask("",&taskHandle));    //在taskhandle处创建一个默认的task

	//创建一个模拟电压输出的通道 使用“cDAQ1Mod1”这个仪器的“ao0”通道 “-10.0”和“10.0”是电压输出的范围  后面两个参数不确定作用是什么
	DAQmxErrChk (DAQmxCreateAOVoltageChan(taskHandle,"cDAQ1Mod1/ao0","",-10.0,10.0,DAQmx_Val_Volts,NULL));  
	//配置时钟 第二个参数的""指使用默认的内部时钟,“10000.0”是时钟的刷新频率 越大越快 这个时钟应该是一个内部的方波信号 所以这里采用上升沿触发 sample是输入的常值 “1000”是sample数量
	DAQmxErrChk (DAQmxCfgSampClkTiming(taskHandle,"",100000.0,DAQmx_Val_Rising,DAQmx_Val_ContSamps,1000));

	DAQmxErrChk (DAQmxRegisterDoneEvent(taskHandle,0,DoneCallback,NULL));

	/*********************************************/
	// DAQmx Write Code
	/*********************************************/
	// “1000”是点数 0应该是自动循环执行 “10.0”是timeout时间  data是写入的数组
	DAQmxErrChk (DAQmxWriteAnalogF64(taskHandle,1000,0,10.0,DAQmx_Val_GroupByChannel,data,NULL,NULL));

	/*********************************************/
	// DAQmx Start Code
	/*********************************************/
	DAQmxErrChk (DAQmxStartTask(taskHandle));

	printf("Generating voltage continuously. Press Enter to interrupt\n");
	getchar();

Error:
	if( DAQmxFailed(error) )
		DAQmxGetExtendedErrorInfo(errBuff,2048);
	if( taskHandle!=0 ) {
		/*********************************************/
		// DAQmx Stop Code
		/*********************************************/
		DAQmxStopTask(taskHandle);
		DAQmxClearTask(taskHandle);
	}
	if( DAQmxFailed(error) )
		printf("DAQmx Error: %s\n",errBuff);
	printf("End of program, press Enter key to quit\n");
	getchar();
	return 0;
}

int32 CVICALLBACK DoneCallback(TaskHandle taskHandle, int32 status, void *callbackData)
{
	int32   error=0;
	char    errBuff[2048]={'\0'};

	// Check to see if an error stopped the task.
	DAQmxErrChk (status);

Error:
	if( DAQmxFailed(error) ) {
		DAQmxGetExtendedErrorInfo(errBuff,2048);
		DAQmxClearTask(taskHandle);
		printf("DAQmx Error: %s\n",errBuff);
	}
	return 0;
}


网站公告

今日签到

点亮在社区的每一天
去签到