乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Arduino與LabVIEW互動(dòng)應(yīng)用02

       開啟美好每一天 2013-12-24

      摘要:針對(duì)低速、低成本、快速搭建的特點(diǎn),采用ArduinoLabVIEW來實(shí)現(xiàn)低成本上下位機(jī)數(shù)據(jù)采集系統(tǒng)。Arduino作為下位機(jī),負(fù)責(zé)A/D轉(zhuǎn)換以及數(shù)據(jù)傳輸;LabVIEW編寫的數(shù)據(jù)采集軟件作為上位機(jī);上下位機(jī)利用RS-232串行接口實(shí)現(xiàn)通訊。

      【注】一般認(rèn)為上位機(jī)為主機(jī),下位機(jī)為從機(jī),上位機(jī)領(lǐng)導(dǎo)下位機(jī)按照上位機(jī)機(jī)的意愿工作為上位機(jī)服務(wù);同時(shí)下位機(jī)也可以主動(dòng)向上位機(jī)發(fā)出請(qǐng)求,上位機(jī)響應(yīng)下位機(jī)并配合完成某個(gè)請(qǐng)求。

      數(shù)據(jù)采集,是指從傳感器和其它待測(cè)設(shè)備等模擬和數(shù)字被測(cè)單元中自動(dòng)采集信息的過程。相應(yīng)能夠完成數(shù)據(jù)采集的系統(tǒng)被稱為數(shù)據(jù)采集系統(tǒng)。

      數(shù)據(jù)采集系統(tǒng)的任務(wù),就是采集傳感器輸出的模擬信號(hào)轉(zhuǎn)換成計(jì)算機(jī)能識(shí)別的信號(hào),并送入計(jì)算機(jī),然后將計(jì)算得到的數(shù)據(jù)進(jìn)行顯示或打印,以便實(shí)現(xiàn)對(duì)某些物理量的監(jiān)測(cè),其中一些數(shù)據(jù)還將被生產(chǎn)過程中的計(jì)算機(jī)控制系統(tǒng)用來控制某些物理量。 【文獻(xiàn)1

      一、Arduino下位機(jī)部分

      數(shù)據(jù)采集系統(tǒng)中的Arduino下位機(jī)部分采用Arduino Leonardo實(shí)驗(yàn)板,如圖1所示。

      Arduino與LabVIEW互動(dòng)應(yīng)用02-基于Arduino+LabVIEW的多路數(shù)據(jù)采集系統(tǒng) 
      圖1 Arduino Leonardo控制板

      Arduino下位機(jī)部分需要完成兩個(gè)功能:數(shù)據(jù)采集和數(shù)據(jù)傳輸,Arduino Leonardo控制板通過串口接受上位機(jī)命令,完成相應(yīng)的數(shù)據(jù)采集,并將數(shù)據(jù)回傳至上位機(jī)。

      數(shù)據(jù)采集分為模擬量采集和數(shù)字量采集,設(shè)置采集路數(shù)各為2路,分別采用Arduino UNO上具有模擬量輸入的管腳A0、A1和具有數(shù)字量輸入的管腳2、3來實(shí)現(xiàn)。模擬量采用接至GND、3.3V和5V來實(shí)現(xiàn)不同電壓值,數(shù)字量采用接至5V和GND實(shí)現(xiàn)高電平與低電平。【注】

      【注】如果有電位器,可以用來測(cè)量分壓值。由于手頭沒有電位器,我這里只是簡(jiǎn)單的實(shí)現(xiàn)。

      Arduino Leonardo代碼清單:

      #define A0_COMMAND  0x10   //A0采集命令字

      #define A1_COMMAND  0x11   //A1采集命令字

      #define D0_COMMAND  0x20   //D0采集命令字

      #define D1_COMMAND  0x21   //D1采集命令字


      byte comdata[3]={0};      //定義數(shù)組數(shù)據(jù),存放串口接收數(shù)據(jù)

      int LED = 13;             //定義LED連接的管腳

      int A0_mark=0;            //定義A0的標(biāo)志位

      int A1_mark=0;            //定義A1的標(biāo)志位

      int D0_mark=0;            //定義D0的標(biāo)志位

      int D1_mark=0;            //定義D1的標(biāo)志位


      int AD_Value=0;          //AD轉(zhuǎn)換后的數(shù)字量

      float float_AD_Value;    //數(shù)字量換算成浮點(diǎn)電壓量

      int D_Value=0;           //數(shù)字量測(cè)量的數(shù)據(jù)


      void receive_data(void);      //接受串口數(shù)據(jù)

      void test_data(void);         //測(cè)試串口數(shù)據(jù)是否正確,并更新數(shù)據(jù)

      void do_command(void);        //執(zhí)行更新的數(shù)據(jù)


      void setup()

      {

        Serial.begin(9600);      

        pinMode(LED, OUTPUT);

        

      }

      void loop()

      {

        while (Serial.available() > 0)   //不斷檢測(cè)串口是否有數(shù)據(jù)

         {

              receive_data();            //接受串口數(shù)據(jù)

              test_data();               //測(cè)試數(shù)據(jù)是否正確并更新標(biāo)志位

              do_command();              //執(zhí)行更新的數(shù)據(jù)

         }

      }

      void receive_data(void)       

      {

         int i ;

         for(i=0;i<3;i++)

         {

            comdata[i] =Serial.read();

            //延時(shí)一會(huì),讓串口緩存準(zhǔn)備好下一個(gè)字節(jié),不延時(shí)可能會(huì)導(dǎo)致數(shù)據(jù)丟失,

             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;                                 //復(fù)位A0更新位

          digitalWrite(LED, HIGH);                   //打開LED燈

          AD_Value = analogRead(A0);                 //讀取A0電壓值

          float_AD_Value=(float)AD_Value/1023*5.00;  //換算為浮點(diǎn)電壓值

          Serial.println(float_AD_Value,2);          //保留兩位小數(shù)發(fā)送數(shù)據(jù)

          delay(500);

          digitalWrite(LED, LOW);                     //關(guān)閉LED燈

        }

        if(A1_mark==2)

        {

          A1_mark=0;                                 //復(fù)位A1更新位

          digitalWrite(LED, HIGH);                   //打開LED燈

          AD_Value = analogRead(A1);                 //讀取A1電壓值

          float_AD_Value=(float)AD_Value/1023*5.00;  //換算為浮點(diǎn)電壓值

          Serial.println(float_AD_Value,2);          //保留兩位小數(shù)發(fā)送數(shù)據(jù)

          delay(500);

          digitalWrite(LED, LOW);                     //關(guān)閉LED燈

        }

        if(D0_mark==2)

        {

          D0_mark=0;                                 //復(fù)位D0更新位

          digitalWrite(LED, HIGH);                   //打開LED燈

          D_Value = digitalRead(2);                  //讀取D2數(shù)字量

          Serial.println(D_Value);                  //發(fā)送數(shù)字量測(cè)量數(shù)據(jù)

          delay(500);

          digitalWrite(LED, LOW);                     //關(guān)閉LED燈

        }

        if(D1_mark==2)

        {

          D1_mark=0;                                  //復(fù)位D1更新位

          digitalWrite(LED, HIGH);                    //打開LED燈

          D_Value = digitalRead(3);                   //讀取D1數(shù)字量

          Serial.println(D_Value);                   //發(fā)送數(shù)據(jù)量測(cè)量數(shù)據(jù)

          delay(500);

          digitalWrite(LED, LOW);                      //關(guān)閉LED燈

        }

      }

      二、LabVIEW上位機(jī)部分

      LabVIEW與Arduino通訊已在《Arduino與LabVIEW互動(dòng)應(yīng)用01-串口控制LED亮滅》一文中作了簡(jiǎn)單的介紹,此處在上次的基礎(chǔ)上修改實(shí)現(xiàn)。

      串口讀寫的程序框圖如圖2所示。首先,對(duì)選擇的通道的串口進(jìn)行配置,然后串口寫入所需要測(cè)量的通道號(hào),等待100ms,從串口中讀取Arduino下位機(jī)返回?cái)?shù)據(jù),最后對(duì)數(shù)據(jù)進(jìn)行適當(dāng)?shù)霓D(zhuǎn)換并顯示出來。Arduino與LabVIEW互動(dòng)應(yīng)用02-基于Arduino+LabVIEW的多路數(shù)據(jù)采集系統(tǒng)

      圖2 LabVIEW串口通訊最小部分

      LabVIEW上位機(jī)前面板設(shè)計(jì)如圖3所示。

      Arduino與LabVIEW互動(dòng)應(yīng)用02-基于Arduino+LabVIEW的多路數(shù)據(jù)采集系統(tǒng)

      圖3 LabVIEW上位機(jī)前面板

      LabVIEW上位機(jī)程序框圖如圖4和圖5所示,由于有2路模擬量和2路數(shù)字量,此處僅給出一路模擬量和一路數(shù)字量的程序框圖。不同通道的模擬量或數(shù)字量的發(fā)送數(shù)據(jù)幀中,通道號(hào)不同;數(shù)字量與模擬量采集的發(fā)送數(shù)據(jù)幀中,命令號(hào)不同。發(fā)送數(shù)據(jù)幀中,具體的命令號(hào)和通道可以自己定義,不過需要上下位機(jī)的對(duì)應(yīng)起來。

      Arduino與LabVIEW互動(dòng)應(yīng)用02-基于Arduino+LabVIEW的多路數(shù)據(jù)采集系統(tǒng)

      圖4 模擬量采集程序框圖

      Arduino與LabVIEW互動(dòng)應(yīng)用02-基于Arduino+LabVIEW的多路數(shù)據(jù)采集系統(tǒng)

      圖5 數(shù)字量采集程序框圖

      三、實(shí)驗(yàn)與演示

      通過將模擬量輸入A0依次接入GND、3.3V和5V,然后點(diǎn)擊“測(cè)量”按鈕,觀察面板上的儀表盤和數(shù)顯框中數(shù)值的變化。

      通過將數(shù)字量輸入2依次接入GND和5V,然后點(diǎn)擊“測(cè)量”按鈕,觀察面板上的LED燈的變化,LED亮代表高電平、LED滅代表低電平。 

      四、總結(jié)

      在傳感器等領(lǐng)域經(jīng)常需要用到數(shù)據(jù)采集的功能,此應(yīng)用實(shí)現(xiàn)了命令發(fā)送與數(shù)據(jù)回傳功能,可以在此基礎(chǔ)上擴(kuò)展功能,對(duì)相關(guān)傳感器的數(shù)據(jù)采集有一定的參考價(jià)值。

      參考文獻(xiàn):

      文獻(xiàn)1:基于單片機(jī)的數(shù)據(jù)采集系統(tǒng)的控制器設(shè)計(jì)

      文獻(xiàn)2:http:///

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多