陸強(qiáng)++顏加仁++林定能++沈歡勝
摘 要:利用Arduino標(biāo)準(zhǔn)化單片機(jī)集成模塊和Matlab軟件,從硬件和軟件兩方面論述了一種簡(jiǎn)易示波器的設(shè)計(jì)思路,該示波器可以測(cè)量直流和交流電壓波形。Arduino將數(shù)據(jù)采集后,通過(guò)串口傳輸?shù)絇C機(jī),利用PC機(jī)的Matlab程序,將數(shù)據(jù)進(jìn)行圖形化顯示,從而構(gòu)成示波器。
關(guān)鍵詞:Arduino Matlab 跨步電壓 電壓檢測(cè)
中圖分類號(hào):G642 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1672-3791(2014)10(b)-0009-02
Arduino是一塊基于開(kāi)放源代碼的SimpleI/O平臺(tái),該平臺(tái)由硬件和軟件兩部分組成,這兩部分都是開(kāi)源的。在硬件上,Arduino提供了6個(gè)模擬量輸入端,相對(duì)誤差為0.1%左右[1],可以滿足一般的測(cè)量精度要求。開(kāi)發(fā)語(yǔ)言類似java、C語(yǔ)言,具有開(kāi)發(fā)環(huán)境簡(jiǎn)單、易理理解的特點(diǎn)[2]。
Arduino把單片機(jī)編程中很多常用的功能,如延時(shí)、數(shù)據(jù)讀寫、中斷等模塊化封裝成一個(gè)個(gè)子程序供程序開(kāi)發(fā)者調(diào)用,程序開(kāi)發(fā)者只需著眼于程序的邏輯結(jié)構(gòu),而不必關(guān)心底層函數(shù)的具體設(shè)計(jì),從而大大降低了程編程的復(fù)雜程度[3]。
Matlab是由美國(guó)MATHw0RKs公司開(kāi)發(fā)的面向研究和工程設(shè)計(jì)處理的一套具有強(qiáng)大功能的軟件系統(tǒng)。Matlab集數(shù)學(xué)計(jì)算結(jié)果可視化和編程于一體,能夠方便地進(jìn)行科學(xué)計(jì)算和大量工程運(yùn)算[4]。
該文提出了一種基于Arduino標(biāo)準(zhǔn)化單片機(jī)集成模塊和Matlab數(shù)據(jù)處理的簡(jiǎn)易示波器設(shè)計(jì)方法,可以用于測(cè)量常見(jiàn)的電壓波形,成本低廉,使用方便。
1 系統(tǒng)結(jié)構(gòu)
簡(jiǎn)易示波器從系統(tǒng)結(jié)構(gòu)上分為前部數(shù)據(jù)采集端和PC機(jī)波形顯示器兩部分構(gòu)成,兩者用串口實(shí)現(xiàn)數(shù)據(jù)交換。
前部數(shù)據(jù)采集端通過(guò)分壓電路將電壓降低到合適的數(shù)值以供Arduino測(cè)量;由于Arduino只能測(cè)量5V以內(nèi)的直流電壓,對(duì)于交流電壓,要加一級(jí)極性轉(zhuǎn)換電路,將雙極性電壓轉(zhuǎn)換為單極性電壓。完成AD轉(zhuǎn)換后,Arduino將數(shù)據(jù)通過(guò)串口傳到PC機(jī),PC機(jī)利用Matlab的強(qiáng)大分析處理能力,對(duì)收到的數(shù)據(jù)進(jìn)行分析、處理和圖形顯示。系統(tǒng)的結(jié)構(gòu)如圖1所示。
2 硬件設(shè)計(jì)
該文設(shè)計(jì)的示波器主要用于測(cè)量和顯示常規(guī)直流電壓和交流電壓,測(cè)量的最大電壓為50 V,并設(shè)置一個(gè)壓敏電阻來(lái)保護(hù)電路,以免電壓過(guò)高時(shí)損壞裝置。對(duì)于電流電壓,由于Arduino所用的Atmel Atmega328單片機(jī)AD轉(zhuǎn)換速率為13~260 μs,所測(cè)量的電流電壓頻率一般不應(yīng)高于2 kHz。
2.1 降壓電路設(shè)計(jì)
降壓電路采用線性電阻進(jìn)行分壓,并串聯(lián)一個(gè)可調(diào)電阻以便微調(diào)。降壓后通過(guò)電壓跟隨器,使得輸入、輸出信號(hào)的幅值保持不變,且輸入阻抗高,輸出阻抗低,起到了現(xiàn)場(chǎng)信號(hào)與系統(tǒng)的隔離、互不干擾的作用。電路原理如圖2所示。
2.2 極性轉(zhuǎn)換電路設(shè)計(jì)
在模擬量的測(cè)量中最常見(jiàn)的莫過(guò)于交流電壓及交流電流的測(cè)量,而單片機(jī)內(nèi)的AD轉(zhuǎn)換器通常是用來(lái)測(cè)量直流或脈動(dòng)直流的,因輸入腳不允許輸入負(fù)電平。需要增加一些外圍電路方能實(shí)現(xiàn)對(duì)交流電的測(cè)量[5]。
這些外圍電路就是極性轉(zhuǎn)換電路,如圖3所示。
本電路采用了電壓基準(zhǔn)芯片AMS1117
-2.5產(chǎn)生一個(gè)幅值為2.5 V的基準(zhǔn)電壓Vout,通過(guò)電阻R4加到運(yùn)算放大器的“+”輸入端。
由圖3可知:
其中=2.5V。取R1=R4=2.4K,R2=R3=1.2 K,則有=+1.25,即輸入信號(hào)正向平移了1.25 V。
2.3 模塊電路連接
降壓模塊和極性轉(zhuǎn)換模塊可以用萬(wàn)能板焊接,Arduino模塊采用標(biāo)準(zhǔn)的成品,各模塊的電路連接比較簡(jiǎn)單,降壓電路的端外接需要測(cè)試的信號(hào)源,降壓電路的與極性轉(zhuǎn)換電路輸入端相連,極性轉(zhuǎn)換電路的輸出端與Arduino模塊的模擬輸入口A0相連,Arduino模塊的USB口與PC機(jī)的USB口相連,如圖4所示。
3 軟件設(shè)計(jì)
軟件設(shè)計(jì)的思路是,Arduino通過(guò)模擬輸入口A0采集交直流電壓量,并通過(guò)內(nèi)置的USB轉(zhuǎn)串口芯片,將采集后的數(shù)據(jù)通過(guò)串口傳輸?shù)絇C機(jī),PC機(jī)進(jìn)行簡(jiǎn)單數(shù)據(jù)處理后,調(diào)用畫(huà)圖工具顯示波形。
3.1 數(shù)據(jù)采集程序
數(shù)據(jù)采集直接調(diào)用模擬量讀取函數(shù)analogRead,如下所示。
Vinput=analogRead(0);//讀取電壓量,數(shù)值從0到1023。
為了提高抗干擾性,得到更加穩(wěn)定的讀數(shù),可以多次讀取數(shù)據(jù)并計(jì)算平均值。
3.2 串口通信程序
Matlab 6.X或之后的版本提供了對(duì)串口對(duì)象的支持,可以很方便地訪問(wèn)外設(shè),通過(guò)建立串口對(duì)象,能實(shí)現(xiàn)數(shù)據(jù)的讀寫、存儲(chǔ)、事件回調(diào)等功能。
Matlab儀器控制工具箱可實(shí)現(xiàn)硬件端口的采集。其采集原理是:先建立虛擬設(shè)備對(duì)象,再設(shè)置設(shè)備對(duì)象的屬性,最后通過(guò)設(shè)備對(duì)象實(shí)現(xiàn)對(duì)硬件的操作[6]。
(1)Arduino端的數(shù)據(jù)上傳。
在void setup()函數(shù)里設(shè)置波特率,如Serial.begin (9600),即將串口比特率設(shè)置為9600。并利用Serial.read()讀取特定的數(shù)據(jù)作為握手信號(hào),待兩端握手正確后再進(jìn)行數(shù)據(jù)傳輸。
握手成功后,在void loop()函數(shù)中利用函數(shù)Serial.println(Voutput)不斷地將轉(zhuǎn)換好的數(shù)據(jù)發(fā)送到PC機(jī)。
(2)PC機(jī)端的數(shù)據(jù)接收
Matlab可以用查詢和中斷兩種方式接收數(shù)據(jù),這兩種方式各具特點(diǎn),這里選用查詢方式,將接收到的數(shù)據(jù)匯總到一個(gè)標(biāo)準(zhǔn)數(shù)組dataOut中,填滿后立即繪圖,然后清0并重新填入數(shù)據(jù),周而復(fù)始。PC機(jī)端的數(shù)據(jù)傳輸有以下幾個(gè)步驟。endprint
①用g=serial('COMx')創(chuàng)建設(shè)備對(duì)象。
②用set()設(shè)置設(shè)備對(duì)象屬性,如波特率、終止符、輸入和輸出緩沖區(qū)大小等。
③用fopen()實(shí)現(xiàn)設(shè)備對(duì)象與硬件設(shè)備連接。
④用fread()、fwrite()等實(shí)現(xiàn)硬件設(shè)備數(shù)據(jù)的讀寫。
⑤用fclose()和delete()、clear()關(guān)閉和刪除設(shè)備對(duì)象。
3.3 波形顯示程序
利用PC機(jī)的Matlab強(qiáng)大的數(shù)據(jù)處理和圖形顯示功能進(jìn)行波形顯示,在標(biāo)準(zhǔn)數(shù)組dataOut填滿后,調(diào)用plot函數(shù)來(lái)完成數(shù)據(jù)的可視化處理,如下所示。
plot(x,dataOut);
x是時(shí)間標(biāo)量,與dataOut數(shù)組的采集時(shí)刻對(duì)應(yīng),可以根據(jù)數(shù)據(jù)采集的間隔,在PC端用linspace()函數(shù)生產(chǎn)。這里要注意的是,由于在輸入時(shí)人為添加了1.25 V的直流偏置,并在AD轉(zhuǎn)換時(shí)將其放大了1023/5倍,因此在調(diào)用plot函數(shù)前應(yīng)將接收到的數(shù)據(jù)減去1.25 V直流偏置的影響,并借助于標(biāo)準(zhǔn)數(shù)字萬(wàn)用表,算出電壓輸入量和輸出量之間的系數(shù),對(duì)輸出進(jìn)行倍率校準(zhǔn)。
圖5是利用該示波器顯示的RC電路放電的波形,前面波動(dòng)處是開(kāi)關(guān)合閘時(shí)的干擾電平。
由圖5可見(jiàn),電容充滿電后為5 V,并從50 s開(kāi)始放電(在50s時(shí)斷開(kāi)電源開(kāi)關(guān)),經(jīng)過(guò)約170 s后電壓變?yōu)? V,由,求得て=105 s。
本電路用的電阻為R=1M,電容C=100 mf,理論上て=RC=100 s。
可見(jiàn)實(shí)際值與理論值仍有一定的差距,這個(gè)差距主要是Arduino采集數(shù)據(jù)時(shí),設(shè)定每隔5 ms進(jìn)行一次AD轉(zhuǎn)換(使用函數(shù)delay(5)進(jìn)行5 ms延時(shí)),但是這個(gè)延時(shí)并沒(méi)有考慮AD轉(zhuǎn)換的時(shí)間,數(shù)據(jù)上傳的時(shí)間,以及Arduino執(zhí)行其他指令所用的時(shí)間,從而導(dǎo)致總的時(shí)間有些許誤差。
4 結(jié)語(yǔ)
該文利用Arduino標(biāo)準(zhǔn)化單片機(jī)集成模塊和Matlab數(shù)據(jù)處理軟件,設(shè)計(jì)了一個(gè)簡(jiǎn)易示波器,可以用于測(cè)量常見(jiàn)的交流和直流電壓波形。在實(shí)際使用過(guò)程中,雖然該裝置在時(shí)間量度方面仍有一些誤差,但是能夠真實(shí)反映波形情況,而且成本低廉,使用方便。
如果對(duì)時(shí)間標(biāo)量的精度要求嚴(yán)格,可以在arduino采集數(shù)據(jù)時(shí),同時(shí)記錄當(dāng)時(shí)的時(shí)標(biāo),并通過(guò)串口與所采集的數(shù)據(jù)一起上傳給PC,但是會(huì)大大增加傳輸?shù)臄?shù)據(jù)量。還可以采取一個(gè)折中的方法,每采集一定個(gè)數(shù)的數(shù)量時(shí)記錄并傳輸一個(gè)時(shí)標(biāo),比如100個(gè)或1000個(gè)。
另外,由于Matlab具有強(qiáng)大的數(shù)據(jù)處理能力,讀者還可以加入數(shù)據(jù)濾波處理、保存、截波、數(shù)據(jù)分析等功能,同時(shí)采用Matlab的GUI可視化設(shè)計(jì)界面,可以設(shè)計(jì)出一套更加友好的界面,實(shí)現(xiàn)對(duì)數(shù)據(jù)的處理和系統(tǒng)的控制,從而大大增加示波器的實(shí)用性。
參考文獻(xiàn)
[1] 陳倩詒.單片機(jī)片內(nèi)A/D轉(zhuǎn)換器應(yīng)用于交流量的測(cè)量[J].電子技術(shù),2003(10):21-23.
[2] 蔡睿妍.Arduino的原理及應(yīng)用[J].電氣設(shè)計(jì)工程,2012(16):155-156.
[3] 紀(jì)欣然.基于arduino開(kāi)發(fā)環(huán)境的智能尋光小車設(shè)計(jì)[J].現(xiàn)代電子技術(shù),2012(15):161-163.
[4] 梁湘.基于MATLAB的數(shù)據(jù)實(shí)時(shí)采集與處理的實(shí)現(xiàn)[J].科技信息,2008(9):44-45.
[5] 陳再清.用單片機(jī)如何實(shí)現(xiàn)交流量的A/D轉(zhuǎn)換[J].電子世界,2003(11):29-30.
[6] 劉秀.用Matlab實(shí)現(xiàn)硬件端口采集的方法[J].兵工自動(dòng)化,2003(3):58-60.endprint