LabVIEW控制Arduino采集多路模擬量、數字量(進階篇—1)
1
項目概述
數據采集,是指從傳感器和其他待測設備的模擬和數字被測單元中自動采集信息的過程。能夠實現數據采集功能的系統叫作數據采集系統。
數據采集系統的任務,就是將傳感器輸出的信號轉換成計算機能識別的信號并送入計算機進行處理,然后將處理得到的數據進行顯示或打印,以便實現對某些物理量的監測,其中一些參數還會被計算機控制系統用于計算輸出的控制量,以實現將某些物理量的控制在某一水平。
Arduino控制器均具有模擬輸入功能,Uno擁有6路模擬輸入端口(A0到A5),每一路具有10位的分辨率(即輸入有1024個不同值),默認輸入信號范圍為0到5V,并且可以通過AREF調整參考電壓。
2
項目架構
采用Arduino Uno與LabVIEW來實現低成本上下位機數據采集系統,具有模擬量和數字量兩種采集功能,可以滿足低速、低成本的數據采集需求。其中,Arduino Uno作為下位機,負責A/D轉換以及數據傳輸,LabVIEW編寫的數據采集軟件作為上位機,上下位機通過USB-TTL接口實現通信。如下圖所示為多路數據采集系統框圖。
3
硬件環境
數據采集系統中的Arduino下位機部分采用Arduino Uno控制器,模擬量采用電位器分壓來實現不同電壓值,數字量采用撥動開關在5V和GND之間切換實現高電平與低電平。多路數據采集系統硬件連接如下圖所示:

4
Arduino功能設計
Arduino下位機部分需要完成兩個功能:數據采集和數據傳輸,Arduino Uno控制板通過USB-TTL電纜接收上位機發來的命令,完成相應的數據采集,并將采集的數據回傳至LabVIEW上位機軟件。
數據采集分為模擬量采集和數字量采集兩種,此處設置采集路數各為2路,分別采用Arduino Uno控制器上具有模擬量輸入的管腳A0、A1和具有數字量輸入的管腳2、3。
Arduino Uno控制器負責讀取LabVIEW上位機發來的采集命令,并采集相應的數據,通過串口發送回上位機LabVIEW軟件。Arduino Uno控制器的程序代碼如代碼如下所示:
#define A0_Command 0x10 //A0采集命令字#define A1_Command 0x11 //A1采集命令字#define D0_Command 0x20 //D0采集命令字#define D1_Command 0x21 //D1采集命令字 byte comdata[3]={0}; //定義數組數據,存放串口接收數據 int AD_Value=0; //AD轉換后的數字量float float_AD_Value; //數字量換算成浮點電壓量int D_Value=0; //數字量測量的數據 void receive_data(void); //接受串口數據void test_do_data(void); //測試串口數據是否正確,并更新數據 void setup(){ Serial.begin(9600); pinMode(2, INPUT); pinMode(3, INPUT);}void loop(){ while (Serial.available() > 0) //不斷檢測串口是否有數據 { receive_data(); //接受串口數據 test_do_data(); //測試數據是否正確并更新標志位 }}void receive_data(void) { int i ; for(i=0;i<3;i++) { comdata[i] =Serial.read(); //延時一會,讓串口緩存準備好下一個字節,不延時可能會導致數據丟失, delay(2); }} void test_do_data(void){ if(comdata[0] == 0x55) //0x55和0xAA均為判斷是否為有效命令 { if(comdata[1] == 0xAA) { switch(comdata[2]) { case A0_Command: AD_Value = analogRead(A0); //讀取A0電壓值 float_AD_Value=(float)AD_Value/1023*5.00; //換算為浮點電壓值 Serial.println(float_AD_Value,2); //保留兩位小數發送數據 break; case A1_Command: AD_Value = analogRead(A1); //讀取A0電壓值 float_AD_Value=(float)AD_Value/1023*5.00; //換算為浮點電壓值 Serial.println(float_AD_Value,2); //保留兩位小數發送數據 break; case D0_Command: D_Value = digitalRead(2); //讀取D2數字量 Serial.println(D_Value); //發送數字量測量數據 break; case D1_Command: D_Value = digitalRead(3); //讀取D2數字量 Serial.println(D_Value); //發送數字量測量數據 break; } } }}
5
LabVIEW功能設計
LabVIEW上位機部分需要完成兩個功能:向下位機發送命令幀和將數據顯示在前面板上,Arduino Uno控制板通過串口接收上位機命令,完成相應的數據采集,并將數據回傳至上位機。
數據采集分為模擬量采集和數字量采集,設置采集路數各為2路,分別采用ArduinoUno上具有模擬量輸入的管腳A0、A1和具有數字量輸入的管腳2、3來實現。模擬量采用電位器分壓來實現不同電壓值,數字量采用撥動開關在5V和GND之間切換實現高電平與低電平。
5.1、前面板設計
LabVIEW前面板分為模擬量采集和數字量采集兩個部分,模擬量采集部分主要針對模擬量輸出的傳感器,數字量采集部分主要針對數字量的輸入。
LabVIEW上位機前面板設計如下圖所示:

5.2、程序框圖設計
由于有2路模擬量和2路數字量,不同通道的模擬量或數字量的發送數據幀中,通道號不同,數字量與模擬量采集的發送數據幀中,命令號不同。發送數據幀中,具體的命令號和通道號可以自定義,此處模擬量通道0的采集命令為0x55AA10,模擬量通道1的采集命令為0x55AA11,數字量通道0的采集命令為0x55AA20,數字量通道1的采集命令為0x55AA21。
LabVIEW上位機程序框圖如下所示:






Arduino Uno上的模擬輸入擁有10位的分辨率,可以滿足一般的數據采集的需求同時可以更改參考電壓來提高最小分辨率。
對于高精度的應用,需要外部擴展高分辨率的ADC(模數轉換器)和高精度的電壓基準源。
對于連續數據采集的應用,可以采用LabVIEW Interface for Arduino函數庫中的模擬采樣庫中的Get Finite Analog Sample函數節點來實現。
對于遠距離的數據采集的應用,可以采用RS-485總線、無線串口方式或網絡方式實現。
*博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。