NI -- 用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加入,代碼如下:

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

第四步:調用API中的函數編程序實現自己想實現的數據采集方式,數據采集方式有很多種,我常用的是每次采集有限個數據和連續不斷的采集兩種采集方式,這里介紹前一種數據采集方式,后一種采集方式的實現我會另外寫一篇博客。

啥也不說了,上代碼:

#include <stdio.h>
#include "NIDAQmx.h"    
#pragma comment(lib,"NIDAQmx.lib")
#include<iostream>
using namespace std;

#define DAQmxErrChk(functionCall) if( DAQmxFailed(error=(functionCall)) ) goto Error; else
float64   data[6000], last=0;
float64* Smooth(float64 data[]);
#define N 12
#define M 20

int main(void)
{
    int32       error=0;
    TaskHandle  taskHandle=0;
    int32       read;
    char        errBuff[2048]={'\0'};
    memset(data, 0, sizeof(float64) * 6000);
    /*********************************************/
    // DAQmx Configure Code
        //第一步:創建任務
        //第二步:創建電壓輸入通道
        //第三步:配置采樣時鍾
        //第四步:進行終端配置,這個將決定怎么連接電路。
        //第五步:開始任務
        //第六步:讀取數據
        //第七步:對數據進行保存和處理,這里是保存了原始數據,然后進行濾波,最后保存濾波后的數據,
        //都保存到txt文檔中了
     /*********************************************/
   DAQmxErrChk (DAQmxCreateTask("",&taskHandle));
   DAQmxErrChk (DAQmxCreateAIVoltageChan(taskHandle,"Dev2/ai0","",DAQmx_Val_Cfg_Default  ,-10.0,10.0,DAQmx_Val_Volts,NULL));
   DAQmxErrChk (DAQmxCfgSampClkTiming(taskHandle,"",10000.0,DAQmx_Val_Rising,DAQmx_Val_FiniteSamps,6000));

   DAQmxErrChk (DAQmxSetAITermCfg(taskHandle,"Dev2/ai0",DAQmx_Val_RSE));
 /*********************************************/
// DAQmx Start Code
/*********************************************/
DAQmxErrChk (DAQmxStartTask(taskHandle));

/*********************************************/
// DAQmx Read Code
/*********************************************/
DAQmxErrChk (DAQmxReadAnalogF64(taskHandle,6000,10.0,DAQmx_Val_GroupByChannel,data,6000,&read,NULL));

	FILE *fp1=fopen("data1.txt","w+");

	for(int l=0;l<6000;l++)
	 {
		 fprintf(fp1,"%f",data[l]);
		 fputc(',',fp1);
		 fprintf(fp1,"%f",0.0001*l);
		 fputc('\n',fp1);
	 }
	fclose(fp1);
	for(int i=0;i<M;i++)  //濾波的次數
	{
		Smooth(data);
	}
	FILE *fp2=fopen("data2.txt","w+");
	for(int l=0;l<6000;l++)
	 {
		 fprintf(fp2,"%f",data[l]);
		 fputc(',',fp2);
		 fprintf(fp2,"%f",0.0001*l);
		 fputc('\n',fp2);
	 }
	fclose(fp2);
printf("Acquired %d points\n",(int)read);

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;
}
float64* Smooth(float64 data[])
{
//添加自己的濾波算法,我用的是滑動平均濾波,具體實現我會另外寫一篇博客
}

這是一個簡單的NI數據采集卡的程序,只采集了有限個數據,進行了濾波和數據存儲,我還實現過連續的數據采集,並且實現了C++類的封裝和調用,這個我會另外寫一篇博客。

如果有問題,請在底下留言,謝謝大家觀看。

https://blog.csdn.net/lubilie969/article/details/78107738


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM