(一)写入单个电压
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;
}