使用C++语言利用NIDAQmx库进行加速度传感器的数据采集

目录

项目背景

NI-DAQmx是什么?

具体流程

创建任务

设置耦合创建使用加速度计测量加速度的通道

配置采样时钟

启动任务

读取数据

停止任务

清除任务


项目背景

本次项目需要利用NI采集卡:NI 9232,振动加速度传感器:PCB 356A44对待测量产品进行震动方面的测量,并输出时域数据与频域数据;

IDE:Qt Creator

Qt版本:Qt 5.7.0 MSVC2013 32bit

编译器:Microsoft Visual C++ Compiler 12.0(x86)

NI-DAQmx是什么?

NI-DAQmx是用于与NI数据采集(DAQ)设备通信并控制设备的驱动程序软件。它包含一个用途广泛的函数和VI库,可从LabVIEW或LabWindows/CVI中调用库函数,对NI设备进行编程。

具体流程

创建任务

如果使用此函数创建任务,则必须使用DAQmxClearTask来销毁它。
如果在循环中使用此函数,NI DAQmx会在循环的每次迭代中创建一个新任务。完成任务后,请在循环中使用DAQmxClearTask函数,以避免分配不必要的内存。
InputtaskNameconst char []分配给任务的名称。 此名称可能会在内部更改。如果您使用的是C API,请调用DAQmxGetTaskName验证名称是否在创建过程中更改。
OutputtaskHandleTaskHandle *对此函数中创建的任务的引用。
Return Valuestatusint32函数在出现错误或警告时返回的错误代码。值为0表示成功。正值表示警告。负值表示错误。
int Ret = DAQmxCreateTask("NI Collect", &taskHandle);
if(Ret!=0)
{
    std::string strMessage = "CreateTask false创建任务失败,错误代码:"+std::to_string(Ret);
    CLogShow::Instance()->Add(strMessage.c_str());//写入日志文件
    return false;
}


创建使用加速度计测量加速度的通道

创建使用加速度计测量加速度的通道,并将通道添加到使用taskHandle指定的任务中。
Input
taskHandle
TaskHandle
将此函数创建的通道添加到的任务。
physicalChannel
const char []
用于创建虚拟通道的物理通道的名称。您可以指定物理通道的列表或范围。
nameToAssignToChannel
const char []
要分配给创建的虚拟通道的名称。如果未指定名称,NI DAQmx将使用物理通道名称作为虚拟通道名称。如果为nameToAssignToChannel指定自己的名称,则在其他NI DAQmx函数中引用这些通道时必须使用这些名称。
terminalConfig
int32
通道的输入端子配置。
minVal
float64
期望测量的最小值(单位)。
maxVal
float64
期望测量的最大值(单位)。
units
int32
用于从通道返回加速度测量值的单位。
sensitivity
float64
传感器的灵敏度。该值以您使用sensivityUnits输入指定的单位为单位。请参阅传感器文档以确定该值。
sensitivityUnits
int32
灵敏度的单位。
currentExcitSource
int32
激发源。
currentExcitVal
float64
传感器所需的励磁量,以安培为单位。
customScaleName
const char []
要应用于通道的自定义比例的名称。若要使用此参数,必须将单位设置为DAQmx_Val_FromCustomScale。如果未将单位设置为DAQmx_Val_FromCustomScale,则必须将customScaleName设置为NULL。
Return Value
status
int32
函数在出现错误或警告时返回的错误代码。值为0表示成功。正值表示警告。负值表示错误。
float64 minVal = -10;//最小值
float64 maxVal =10;//最大值
float64 sensitivity = 50;//灵敏度
Ret = DAQmxCreateAIAccelChan(taskHandle,m_strPhysicalChannel.c_str(),"",DAQmx_Val_PseudoDiff,minVal,maxVal,DAQmx_Val_AccelUnit_g,sensitivity,DAQmx_Val_mVoltsPerG,DAQmx_Val_Internal,0.004,NULL);
if(Ret!= 0)
{
    std::string strMessage = "加速度通道创建失败:"+std::to_string(Ret);
    CLogShow::Instance()->Add(strMessage.c_str());
    return false;
}

设置耦合

DAQmx_Val_AC
从信号中去除直流偏移。
DAQmx_Val_DC
允许NI DAQmx测量所有信号。
DAQmx_Val_GND
从测量中去除信号,只测量接地。
Ret = DAQmxSetAICoupling(taskHandle, m_strPhysicalChannel.c_str(), DAQmx_Val_AC);
if(Ret!=0)
{
    std::string strMessage = "设置耦合方式失败:"+std::to_string(Ret);
    CLogShow::Instance()->Add(strMessage.c_str());
    return false;
}

配置采样时钟

int iPackNum = iTime/1000;//10s重复10次
int32 SampsPerChan = iFrequence*iPackNum;//每个通道的采样总数500000
Ret =  DAQmxCfgSampClkTiming(taskHandle, "", (float)iFrequence, DAQmx_Val_Rising, DAQmx_Val_FiniteSamps, SampsPerChan);
if(Ret != 0)//错误代码-200477表示无法配置采样时钟,可能是由于设备不支持所需的采样时钟源或采样时钟速率导致的。//采样频率50000,需要采集500000个数据后退出任务
{
    std::string strMessage = "4配置采样率失败,错误代码:"+std::to_string(Ret);
    CLogShow::Instance()->Add(strMessage.c_str());
    return false;
}

启动任务

Ret = DAQmxStartTask(taskHandle);
if(Ret!= 0)//错误代码-200478通常表示采集任务无法启动,可能是由于设备未准备好或采集任务未正确配置导致的。
{
    std::string strMessage = "5启动任务失败,错误代码:"+std::to_string(Ret);
    CLogShow::Instance()->Add(strMessage.c_str());
    return false;
}

读取数据

taskHandle
是任务句柄,表示要读取的任务;
numSampsPerChan
是每个通道要读取的样本数;
timeout
是等待数据可用的超时时间;
fillMode
表示当读取的样本数小于 numSampsPerChan 时,是否使用默认值填充缺失数据;
readArray
是用于存储读取数据的数组;
arraySizeInSamps
是 readArray 的大小(以样本数为单位);
sampsPerChanRead
是实际读取的样本数;
reserved
保留参数,应设置为 nullptr。
int32 ArraySizeInSamps = iFrequence*iPackNum; //样本数组大小
int32 SamesPerChanRead;//读取之后实际读取的样本数会存入这里;
Ret = DAQmxReadAnalogF64(taskHandle,SampsPerChan,10.0,DAQmx_Val_GroupByChannel,pBuffer->begin(),ArraySizeInSamps,&SamesPerChanRead,NULL);//阻塞采集,每秒采集50000个数据,采集满500000个数据才退出
if(Ret!= 0)//错误代码-200478通常表示采集任务无法启动,可能是由于设备未准备好或采集任务未正确配置导致的。
{
    std::string strMessage = "6读取数据失败,错误代码:"+std::to_string(Ret);
    CLogShow::Instance()->Add(strMessage.c_str());
    return false;
}

停止任务

DAQmxStopTask(taskHandle);

清除任务

DAQmxClearTask(taskHandle);
  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值