• 用C语言给NI公司数据采集卡编程序进行电压数据采集


      NI公司有很多款性能比较好的数据采集卡,我实验室有数据采集卡6353和USB-6210,都是USB连接电脑,只是供电方式不同,通道数目不同,我都编过一些程序,程序编写是一样的,都是调用NI公司提供的DAQmx里面的函数,让数据采集卡按照我们的要求工作,这里我只介绍USB-6210吧。

      刚开始学数据采集卡时,关于数据采集卡的C语言程序时不好找,大多数是通过NI公司的labview控制的,用C语言控制的比较少,所以在这里讲解一下,希望能对大家有用。

      好,现在正式开始,最近几天在实验室采集压力传感器的数据,用的是NI公司的数据采集卡,压力传感器输出的是电压信号,经过数据采集卡的模数转换和采集以后传到电脑上,编程环境:VS2010和VS2015都可以。

      首先,买数据采集卡的时候会带有一个光盘,这个光盘里面有很多产品信息和一些配套软件,首先安装NI-DAQmx驱动程序,具体的安装方法光盘里面的有个文档有专门讲解,挺简单的,就不介绍了,下面主要介绍一下如何编程控制数据采集卡。

      先介绍C语言版的吧,安装完DAQmx驱动程序以后我们可以找到官方给的C语言例程:开始->所有程序->National Instruments->NI DAQmx->NI DAQmx范例/NI DAQmx 文档,范例可以找到例程,文档里面包含一些NI DAQmx的文档链接,文档里面对于编程最有用的是NI-DAQmx C Reference Help ,它提供了编程需要的API。这个网上也可以搜到。

      首先新建一个项目,项目建成以后开始编程,

      第一步:将NIDAQmx.h头文件和官方提供的库文件NIDAQmx.lib复制粘贴到所建项目下面

      第二步:在项目里面加入NIDAQmx.h头文件和NIDAQmx.lib

      第三步:在.cpp文件中将NIDAQmx.h头文件和NIDAQmx.lib加入,代码如下

    1 #include "NIDAQmx.h"
    2 #pragma comment(lib,"NIDAQmx.lib")

      第四步:调用API中的函数编程序实现自己想实现的数据采集方式,

      数据采集方式有很多种,我常用的是每次采集有限个数据连续不断的采集两种采集方式,这里介绍前一种数据采集方式,后一种采集方式的实现我会另外写一篇博客。

      啥也不说了,上代码:

     1 #include <stdio.h>
     2 #include "NIDAQmx.h"
     3 #pragma comment(lib,"NIDAQmx.lib")
     4 #include<iostream>
     5 using namespace std;
     6  
     7 #define DAQmxErrChk(functionCall) if( DAQmxFailed(error=(functionCall)) ) goto Error; else
     8 float64   data[6000], last=0;
     9 float64* Smooth(float64 data[]);
    10 #define N 12
    11 #define M 20
    12  
    13 int main(void)
    14 {
    15     int32       error=0;
    16     TaskHandle  taskHandle=0;
    17     int32       read;
    18     char        errBuff[2048]={''};
    19     memset(data, 0, sizeof(float64) * 6000);
    20     /*********************************************/
    21     // DAQmx Configure Code
    22         //第一步:创建任务
    23         //第二步:创建电压输入通道
    24         //第三步:配置采样时钟
    25         //第四步:进行终端配置,这个将决定怎么连接电路。
    26         //第五步:开始任务
    27         //第六步:读取数据
    28         //第七步:对数据进行保存和处理,这里是保存了原始数据,然后进行滤波,最后保存滤波后的数据,
    29         //都保存到txt文档中了
    30      /*********************************************/
    31     DAQmxErrChk (DAQmxCreateTask("",&taskHandle));
    32     DAQmxErrChk (DAQmxCreateAIVoltageChan(taskHandle,"Dev2/ai0","",DAQmx_Val_Cfg_Default  ,-10.0,10.0,DAQmx_Val_Volts,NULL));
    33     DAQmxErrChk (DAQmxCfgSampClkTiming(taskHandle,"",10000.0,DAQmx_Val_Rising,DAQmx_Val_FiniteSamps,6000));
    34     
    35     DAQmxErrChk (DAQmxSetAITermCfg(taskHandle,"Dev2/ai0",DAQmx_Val_RSE));
    36     /*********************************************/
    37     // DAQmx Start Code
    38     /*********************************************/
    39     DAQmxErrChk (DAQmxStartTask(taskHandle));
    40  
    41     /*********************************************/
    42     // DAQmx Read Code
    43     /*********************************************/
    44     DAQmxErrChk (DAQmxReadAnalogF64(taskHandle,6000,10.0,DAQmx_Val_GroupByChannel,data,6000,&read,NULL));
    45  
    46         FILE *fp1=fopen("data1.txt","w+");
    47  
    48         for(int l=0;l<6000;l++)
    49          {
    50              fprintf(fp1,"%f",data[l]);
    51              fputc(',',fp1);
    52              fprintf(fp1,"%f",0.0001*l);
    53              fputc('
    ',fp1);
    54          }
    55         fclose(fp1);
    56         for(int i=0;i<M;i++)  //滤波的次数
    57         {
    58             Smooth(data);
    59         }
    60         FILE *fp2=fopen("data2.txt","w+");
    61         for(int l=0;l<6000;l++)
    62          {
    63              fprintf(fp2,"%f",data[l]);
    64              fputc(',',fp2);
    65              fprintf(fp2,"%f",0.0001*l);
    66              fputc('
    ',fp2);
    67          }
    68         fclose(fp2);
    69     printf("Acquired %d points
    ",(int)read);
    70  
    71 Error:
    72     if( DAQmxFailed(error) )
    73         DAQmxGetExtendedErrorInfo(errBuff,2048);
    74     if( taskHandle!=0 )  {
    75         /*********************************************/
    76         // DAQmx Stop Code
    77         /*********************************************/
    78         DAQmxStopTask(taskHandle);
    79         DAQmxClearTask(taskHandle);
    80     }
    81     if( DAQmxFailed(error) )
    82         printf("DAQmx Error: %s
    ",errBuff);
    83     printf("End of program, press Enter key to quit
    ");
    84     getchar();
    85     return 0;
    86 }
    87 float64* Smooth(float64 data[])
    88 {
    89 //添加自己的滤波算法,我用的是滑动平均滤波,具体实现我会另外写一篇博客
    90 }

      这是一个简单的NI数据采集卡的程序,只采集了有限个数据,进行了滤波和数据存储,我还实现过连续的数据采集,并且实现了C++类的封装和调用,这个我会另外写一篇博客。

      如果有问题,请在底下留言,谢谢大家观看。

  • 相关阅读:
    【CSS3】纯CSS3制作页面切换效果
    【CSS3】分类豆腐块菜单浮动效果
    【CSS3】使用CSS3制作全屏切换效果
    【JQ】toggle / slideToggle / fadeToggle 的区别
    【CSS3 + 原生JS】上升的方块动态背景
    【CSS3 + 原生JS】移动的标签
    【原生JS】简单取随机数
    【原生JS】键盘事件
    【CSS3】loading动画
    【原生JS】层叠轮播图
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/14373420.html
Copyright © 2020-2023  润新知