【注】通常認爲上位機爲主機,下位機爲從機,上位機領導下位機按照上位機的意願爲上位機服務;同時下位機也能夠主動向上位機發出請求,上位機響應下位機並配合完成某個請求。 html
數據採集,是指從傳感器和其它待測設備等模擬和數字被測單元中自動採集信息的過程。相應可以完成數據採集的系統被稱爲數據採集系統。 git
數據採集系統的任務,就是採集傳感器輸出的模擬信號轉換成計算機能識別的信號,並送入計算機,而後將計算獲得的數據進行顯示或打印,以便實現對某些物理量的監測,其中一些數據還將被生產過程當中的計算機控制系統用來控制某些物理量。 【文獻1】 數組
1、Arduino下位機部分 緩存
數據採集系統中的Arduino下位機部分採用Arduino Leonardo實驗板,如圖1所示。 ide
圖1 Arduino Leonardo控制板 oop
Arduino下位機部分須要完成兩個功能:數據採集和數據傳輸,Arduino Leonardo控制板經過串口接受上位機命令,完成相應的數據採集,並將數據回傳至上位機。 測試
數據採集分爲模擬量採集和數字量採集,設置採集路數各爲2路,分別採用Arduino UNO上具備模擬量輸入的管腳A0、A1和具備數字量輸入的管腳二、3來實現。模擬量採用接至GND、3.3V和5V來實現不一樣電壓值,數字量採用接至5V和GND實現高電平與低電平。【注】 ui
【注】若是有電位器,能夠用來測量分壓值。因爲手頭沒有電位器,我這裏只是簡單的實現。 url
Arduino Leonardo代碼清單: spa
#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 LED = 13; //定義LED鏈接的管腳
int A0_mark=0; //定義A0的標誌位 int A1_mark=0; //定義A1的標誌位 int D0_mark=0; //定義D0的標誌位 int D1_mark=0; //定義D1的標誌位
int AD_Value=0; //AD轉換後的數字量 float float_AD_Value; //數字量換算成浮點電壓量 int D_Value=0; //數字量測量的數據
void receive_data(void); //接受串口數據 void test_data(void); //測試串口數據是否正確,並更新數據 void do_command(void); //執行更新的數據
void setup() { Serial.begin(9600); pinMode(LED, OUTPUT); }
void loop() { while (Serial.available() > 0) //不斷檢測串口是否有數據 { receive_data(); //接受串口數據 test_data(); //測試數據是否正確並更新標誌位 do_command(); //執行更新的數據 } }
void receive_data(void) { int i ; for(i=0;i<3;i++) { comdata[i] =Serial.read(); //延時一會,讓串口緩存準備好下一個字節,不延時可能會致使數據丟失, delay(2); } }
void test_data(void) { if(comdata[0] == 0x55) //0x55和0xAA均爲判斷是否爲有效命令 { if(comdata[1] == 0xAA) { if(comdata[2] == A0_COMMAND) { A0_mark=2; //A0更新位置位 } if(comdata[2] == A1_COMMAND) { A1_mark=2; //A1更新位置位 } if(comdata[2] == D0_COMMAND) { D0_mark=2; //D0更新位置位 } if(comdata[2] == D1_COMMAND) { D1_mark=2; //D1更新位置位 } } } }
void do_command(void) { if(A0_mark==2) { A0_mark=0; //復位A0更新位 digitalWrite(LED, HIGH); //打開LED燈 AD_Value = analogRead(A0); //讀取A0電壓值 float_AD_Value=(float)AD_Value/1023*5.00; //換算爲浮點電壓值 Serial.println(float_AD_Value,2); //保留兩位小數發送數據 delay(500); digitalWrite(LED, LOW); //關閉LED燈 } if(A1_mark==2) { A1_mark=0; //復位A1更新位 digitalWrite(LED, HIGH); //打開LED燈 AD_Value = analogRead(A1); //讀取A1電壓值 float_AD_Value=(float)AD_Value/1023*5.00; //換算爲浮點電壓值 Serial.println(float_AD_Value,2); //保留兩位小數發送數據 delay(500); digitalWrite(LED, LOW); //關閉LED燈 } if(D0_mark==2) { D0_mark=0; //復位D0更新位 digitalWrite(LED, HIGH); //打開LED燈 D_Value = digitalRead(2); //讀取D2數字量 Serial.println(D_Value); //發送數字量測量數據 delay(500); digitalWrite(LED, LOW); //關閉LED燈 } if(D1_mark==2) { D1_mark=0; //復位D1更新位 digitalWrite(LED, HIGH); //打開LED燈 D_Value = digitalRead(3); //讀取D1數字量 Serial.println(D_Value); //發送數據量測量數據 delay(500); digitalWrite(LED, LOW); //關閉LED燈 } }
2、LabVIEW上位機部分
串口讀寫的程序框圖如圖2所示。首先,對選擇的通道的串口進行配置,而後串口寫入所須要測量的通道號,等待100ms,從串口中讀取Arduino下位機返回數據,最後對數據進行適當的轉換並顯示出來。
圖2 LabVIEW串口通信最小部分
LabVIEW上位機前面板設計如圖3所示。
圖3 LabVIEW上位機前面板
LabVIEW上位機程序框圖如圖4和圖5所示,因爲有2路模擬量和2路數字量,此處僅給出一路模擬量和一路數字量的程序框圖。不一樣通道的模擬量或數字量的發送數據幀中,通道號不一樣;數字量與模擬量採集的發送數據幀中,命令號不一樣。發送數據幀中,具體的命令號和通道能夠本身定義,不過須要上下位機的對應起來。
圖4 模擬量採集程序框圖
圖5 數字量採集程序框圖
3、實驗與演示
經過將模擬量輸入A0依次接入GND、3.3V和5V,而後點擊「測量」按鈕,觀察面板上的儀表盤和數顯框中數值的變化。
經過將數字量輸入2依次接入GND和5V,而後點擊「測量」按鈕,觀察面板上的LED燈的變化,LED亮表明高電平、LED滅表明低電平。
4、總結
在傳感器等領域常常須要用到數據採集的功能,此應用實現了命令發送與數據回傳功能,能夠在此基礎上擴展功能,對相關傳感器的數據採集有必定的參考價值。
參考文獻: