貴州民族大學機械電子工程學院 普天堯
Arduino是一個基于一系列單片機電路板的開源電子設計平臺,它同時提供了免費的開發環境(Arduino IDE)。相較其他單片機平臺,Arduino具有多種優勢,使其越來越廣泛地被應用于高校教學、課程設計之中。
Arduino使用C/C++語言編寫程序,并且其核心庫文件提供了大量的基于AVR-GCC庫二次封裝形成的API(Application Programming Interface)[1]。因此,使用者無需熟悉單片機寄存器的功能和設置方法,稍懂一些C語言即可開始項目設計,適合在高校低年級學生的實踐課程、競賽培訓等中應用、推廣。
Arduino的硬件電路、IDE軟件及核心庫文件均是開源的,在不用于商業用途的前提下,允許使用者在其基礎上擴展開發。
Arduino在世界各地擁有眾多開發者和用戶,因此可以在網絡上搜索到豐富的案例教程,以及一些I/O設備在Arduino下的類庫,從而有效地降低開發難度、縮短開發周期。
Arduino開發板價格相對便宜,例如本文設計使用的Arduino UNO R3控制器,價格在15到20元。此外,不需要編輯器,直接使用USB數據線即可完成程序下載,開發成本低,適合學生學習、創作。
數字示波器其工作原理是將輸入的模擬信號經ADC(Analog to Digital Converter)采樣后得到數字信號,并對其進行存儲、運算后將信號波形及所需參數輸出到顯示屏。
Arduino UNO是Arduino的主流產品,它包含14個數字輸入/輸出端口,6個模擬輸入端口,一個16MHz的晶體振蕩器[2]。其微控制器是ATmega328,它內部提供一個10位精度的逐次逼近型ADC。本文采用該系列最新版本UNO R3來實現信號的采樣、存儲及處理。波形及參數顯示使用LCD12864,以串行方式將其與Arduino的硬件SPI口連接[3]。開關S1、S2用于采樣率大小的增減,開關S3用于波形的鎖定。示波器的電路圖如圖1所示:

圖1 示波器硬件電路圖
Arduino程序主要由函數setup()和loop()構成。setup()函數中的代碼只被執行一次,通常用于完成I/O口狀態的配置等初始化工作。loop()函數是一個死循環,其中程序將反復運行。
本文設計的數字示波器的軟件部分主要包括:信號采樣模塊、鍵盤掃描模塊、信號參數計算模塊及波形顯示模塊。其中,信號采樣需要使用定時器中斷,其余模塊均放入loop()中實現。
采樣率,即單位時間內的采樣次數,單位Sa/s,是數字示波器的重要指標,其大小影響波形質量。數字示波器的采樣主要有實時采樣和等效采樣兩種模式。綜合考慮控制器的性能指標,本設計中采用實時采樣,即固定時間間隔采樣,該模式下如果波形使用矢量顯示,采樣率應不低于數字實時帶寬的10倍[4]。
Arduino核心庫提供了函數analogRead()用于模數轉換,它讀入一個模擬輸入信號耗時100μs,即使用該函數能夠獲得的最大采樣率為10000Sa/s,此時數字示波器的測量頻率小于1kHz。為了實現更高的采樣率,需要對ATmega328內置ADC進行設置。ADC的工作模式使用ADC自動觸發連續采樣,在該模式下,完成一次轉換的時間是13.5個ADC周期。該ADC模塊包含一個預分頻器,通過對系統時鐘分頻可以獲得一個適合的ADC時鐘頻率。在經過多次性能測試后,本設計的預分頻系數設置為8,即 fADC=2MHz,對應的采樣周期為:

因此該系統的最高采樣頻率:

完成一次模數轉換后其結果存放在ADC數據寄存器中,故需等時間間隔讀取ADC結果,并以數組形式存入控制器內存,這個過程本文采用定時器中斷實現。ATmega328的定時器在CTC(Clear Timer On Compare)模式下,計數值與寄存器OCRnA的數值進行比較,若匹配則進入中斷,之后計數值清零。這里不對定時器時鐘分頻,則當OCRnA取107時,定時器中斷發生的頻率與ADC采樣頻率一致。
該示波器配置三個按鈕,其中一個用于鎖定波形,另外兩個按鈕分別用于采樣率大小的增減。每次進入鍵盤掃描函數后,會檢測指定引腳的電平變化,滿足條件時則對相關參數進行修改。波形鎖定是通過改變標志變量的值,從而控制LCD繪圖程序是否運行;而對定時器中OCRnA寄存器的值進行修改則可以調整定時器中斷周期,從而調整采樣率大小。
為了使得每次掃描的數據同步,顯示的波形穩定,需要查找到信號的同步觸發點,并將該點作為信號顯示的起點并丟棄前面的數據。因此,盡管波形顯示區域設置為96╳64,但這里采樣深度取192點。
除了波形顯示外,本設計將對采樣數據進行處理,獲得輸入信號的峰峰值Vpp和頻率f。Vpp的計算是通過查找采樣數據中的最大值和最小值來實現。頻率可以使用周期法測量,已知采樣率,通過對采樣數據處理得到輸入信號每個周期的平均采樣次數,進而確定其周期T,頻率f=1/T。具體實現代碼如下:

通常情況下,為了實現LCD12864的正常顯示功能,使用者需要嚴格地按要求寫入驅動程序。然而利用Arduino平臺進行系統設計時,可以跳過這個繁冗的步驟,本設計中直接調用U8glib庫函數來實現液晶屏的設置及圖形繪制功能。U8glib是目前Arduino上使用最廣泛的圖形顯示類庫,支持多種型號的液晶顯示屏。Arduino控制器和LCD采用硬件SPI通信,引腳連接如圖1所示。程序中需包含U8glib.h頭文件,并建立一個LCD對象,代碼如下:

上述代碼中的draw()函數,其中應包含實現圖形顯示的代碼。
為了驗證示波器的波形顯示功能和頻率測量性能,本文使用信號發生器提供等幅值不同頻率的正弦輸入信號。示波器輸出波形及信號參數如圖2所示:

圖2 不同頻率的信號波形顯示
表1給出輸入信號頻率不同時頻率測量的相對誤差。

表1 頻率測量結果
經測試數據顯示,利用Arduino平臺提供的開源硬軟件可以實現一個誤差較小的簡易數字示波器。
基于Arduino的系統設計具有軟件結構簡單、實現成本低、開發周期短等優勢,適合引入到高校工科專業實驗課程的教學活動中,有助于提高學生的學習興趣,培養學生的創新思維和實際操作能力。
[1]陳呂洲.Arduino程序設計基礎[M].北京:北京航空航天大學出版社,2015.
[2]范欽武.基于arduino和enc28j60的溫濕度監控系統設計[J].科技視界,2014(23):108-109.
[3]吳漢清.玩轉Arduino電子制作[M].北京:機械工業出版社,2016.
[4]康玲竹.數字示波器特性及應用[J].船電技術,2009(06):59-60.