找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 34521|回復(fù): 28
打印 上一主題 下一主題
收起左側(cè)

基于Android顯示的便攜式數(shù)字示波器 畢業(yè)設(shè)計(jì)(論文)

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主

本設(shè)計(jì)是基于stm32單片機(jī)制作的,實(shí)物圖片如下:

電路圖下載: Android示波器電路原理圖.zip (96.22 KB, 下載次數(shù): 296)

源代碼下載: Android、STM32源代碼.zip (4.65 MB, 下載次數(shù): 317)

完整版的論文下載word格式:
(畢業(yè)論文)基于Android顯示的便攜式數(shù)字示波器.zip (3.11 MB, 下載次數(shù): 296)

以下是論文預(yù)覽:

本科畢業(yè)設(shè)計(jì)論文)

基于Android顯示的便攜式數(shù)字示波器
        學(xué)    院      物理與光電工程學(xué)院      
        專    業(yè)        電子科學(xué)與技術(shù)         
        年級(jí)班別2009級(jí)(5)班         
        學(xué)    號(hào)
        學(xué)生姓名
        指導(dǎo)教師
摘要

數(shù)字示波器作為一種測(cè)量?jī)x器,因其具有體積小、可長(zhǎng)期貯存波形并具有波形分析處理能力等優(yōu)點(diǎn),使得它日益普及。由于目前國外在數(shù)字技術(shù)方面比國內(nèi)發(fā)達(dá)很多,數(shù)字存儲(chǔ)示波器的大部分市場(chǎng)被國外企業(yè)占有。而國內(nèi)的數(shù)字存儲(chǔ)示波器的研制處于起步階段,因此迫切需要加快相關(guān)技術(shù)的發(fā)展。

本文主要介紹了基于單片機(jī)STM32控制的、并在Android上進(jìn)行顯示的便攜式數(shù)字示波器。STM32單片機(jī)是一款性價(jià)比非常之高的處理器,最高時(shí)鐘可達(dá)72M,完全能滿足本設(shè)計(jì)的要求。Android系統(tǒng)作為一個(gè)開放的移動(dòng)平臺(tái),在最近幾年發(fā)展非常的迅速。在這個(gè)Android設(shè)備高度普及的時(shí)代,如何充分利用它的軟硬件資源就顯得尤為重要。

采用Android設(shè)備作為顯示平臺(tái),是本設(shè)計(jì)最大的一個(gè)特點(diǎn)。本設(shè)計(jì)的基本思路是,由單片機(jī)對(duì)ADC采樣到的數(shù)據(jù)進(jìn)行處理,再通過藍(lán)牙把波形數(shù)據(jù)發(fā)送到Android設(shè)備上進(jìn)行顯示。同時(shí)由于Android設(shè)備都采用觸摸屏,因此示波器的參數(shù)可以很方便的通過觸摸屏進(jìn)行設(shè)置。本設(shè)計(jì)采用Android設(shè)備取代液晶屏,并使用藍(lán)牙進(jìn)行數(shù)據(jù)傳輸,充分利用了Android設(shè)備的硬件資源。其優(yōu)點(diǎn)是降低了系統(tǒng)開發(fā)成本,并大大減小了系統(tǒng)硬件體積,完全實(shí)現(xiàn)了本設(shè)計(jì)小巧便攜的設(shè)計(jì)宗旨。

關(guān)鍵詞:數(shù)字示波器,STM32,安卓,藍(lán)牙

1 緒論

1.1 示波器概述

1.2 數(shù)字示波器的特點(diǎn)及原理

1.3 數(shù)字示波器國內(nèi)外研究狀況

1.4 Android概述

1.5 題目研究背景及意義

2 數(shù)字示波器原理分析與技術(shù)指標(biāo)

2.1 數(shù)字示波器的組成原理

2.2 數(shù)字示波器與模擬示波器相比較

2.3 數(shù)字示波器技術(shù)指標(biāo)

2.3.1 最大采樣速率

2.3.2 存儲(chǔ)寬度

2.3.3 分辨率

2.3.4 記錄長(zhǎng)度

2.3.5 存儲(chǔ)帶寬

2.3.6 垂直靈敏度及誤差

2.3.7 掃描速度及誤差

2.4 采樣原理分析

2.4.1 實(shí)時(shí)采樣方式的原理

2.4.2 等效取樣方式的原理

3 系統(tǒng)方案論證

3.1 系統(tǒng)總體方案設(shè)計(jì)

3.2 數(shù)據(jù)采集系統(tǒng)

3.2.1 波形整形電路方案選擇

3.2.2 程控放大電路方案選擇

3.3 數(shù)據(jù)處理系統(tǒng)

3.3.1 觸發(fā)方案選擇

3.3.2 峰值測(cè)量方案選擇

3.3.3 測(cè)量頻率方案選擇

3.3.4 采樣方案選擇

4 系統(tǒng)硬件電路設(shè)計(jì)

4.1 微控制器電路

4.2 電源電路設(shè)計(jì)

4.3 信號(hào)采集電路設(shè)計(jì)

4.3.1 A/D轉(zhuǎn)換及FIFO緩存器

4.3.2 程控放大電路

4.3.3 電平移位電路設(shè)計(jì)

4.3.4 頻率測(cè)量電路

4.4 無線數(shù)據(jù)傳輸

5 系統(tǒng)軟件設(shè)計(jì)

5.1 單片機(jī)軟件開發(fā)環(huán)境

5.2 主程序設(shè)計(jì)及流程圖

5.3 數(shù)據(jù)處理子程序

5.3.1 同步觸發(fā)的軟件實(shí)現(xiàn)

5.3.2 頻率計(jì)算原理及流程圖

5.3.3 測(cè)量信號(hào)峰峰值

6 Android顯示平臺(tái)

6.1 Android應(yīng)用開發(fā)環(huán)境

6.1.1 Android簡(jiǎn)介

6.1.2 開發(fā)所需的軟件包

6.1.3 搭建Android開發(fā)環(huán)境

6.1.4 測(cè)試所配的開發(fā)環(huán)境

6.2 Android藍(lán)牙通信設(shè)計(jì)

6.2.1 Android設(shè)備中藍(lán)牙模塊的使用

6.2.2 藍(lán)牙數(shù)據(jù)通信

6.3 Android上繪制波形

6.3.1 SurfaceView的使用

6.3.2 繪制波形子程序

結(jié)論

參考文獻(xiàn)

致謝

附錄 A  實(shí)物圖

附錄 B  系統(tǒng)主程序設(shè)計(jì)源碼

附錄 C  Android藍(lán)牙服務(wù)程序設(shè)計(jì)源碼




1 緒論1.1 示波器概述

示波器作為一種精密的測(cè)量?jī)x器,廣泛地應(yīng)用在科研、教育、農(nóng)業(yè)生產(chǎn)、軍事等各個(gè)領(lǐng)域。示波器是一種用短暫掃描的方式記錄并顯示一個(gè)瞬間信號(hào)的測(cè)量?jī)x器,可以直觀地表示二維變量之間的瞬態(tài)或穩(wěn)態(tài)函數(shù)關(guān)系、邏輯關(guān)系,以及實(shí)現(xiàn)對(duì)部分物理量的存儲(chǔ)和變換[1]。

隨著上個(gè)世紀(jì)七十年代雷達(dá)、電視和航空等領(lǐng)域的發(fā)展,研制對(duì)于電信號(hào)能夠?qū)崿F(xiàn)檢測(cè)和跟蹤的設(shè)備已成為急需,示波器在這個(gè)時(shí)期應(yīng)運(yùn)而生。帶寬為100MHz的同步示波器研制成功,成為近代示波器的基礎(chǔ)[2]。1972年美國尼科萊特公司利用模數(shù)轉(zhuǎn)換器件,成功研制出世界上首臺(tái)數(shù)字存儲(chǔ)示波器,為信號(hào)數(shù)字化、數(shù)據(jù)的存儲(chǔ)、信號(hào)處理和參數(shù)跟蹤開辟了一條新的途徑。

示波器從原理上可分為模擬和數(shù)字兩種。傳統(tǒng)的模擬示波器也就是電子管示波器,其原理是用被測(cè)信號(hào)去控制示波管的X、Y通道,達(dá)到控制陰極電子束的偏移的目的,從而實(shí)現(xiàn)在熒光屏上顯示被測(cè)信號(hào)的波形。但很容易發(fā)現(xiàn),傳統(tǒng)的模擬示波器有很多缺點(diǎn),比如操作復(fù)雜、不方便攜帶、笨重、耗電量大以及無法用于測(cè)量非周期、單次信號(hào),這些缺點(diǎn)都給實(shí)際應(yīng)用帶來了許多不便。為了解決傳統(tǒng)模擬示波器的缺點(diǎn),并實(shí)現(xiàn)將各種信號(hào)無失真地顯示并存儲(chǔ),數(shù)字示波器應(yīng)運(yùn)而生。數(shù)字存儲(chǔ)示波器可直觀的顯示出被測(cè)信號(hào)的實(shí)時(shí)曲線,并可進(jìn)行瞬態(tài)分析[3]。目前數(shù)字示波器已取代模擬示波器成為市場(chǎng)上的主流,并朝著智能化的方向發(fā)展。

近幾年,隨著計(jì)算機(jī)技術(shù)的發(fā)展,出現(xiàn)了虛擬示波器。傳統(tǒng)示波器頻帶較寬,實(shí)時(shí)性較好,但功能比較單一,人機(jī)界面不夠友好。采用虛擬示波器技術(shù)可以以低廉的成本解決這些問題。虛擬示波器是虛擬儀器技術(shù)的應(yīng)用,它使用數(shù)據(jù)采集卡采集現(xiàn)場(chǎng)信號(hào),通過接口電路傳輸數(shù)據(jù)到計(jì)算機(jī),再借助強(qiáng)大的監(jiān)控軟件模擬示波器的操作面板,實(shí)現(xiàn)信號(hào)采集、分析、處理、存儲(chǔ)、再顯示、打印輸出等功能[4]。

1.2 數(shù)字示波器的特點(diǎn)及原理

數(shù)字示波器中信號(hào)顯示和數(shù)字信號(hào)處理功能是獨(dú)立的,其性能取決于進(jìn)行數(shù)字信號(hào)處理的微處理器、模-數(shù)轉(zhuǎn)換器和RAM存儲(chǔ)器。采用RAM存儲(chǔ)器可以以很快的速度讀寫數(shù)據(jù),也可以以很慢的速度讀寫數(shù)據(jù),使得無論是觀察高速變化的信號(hào)還是很緩慢變化的信號(hào)都很自如[5]。

與模擬示波器比較,數(shù)字示波器具有很多方面的有點(diǎn),包括:

1、數(shù)字信號(hào)處理:數(shù)字示波器都使用了微處理器,所以它能對(duì)所采集到的數(shù)據(jù)進(jìn)行幅度和時(shí)間等基本運(yùn)算,高級(jí)的還能完成更復(fù)雜的數(shù)學(xué)運(yùn)算,如平均值、極值、積分、微分、數(shù)字濾波、倒數(shù)等。

2、單次多通道信號(hào)捕獲:數(shù)字示波器一般擁有多個(gè)通道,能夠同時(shí)捕獲多個(gè)單次瞬態(tài)信號(hào)(比如像電源開、關(guān)或故障發(fā)生等事件)。

3、多種觸發(fā):數(shù)字示波器有多種觸發(fā)類型:邊沿觸發(fā)、峰值觸發(fā)、脈寬觸發(fā)、矮脈沖觸發(fā)、邏輯觸發(fā)等。

4、數(shù)據(jù)存儲(chǔ):數(shù)字示波器可把波形數(shù)據(jù)保存在存儲(chǔ)器上,可在任意需要的時(shí)候調(diào)出波形數(shù)據(jù)進(jìn)行顯示。數(shù)字示波器也很容易實(shí)現(xiàn)與打印機(jī)和繪圖儀進(jìn)行連接,把波形以圖片的格式輸出。

數(shù)字示波器的重點(diǎn)是將連續(xù)的模擬信號(hào)轉(zhuǎn)化成離散的數(shù)字信號(hào),也就是從連續(xù)的模擬信號(hào)上以一定的時(shí)間間隔離散地采用。采樣有實(shí)時(shí)采樣和等效采樣兩種方式。數(shù)字示波器可按取樣方式分為隨機(jī)采樣數(shù)字示波器、實(shí)時(shí)采樣數(shù)字示波器、順序采樣數(shù)字示波器三種。這三種各自有各自的優(yōu)點(diǎn)和缺點(diǎn),等效采樣可以做到用比較低速的ADC轉(zhuǎn)換器對(duì)高頻信號(hào)進(jìn)行觀察。

1.3 數(shù)字示波器國內(nèi)外研究狀況

國際數(shù)字存儲(chǔ)示波器的領(lǐng)域,最主要的生產(chǎn)廠商是泰克公司、力科公司和安捷倫公司。泰克公司創(chuàng)始人在1946年發(fā)明了世界上第一臺(tái)觸發(fā)式示波器,始于這個(gè)突破性的技術(shù)創(chuàng)新,如今的泰克已經(jīng)崛起成為全球最大的測(cè)試、測(cè)量和監(jiān)測(cè)設(shè)備供應(yīng)商之一,F(xiàn)在,泰克公司在全球19個(gè)國家都設(shè)有辦事機(jī)構(gòu),2006年銷售收入超過11億美元。該公司早在2000年就推出了模擬帶寬為4GHz帶寬的示波器,以后陸續(xù)在2002年和2004年推出了模擬帶寬分別為6GHz和8GHz的示波器。目前,泰克的最先進(jìn)的數(shù)字示波器的模擬帶寬已經(jīng)高達(dá)80GHz[6]。

力科公司是一家專門從事高端數(shù)字示波器研發(fā)的公司。2008年1月2日,力科公司新推出的WaveMaster8系列數(shù)字示波器,此系列示波器提供了最高可達(dá)30GHz的帶寬、80GS/s的采樣率、512MHz采樣點(diǎn)分析功能及大于15GHz的邊沿觸發(fā)功能。力科公司在同一個(gè)硬件平臺(tái)基礎(chǔ)上設(shè)計(jì)了8-Zi系列,支持全部8種型號(hào),提供了4.30GHz的帶寬。這就意味著工程師可以利用自己的投資,并緊跟新興高速技術(shù)和串行數(shù)據(jù)標(biāo)準(zhǔn),他們只需為當(dāng)前設(shè)計(jì)購買所需的帶寬,在需要變化時(shí)再升級(jí)到更高的帶寬。這在經(jīng)濟(jì)衰退時(shí)期特別有吸引力,因?yàn)楦鱾(gè)公司都在力圖最大限度地降低資本投資,尤其力科示波器可以升級(jí)到30GHz的帶寬。其中WaveMaste830Zi數(shù)字示波器的帶寬為30GHz實(shí)時(shí)帶寬,為世界上速度最快的實(shí)時(shí)示波器。在示波器技術(shù)研發(fā)部分與泰克相當(dāng)[7]。

在與國外測(cè)試測(cè)量巨頭的博弈中,示波器領(lǐng)域上中國企業(yè)已取得非常大的突破。RIGOL公司作為中國儀器界崛起的生力軍,繼DS5000系列數(shù)字示波器創(chuàng)下銷售佳績(jī),獲得專業(yè)人士好評(píng)之后,于2006年初又投下一顆重磅炸彈,推出一款性能卓著的緊湊型數(shù)字存儲(chǔ)示波器――DS1000系列。DS1000系列在性能上不僅全面超過國外同類產(chǎn)品,打破了在這個(gè)領(lǐng)域國外產(chǎn)品一統(tǒng)天下的局面,同時(shí)又在原DS5000系列產(chǎn)品上大膽創(chuàng)新,使DS1000系列成為為數(shù)不多體積小巧、功能強(qiáng)大、性能卓越的低端數(shù)字示波器,彌補(bǔ)了國內(nèi)空白。RIGOL近幾年中之所以能夠快速增長(zhǎng),其中的一個(gè)重要原因就是利用強(qiáng)大的本土優(yōu)勢(shì),能很好地應(yīng)對(duì)來自客戶和整個(gè)行業(yè)的一系列新標(biāo)準(zhǔn),結(jié)果就是用戶能夠更快更好地完成他們的工作[8]。

1.4 Android概述

Android(安卓)一詞的本義指“機(jī)器人”,同時(shí)Android也是Google于07年11月5日宣布的基于Linux平臺(tái)開源手機(jī)操作系統(tǒng)名稱,該平臺(tái)由操作系統(tǒng)、中間件、用戶界面和應(yīng)用軟件組成,號(hào)稱是首個(gè)為移動(dòng)終端打造的真正開放和完整的移動(dòng)軟件。

安卓作為一個(gè)基于Linux內(nèi)核的半開源操作系統(tǒng),目前已廣泛的應(yīng)用于各種移動(dòng)設(shè)備,并正呈現(xiàn)高速發(fā)展的趨勢(shì)。原名“Android”的公司最早開發(fā)了安卓系統(tǒng),谷歌在2005年收購“Android.lnc”后,便投入大量資本和人力繼續(xù)進(jìn)行對(duì)安卓系統(tǒng)開發(fā)運(yùn)營(yíng)。安卓采用了軟件堆層(software stack,又名軟件疊層)的架構(gòu),主要分為三部分;竟δ苡傻讓覮inux內(nèi)核提供,其他所有的應(yīng)用軟件由各個(gè)公司開發(fā)并發(fā)布,大部分程序都是用Java進(jìn)行編寫的。在2011年初,安卓系統(tǒng)僅上市兩年便超越了稱霸十年之久的塞班系統(tǒng),一舉成為全世界最受歡迎的開放移動(dòng)手機(jī)平臺(tái)。如今不僅僅在智能手機(jī)上使用安卓系統(tǒng),其在平板電腦、機(jī)頂盒等電子產(chǎn)品上的應(yīng)用也是日益廣泛。隨著Android手機(jī)的普及,Android應(yīng)用的需求勢(shì)必會(huì)越來越大,這將會(huì)是一個(gè)潛力巨大的市場(chǎng),會(huì)吸引無數(shù)軟件開發(fā)廠商和開發(fā)者投身其中[9]。

1.5 題目研究背景及意義

近年來,在數(shù)字示波器技術(shù)研究領(lǐng)域國內(nèi)品牌也得到了許多相當(dāng)不錯(cuò)的成果。但是總體上我國示波器領(lǐng)域的水平還是比較落后的,國內(nèi)品牌的數(shù)字示波器在集成化、智能化、數(shù)字化等方面和國外相比還是有相當(dāng)?shù)牟罹。在國?nèi),數(shù)字示波器領(lǐng)域的技術(shù)研究尚處于初級(jí)階段,品牌數(shù)字示波器幾乎被國外廠家全部占領(lǐng)。但是由于國內(nèi)消費(fèi)水平相對(duì)較低,昂貴的數(shù)字示波器的消費(fèi)能力非常有限,難于普及,仍然還有大量的模擬示波器在使用,這些都嚴(yán)重的妨礙我國在數(shù)字示波器領(lǐng)域的發(fā)展。所以,對(duì)于目前國內(nèi)的現(xiàn)狀,本課題選擇數(shù)字示波器的研究是相當(dāng)有意義的。

傳統(tǒng)的模擬示波器存在諸多弊端:第一,模擬示波器升級(jí)困難;第二,模擬示波器的造價(jià)高;第三,模擬示波器的精度低;第四,模擬示波器操作復(fù)雜;第五,模擬示波器處理的是模擬信號(hào),模擬信號(hào)處理起來很困難;谝陨系目紤],數(shù)字示波器的開發(fā)是非常必要的。


2 數(shù)字示波器原理分析與技術(shù)指標(biāo)

本章主要分析數(shù)字示波器的外部特性,闡述數(shù)字示波器的功能和輸入輸出量;闡述數(shù)字示波器的基本框圖、基本原理;確定數(shù)字示波器中各個(gè)部分所使用的關(guān)鍵器件、關(guān)鍵模塊。

2.1 數(shù)字示波器的組成原理

數(shù)字示波器是上世紀(jì)70年代初發(fā)展起來的新型示波器。該類型的示波器能夠?qū)崿F(xiàn)長(zhǎng)期存儲(chǔ)模擬信號(hào),并能能夠運(yùn)用相應(yīng)的編程語言編寫相應(yīng)的算法對(duì)存儲(chǔ)的數(shù)據(jù)進(jìn)行處理,如對(duì)被測(cè)信號(hào)的波形、頻率、相位、功率譜和幅度等參數(shù)進(jìn)行精確的測(cè)量。數(shù)字示波器的出現(xiàn),是示波器技術(shù)發(fā)展的一個(gè)里程碑,其成功的實(shí)現(xiàn)了傳統(tǒng)模擬示波器所無法完成的功能,為現(xiàn)代測(cè)量技術(shù)的發(fā)展提供了強(qiáng)大的動(dòng)力[10]。

數(shù)字示波器典型原理框圖如圖2.1所示。

圖2.1              數(shù)字示波器典型原理框圖

2.2 數(shù)字示波器與模擬示波器相比較

1、數(shù)字示波器的一大特點(diǎn)是能夠無閃爍地觀察出很低頻率的被測(cè)信號(hào),這是模擬示波器無法勝任的。對(duì)于很高頻率的被測(cè)信號(hào),模擬示波器首先要有很高的帶寬,同時(shí)還要有陰極射線示波管,這些將大大提高模擬示波器的造價(jià),而且模擬示波器的穩(wěn)定性與顯示精度也將大打折扣。而在數(shù)字示波器上,由于可以用一個(gè)固定的刷新顯示速度對(duì)存儲(chǔ)數(shù)據(jù)進(jìn)行顯示,而且波形數(shù)據(jù)可以在液晶屏幕上顯示,這樣將大幅降低示波器的造價(jià)和讀出顯示所要求的帶寬。并且在觀察低頻信號(hào)時(shí),不至于因?yàn)檫^快的顯示而丟失波形的細(xì)節(jié)信息[11]。

2、數(shù)字示波器能做到很深的存儲(chǔ)深度,即允許存儲(chǔ)很長(zhǎng)時(shí)間內(nèi)捕捉到的信號(hào)。在對(duì)單次瞬變信號(hào)的分析和處理方面,數(shù)字示波器的這一大優(yōu)點(diǎn)將大有作為。在實(shí)際應(yīng)用中常常會(huì)碰到很多瞬變的信號(hào),比如放電現(xiàn)象、單次沖擊波等都是在短暫的一瞬間產(chǎn)生的。用模擬示波器觀察這些瞬變信號(hào)時(shí),波形將在屏幕上一閃而過,根本來不及觀察,很多的波形細(xì)節(jié)都會(huì)被忽略[12]。在數(shù)字示波器出現(xiàn)之前的年代,當(dāng)時(shí)的工程師設(shè)計(jì)了“屏幕照相”,來解決模擬示波器在觀察瞬變信號(hào)時(shí)的缺陷。

3、具有多樣的觸發(fā)功能。數(shù)字示波器不僅能檢測(cè)并顯示觸發(fā)后的信號(hào),而且還能檢測(cè)并顯示觸發(fā)前的信號(hào),并且顯示波形的超前或滯后時(shí)間可以任意選擇。在材料強(qiáng)度、地震研究、生物機(jī)能等方面的實(shí)驗(yàn)研究上,數(shù)字示波器是一個(gè)非常有利的工具。通過不同的器件或算法,數(shù)字示波器可以實(shí)現(xiàn)不同的觸發(fā)方式,使得在對(duì)電信號(hào)進(jìn)行跟蹤和分析時(shí)變得更加的方便和準(zhǔn)確。

4、測(cè)量精度高。模擬示波器的水平精度受到水平軸掃描鋸齒波線性度的限制,其精度很難提高,一般限制在3%~5%之間。而數(shù)字示波器由于采用了高穩(wěn)定度的晶振,可以達(dá)到很高的測(cè)量精度。此外,還可以通過采用更高位的A/D轉(zhuǎn)換器來進(jìn)一步提高垂直精度。同時(shí)由于數(shù)字示波器克服了示波管對(duì)測(cè)量精度的影響,使得測(cè)量精度可以很容易的達(dá)到1%以上。尤其是數(shù)字示波器能夠自動(dòng)的設(shè)置各種參數(shù),這將使信號(hào)的實(shí)時(shí)檢測(cè)更加的高效。

5、數(shù)字示波器都嵌入了高速微處理器,使它具有很強(qiáng)的信號(hào)處理能力與靈活的程序控制性,從而可以方便的實(shí)現(xiàn)對(duì)多種波形數(shù)據(jù)的測(cè)量、分析與顯示。例如可以分析出波形的周期、頻率、相位、峰峰值以及方波的占空比等參數(shù)。此外,數(shù)字示波器還能與計(jì)算機(jī)進(jìn)行數(shù)據(jù)通信,將測(cè)量的數(shù)據(jù)傳輸給計(jì)算機(jī),利用計(jì)算機(jī)中的軟件對(duì)數(shù)據(jù)進(jìn)行分析處理與顯示。

雖然數(shù)字示波器有很多優(yōu)勢(shì),但它也存在一定的缺陷。例如,由于受到A/D轉(zhuǎn)換器最大轉(zhuǎn)換速率的限制,數(shù)字示波器的性能無法發(fā)揮到極致[13]。目前,在觀察超高頻率信號(hào)方面,數(shù)字示波器還是難于完全勝任。不過伴隨著A/D轉(zhuǎn)換器等技術(shù)的發(fā)展,數(shù)字示波器的功能將越來越完善。

2.3 數(shù)字示波器技術(shù)指標(biāo)2.3.1 最大采樣速率

定義:?jiǎn)挝粫r(shí)間內(nèi)所完成的對(duì)模擬輸入信號(hào)的采樣次數(shù)就叫做最大A/D采樣速率,單位為Sa/S(次/秒)。最大采樣速率主要取決于A/D轉(zhuǎn)換器的最高轉(zhuǎn)換速率,同時(shí)也受處理器處理速度的限制。最大采樣速率代表數(shù)字示波器在時(shí)間軸上對(duì)信號(hào)的捕獲能力,其采樣率越大,在時(shí)間軸上對(duì)高速單次信號(hào)的捕獲能力就越強(qiáng)。

數(shù)字示波器實(shí)際所使用的采樣速率與所設(shè)定的示波器水平掃描時(shí)間之間具有一定的關(guān)系,即示波器需要顯示的點(diǎn)數(shù)和水平掃描時(shí)間因子將一起決定示波器實(shí)際所使用的采樣速率,其計(jì)算公式可表示為

                                                                                               (2.1)

式(2.1)中,N表示顯示屏每格顯示的點(diǎn)數(shù);t/div表示示波器水平掃描時(shí)間因子,也就是示波器掃描顯示一格所需的時(shí)間[14]。比如選示波器的水平掃描時(shí)間為10ms/div,每格包含100個(gè)采樣點(diǎn),那么可以計(jì)算得知此時(shí)示波器的采樣率為10KHz。因?yàn)槭静ㄆ魉斤@示的點(diǎn)數(shù)是固定的,那么示波器的水平掃描速度將和采樣速率具有一一對(duì)應(yīng)的關(guān)系,也就是說示波器最快的掃描速度是由其最大采樣速率決定的。如果某示波器的最大采樣速率為100MHz,那么其最快的掃描速度為1uS/div。

2.3.2 存儲(chǔ)寬度

示波器的存儲(chǔ)寬度和采樣速率也存在密切的關(guān)系。根據(jù)奈奎斯特抽樣定理,如果采樣速率大于或等于信號(hào)最高頻率的2倍,那么就可以完整的恢復(fù)原始信號(hào)的波形。但是在數(shù)字示波器設(shè)計(jì)過程中,往往會(huì)為了更真實(shí)的顯示信號(hào)波形,而需要在一個(gè)信號(hào)周期內(nèi)采集更多的點(diǎn)。一個(gè)信號(hào)周期內(nèi)采集到的點(diǎn)數(shù)越多,還原出來的波形的失真就越小。

2.3.3 分辨率

分辨率是指能夠分辨出的被測(cè)信號(hào)波形的最小幅值,其指示的是信號(hào)波形細(xì)節(jié)的綜合指標(biāo),包括水平分辨率和垂直分辨率。

垂直分辨率又稱電壓分辨率,它取決于A/D數(shù)模轉(zhuǎn)換器的分辨率,通常用數(shù)模轉(zhuǎn)換器數(shù)據(jù)的位數(shù)來表示,單位是比特[15]。比如,如果某數(shù)字示波器所使用的A/D數(shù)模轉(zhuǎn)換器的精度是8位的,那么稱該數(shù)字示波器的垂直分辨率是8bit。垂直分辨率也可用顯示屏每格的A/D轉(zhuǎn)換級(jí)數(shù)表示,單位是級(jí)/div。假設(shè)某數(shù)字示波器使用的是8bit的A/D轉(zhuǎn)換器,顯示屏垂直方向上有8個(gè)格,那么稱該數(shù)字示波器的垂直分辨率為32級(jí)/div。

水平分辨率又稱時(shí)間間隔分辨率,通常以數(shù)字示波器在進(jìn)行波形采樣時(shí)所能分辨的最小時(shí)間間隔值來表示。如果沒有加入內(nèi)插,當(dāng)數(shù)字示波器的采樣速率為

時(shí),則定義數(shù)字示波器的水平分辨率為 ;如果加入內(nèi)插算法,并且內(nèi)插器的增益為N,則定義數(shù)字示波器的水平分辨率為 。如果某數(shù)字示波器的記錄長(zhǎng)度為1KB,顯示屏橫向坐標(biāo)為十格,則該示波器水平分辨率約為100點(diǎn)/div。

分辨率與測(cè)量準(zhǔn)確度緊密相關(guān),但分辨率并非就是測(cè)量準(zhǔn)確度,而是理想情況下測(cè)量準(zhǔn)確度的上線。

2.3.4 記錄長(zhǎng)度

記錄長(zhǎng)度又稱存儲(chǔ)深度,用記錄一幀波形數(shù)據(jù)所利用的存儲(chǔ)容量來表示,單位為KB或MB等。記錄長(zhǎng)度表示的是數(shù)字示波器能夠連續(xù)存入采樣點(diǎn)的最大字節(jié)數(shù)。記錄長(zhǎng)度和水平分辨率之間存在正比的關(guān)系,即記錄長(zhǎng)度越長(zhǎng),水平分辨率就越高;反之,記錄長(zhǎng)度越短,水平分辨率就越低。一般來說,記錄長(zhǎng)度越長(zhǎng),就允許用戶捕捉更長(zhǎng)時(shí)間內(nèi)的事件,就能更好的描述更為復(fù)雜的波形。但是由于高速存儲(chǔ)器制造技術(shù)的限制,目前數(shù)字示波器的記錄長(zhǎng)度是有限的,通常采用的是1KB,4KB,8KB或者是更大的記錄長(zhǎng)度。需要指出的是,對(duì)于一個(gè)數(shù)字示波器,其記錄長(zhǎng)度是一個(gè)定值,但實(shí)際使用中存儲(chǔ)容量是可以變化的。

2.3.5 存儲(chǔ)帶寬

存儲(chǔ)帶寬定義為示波器輸入不同頻率的等幅正弦波信號(hào)時(shí),顯示屏上顯示的信號(hào)幅度下降3dB時(shí)所對(duì)應(yīng)的輸入信號(hào)的上、下限頻率之差,也稱為示波器的頻帶寬度,單位為MHz或GHz[16]。

數(shù)字示波器有模擬帶寬和存儲(chǔ)帶寬兩種表達(dá)方式。模擬帶寬指的是采樣點(diǎn)路以前模擬信號(hào)通道電路的頻帶寬度,主要由信號(hào)調(diào)理電路的幅頻特性決定。如果沒有特殊說明,數(shù)字示波器的頻帶寬度一般指的是其模擬帶寬。存儲(chǔ)寬度按其采樣方式的不同又分為實(shí)時(shí)帶寬與等效帶寬兩種。實(shí)時(shí)帶寬指的是采用實(shí)時(shí)采樣方式時(shí)所具有的存儲(chǔ)寬度,主要取決于A/D轉(zhuǎn)換器的采樣速率和波形處理所采用的內(nèi)插技術(shù)。根據(jù)取樣定理,如果采樣速率大于或等于信號(hào)最高頻率分量的兩倍,便可重現(xiàn)原始信號(hào)波形。在數(shù)字示波器設(shè)計(jì)中,通常要求比信號(hào)頻率高更多倍數(shù)的采樣速率,以保證顯示分辨率。采用點(diǎn)顯示方式時(shí),每周期采樣點(diǎn)數(shù)k一般取20~25,也即要求采樣頻率是信號(hào)頻率的20~25倍。采用插值技術(shù)可以降低示波器對(duì)采樣速率的要求,采用矢量?jī)?nèi)插方式時(shí),一般取k=10;當(dāng)采用正弦內(nèi)插方式時(shí),一般取k=2.5。等效帶寬指的是示波器工作在等效采樣方式下,測(cè)量周期信號(hào)時(shí)所表現(xiàn)出來的頻帶寬度。在等效采樣方式下,要求信號(hào)必須是周期重復(fù)的,否則無法準(zhǔn)確的重現(xiàn)波形。使用等效采樣時(shí),數(shù)字示波器一般要經(jīng)過多個(gè)采樣周期,并對(duì)采集的樣點(diǎn)進(jìn)行重新組合,才能重顯被測(cè)波形。等效帶寬可以做的很寬,有的數(shù)字示波器的等效帶寬可達(dá)到幾十GHz以上。

2.3.6 垂直靈敏度及誤差

垂直靈敏度是指數(shù)字示波器顯示在垂直方向(Y軸)每格所代表的電壓幅度值,常以V/div、mV/div表示。根據(jù)模擬示波器的習(xí)慣,數(shù)字示波器也按1-2-5步進(jìn)方式分擋,每擋也可以細(xì)調(diào)。垂直靈敏度表明了示波器測(cè)量最大和最小信號(hào)幅度的能力。垂直靈敏度誤差是指數(shù)字示波器測(cè)量信號(hào)幅度的準(zhǔn)確度,一般用規(guī)定頻率的標(biāo)準(zhǔn)幅度脈沖信號(hào)作校驗(yàn)信號(hào),其計(jì)算公式如下

                                                            (2.2)

式(2.2)中,e為垂直靈敏度誤差,V1為測(cè)量讀數(shù)值(V),V2為校準(zhǔn)信號(hào)每格電壓值(V),D為校準(zhǔn)信號(hào)格數(shù)(div)。

2.3.7 掃描速度及誤差

掃描速度(又稱掃描時(shí)間因數(shù),簡(jiǎn)稱為掃速)定義為示波器光點(diǎn)在屏幕水平方向上移動(dòng)一格所占用的時(shí)間,以s/div、ms/div、μs/div、ns/div、ps/div等表示。掃描速度表明了示波器能測(cè)量信號(hào)頻率的范圍。沿用模擬示波器的習(xí)慣,也按1-2-5步進(jìn)方式分擋,每擋也能細(xì)調(diào)。掃描速度取決于A/D轉(zhuǎn)換器的轉(zhuǎn)換速率及記錄長(zhǎng)度(存儲(chǔ)容量),其值為相鄰兩個(gè)取樣點(diǎn)的時(shí)間間隔與每格取樣點(diǎn)數(shù)N的乘積,即

                                                                             (2.3)

掃描速度誤差是指示波器測(cè)量時(shí)間間隔的準(zhǔn)確度。一般用具有標(biāo)準(zhǔn)周期時(shí)間的脈沖信號(hào)作為校驗(yàn)信號(hào),其計(jì)算公式如下式

                                                  (2.4)

式(2.4)中,e為掃描誤差;Δt為校準(zhǔn)信號(hào)周期時(shí)間測(cè)量讀數(shù)值;T0為校準(zhǔn)信號(hào)周期時(shí)間值。

2.4 采樣原理分析2.4.1 實(shí)時(shí)采樣方式的原理

實(shí)時(shí)取樣指的是利用等時(shí)間間隔取樣脈沖對(duì)被測(cè)信號(hào)進(jìn)行取樣,按照取樣時(shí)鐘的先后順序?qū)/D采樣的數(shù)據(jù)存在存儲(chǔ)器中的過程。取樣就是對(duì)連續(xù)的信號(hào)波形進(jìn)行量化的過程,如圖2.2所示。其方法可用圖2.3說明。

圖2.2   取樣示意圖

圖片請(qǐng)下載附件中有完整版

圖2.3   取樣方框圖

把模擬信號(hào)的波形送到采樣保持電路,并通過采樣脈沖來控制采樣電路對(duì)模擬信號(hào)進(jìn)行采樣,取樣方框圖如圖2.3所示。令n代表第n個(gè)時(shí)刻的抽樣,在取樣脈沖到來的瞬間,在A/D轉(zhuǎn)換器的輸入端就得到相應(yīng)的模擬量An(n=1,2,3,…),這個(gè)模擬量An就是所需要的用于進(jìn)行離散化的模擬量。若把An中的每一個(gè)離散模擬量進(jìn)行A/D轉(zhuǎn)換,就可以得到相應(yīng)的數(shù)字量,這也就是量化的過程。我們把A/D采樣得到的數(shù)據(jù)按照采樣順序進(jìn)行存儲(chǔ),也就實(shí)現(xiàn)了將模擬信號(hào)轉(zhuǎn)化為一序列的數(shù)字信號(hào)進(jìn)行存儲(chǔ)。A/D轉(zhuǎn)換器是將模擬信號(hào)進(jìn)行數(shù)字化的核心器件,它與數(shù)字示波器的存儲(chǔ)帶寬、最大取樣速率以及垂直分辨率等多項(xiàng)指標(biāo)有關(guān),所以A/D轉(zhuǎn)換器的選取是數(shù)字示波器設(shè)計(jì)過程中非常重要的一個(gè)環(huán)節(jié)。

2.4.2 等效取樣方式的原理

實(shí)時(shí)取樣方式對(duì)觀測(cè)單次瞬變信號(hào)特別有效,是數(shù)字示波器采樣方式中不可或缺的一種。但受到最大采樣速率的約束,實(shí)時(shí)采樣方式很難實(shí)現(xiàn)大的帶寬。因此,想要提高帶寬,就必須尋找一種更有效的取樣方式,而等效取樣正是一種有效的能提高帶寬的方式。等效取樣方式也稱非事實(shí)取樣,可分為順序取樣和隨機(jī)取樣兩種方式。等效取樣方式的原理是先利用“等效取樣技術(shù)”,將高頻周期性信號(hào)轉(zhuǎn)換為波形性質(zhì)與其相似的低頻周期性信號(hào),然后對(duì)采集到的低頻信號(hào)進(jìn)行處理與轉(zhuǎn)化,就可以輕松的獲得很寬的頻帶,從而實(shí)現(xiàn)對(duì)高頻周期性信號(hào)的檢測(cè)[17]。但是等效取樣方式有兩個(gè)制約條件:1、必須是周期性的信號(hào);2、信號(hào)波形能夠形成穩(wěn)定的觸發(fā)。常用的等效取樣方式的采集系統(tǒng)框圖如圖2.4所示。

圖2.4              等效取樣方式采集系統(tǒng)框圖


3 系統(tǒng)方案論證
3.1 系統(tǒng)總體方案設(shè)計(jì)

數(shù)字示波器很大的一個(gè)特點(diǎn),就是能對(duì)采集到的波形數(shù)據(jù)進(jìn)行處理,通過特定的算法即可測(cè)量出信號(hào)的頻率、幅值和相位等電氣參數(shù)。并且示波器能將運(yùn)算處理后的數(shù)據(jù)直接顯示在LCD液晶屏上,通過調(diào)整合適的掃描速度就能方便的觀察到信號(hào)的細(xì)節(jié)。由于示波器需要處理的數(shù)據(jù)量比較大,且對(duì)于高頻信號(hào)需要很高的采樣率和刷新速度,因此一般的微處理器難于滿足[19]。目前高性能的數(shù)字示波器都采用FPGA來控制數(shù)據(jù)的采集和處理數(shù)據(jù)。由于FPGA的靈活性極高,采用FPGA的系統(tǒng)能高效的處理數(shù)據(jù)及顯示波形。但是由于FPGA的成本較高,并不適用于低端便攜式產(chǎn)品上。

本文的設(shè)計(jì)理念是便攜式、低成本,因此需要尋找一款性能高、價(jià)格低的微處理器?紤]到成本和實(shí)際應(yīng)用,本文選擇了意法半導(dǎo)體公司的STM32微處理器作為主控制器。STM32系列是基于專為要求高性能、低成本、低功耗的嵌入式應(yīng)用專門設(shè)計(jì)的ARM Cortex-M3內(nèi)核,能完全滿足本設(shè)計(jì)對(duì)成本和性能的要求。

本文的另外一個(gè)亮點(diǎn)就是使用了Android作為波形顯示平臺(tái)。在這個(gè)基本上是人手一部Android手機(jī)的時(shí)代,怎樣充分挖掘Android軟硬件的使用價(jià)值就顯得尤為重要。本設(shè)計(jì)用到Android的屏幕來顯示波形,而且還使用了觸摸屏來對(duì)示波器進(jìn)行控制,這樣將大大縮小硬件的體積和降低系統(tǒng)成本。同時(shí)示波器硬件電路和Android之間通過藍(lán)牙實(shí)現(xiàn)無線數(shù)據(jù)傳輸,這使得系統(tǒng)的應(yīng)用將是非常的方便。

數(shù)字示波器的結(jié)構(gòu)框圖如圖3.1所示。

本論文設(shè)計(jì)的數(shù)字示波器的工作方式是,被測(cè)信號(hào)經(jīng)STM32控制的采樣電路進(jìn)行采樣并對(duì)數(shù)據(jù)進(jìn)行處理,然后通過藍(lán)牙把處理過后的波形數(shù)據(jù)發(fā)送到Android端,最后通過Android端的應(yīng)用程序把波形顯示出來。在Android端的應(yīng)用程序上可以操作示波器的所有功能,比如調(diào)節(jié)垂直靈敏度、水平掃描速度、觸發(fā)電平、垂直基線等。同時(shí)本設(shè)計(jì)非常小巧,且使用鋰電池進(jìn)行供電,非常方便攜帶。本設(shè)計(jì)的理念是,只要你擁有一臺(tái)Android手機(jī)或者平板電腦,你就可以擁有一個(gè)低成本的、便于攜帶的數(shù)字示波器。

圖片請(qǐng)下載附件有完整版

圖3.1  結(jié)構(gòu)框圖

模擬信號(hào)處理是示波器的重要組成部分,也是信號(hào)采集系統(tǒng)中的一個(gè)核心部分。圖3.1清晰的介紹了數(shù)字示波器的結(jié)構(gòu)框圖,從圖中可以看出,模擬通道的輸入信號(hào)被分成兩路,一路送至程控放大器,用來實(shí)現(xiàn)垂直靈敏度的調(diào)節(jié);另一路送至觸發(fā)電路,用于測(cè)量被測(cè)信號(hào)的頻率。其中程控放大器是示波器模擬部分設(shè)計(jì)的關(guān)鍵,也是示波器帶寬最重要的限制因素。

3.2 數(shù)據(jù)采集系統(tǒng)3.2.1 波形整形電路方案選擇

波形整形電路的選擇主要是選擇合適的比較器芯片,為了防止波形在過零點(diǎn)出現(xiàn)抖動(dòng),比較電路最好是接成滯回比較結(jié)構(gòu),以免影響比較器的輸出波形。

方案一:采用Maxim公司的高速比較芯片Max912構(gòu)成滯回比較器。Max912的最高轉(zhuǎn)換速度可達(dá)ns級(jí)別,對(duì)頻率很高的信號(hào)都能進(jìn)行有效的整形。但缺點(diǎn)是Max912的成本太高。

方案二:采用比較器LM311構(gòu)成滯回比較器。在對(duì)5M以下的信號(hào)進(jìn)行整形時(shí),能收到比較好的效果。最主要的還是其價(jià)格相對(duì)比較低,能滿足本設(shè)計(jì)對(duì)成本的控制。但當(dāng)信號(hào)頻率高于5M時(shí),由于收到LM311轉(zhuǎn)換速度的限制,其整形效果比較差。

基于本設(shè)計(jì)對(duì)測(cè)試范圍的要求以及成本的控制,本設(shè)計(jì)選擇方案二。

3.2.2 程控放大電路方案選擇

由于A/D轉(zhuǎn)換器的輸入范圍一般都比較。ǖ陀2Vpp),不可能直接測(cè)量幾十伏甚至是幾百伏的信號(hào)。而且由于A/D轉(zhuǎn)換器的分辨率有限,對(duì)于幅值很低的信號(hào)測(cè)量誤差將會(huì)很大甚至是無法測(cè)量。所以在輸入級(jí)必須要設(shè)計(jì)一個(gè)程控放大電路,以現(xiàn)實(shí)對(duì)信號(hào)進(jìn)行不失真的處理,而后再送至A/D數(shù)模轉(zhuǎn)換器,以達(dá)到A/D數(shù)模轉(zhuǎn)換器的輸入要求。通常情況下所說的“示波器的模擬帶寬”就是輸入級(jí)的模擬信號(hào)放大電路的帶寬。而數(shù)字示波器的帶寬主要是用采樣率來定義,主要受數(shù)模轉(zhuǎn)換器的最高采樣率以及控制器的處理速度的限制。

方案一:利用高速運(yùn)放LM6172構(gòu)成放大電路,并設(shè)置多種不同放大倍數(shù)的反饋電阻網(wǎng)絡(luò),然后通過控制繼電器選擇不同的反饋電阻,從而實(shí)現(xiàn)不同放大倍數(shù)的切換。其優(yōu)點(diǎn)是電路和控制都比較簡(jiǎn)單,放大倍數(shù)穩(wěn)定。但缺點(diǎn)是繼電器的工作電流大,且需要多個(gè)繼電器配合才能實(shí)現(xiàn)多種不同的放大倍數(shù),很明顯不符合本設(shè)計(jì)便攜小巧的宗旨。同時(shí)繼電器在開和關(guān)的瞬間都會(huì)產(chǎn)生很大的電磁干擾,有可能會(huì)影響到系統(tǒng)的正常運(yùn)行。

方案二:使用模擬開關(guān)HCF4051BE代替繼電器,來實(shí)現(xiàn)不同放大倍數(shù)的切換。優(yōu)點(diǎn)是克服了繼電器工作電流大、體積大等缺點(diǎn),且電路結(jié)構(gòu)簡(jiǎn)單,成本低廉。但缺點(diǎn)是模擬開關(guān)無法實(shí)現(xiàn)零阻抗,且其帶寬有限,通過高頻信號(hào)將會(huì)產(chǎn)生失真。

方案三:使用專用PGA芯片AD603,可以通過MCU來控制AD603的基準(zhǔn),進(jìn)而實(shí)現(xiàn)不同放大倍數(shù)的調(diào)節(jié)。該電路優(yōu)點(diǎn)是控制比較簡(jiǎn)單,且增益調(diào)節(jié)范圍大,外圍電路簡(jiǎn)單。缺點(diǎn)是成本稍微偏高。

基于本設(shè)計(jì)便攜小巧的宗旨,和電路復(fù)雜度的考慮,本設(shè)計(jì)選擇方案三。

3.3 數(shù)據(jù)處理系統(tǒng)3.3.1 觸發(fā)方案選擇

為了波形能在示波器顯示屏上穩(wěn)定顯示,必須要到用觸發(fā)系統(tǒng),以保證被測(cè)信號(hào)與掃描信號(hào)始終保持同步。也即是每次掃描的起始點(diǎn),都是信號(hào)波形一個(gè)周期內(nèi)固定的一個(gè)點(diǎn)。

方案一:采用高速比較器構(gòu)成觸發(fā)電路。這種方法對(duì)于比較器的轉(zhuǎn)換速率要求很高,在帶寬很高的示波器上,一般的比較器難于滿足要求。并且采用高速比較器,將會(huì)增加系統(tǒng)的制作成本。此外,硬件觸發(fā)電路如果設(shè)計(jì)的不好,比較器的輸出容易產(chǎn)生抖動(dòng)毛刺,容易使系統(tǒng)誤將抖動(dòng)毛刺當(dāng)作觸發(fā)信號(hào),從而使整個(gè)硬件系統(tǒng)變的不可靠。

方案二:采用軟件觸發(fā)方式。軟件觸發(fā)的原理很簡(jiǎn)單,就是在MCU內(nèi)通過一定的算法,將A/D轉(zhuǎn)換器采集到的數(shù)據(jù)和軟件設(shè)置的觸發(fā)電平進(jìn)行比較,從而實(shí)現(xiàn)可靠的波形觸發(fā)。其優(yōu)點(diǎn)是可以根據(jù)實(shí)際情況方便的選擇不同的觸發(fā)方式和觸發(fā)電平,具有極高的靈活性。此外該方案在一定程度上消除了硬件觸發(fā)電路產(chǎn)生的干擾毛刺,提高系統(tǒng)的穩(wěn)定性。

基于以上對(duì)系統(tǒng)穩(wěn)定性和成本控制的考慮,本設(shè)計(jì)選擇方案二。

3.3.2 峰值測(cè)量方案選擇

對(duì)示波器來說,測(cè)量并顯示信號(hào)峰值是其必不可少的一部分。信號(hào)峰值測(cè)量包括正峰值和負(fù)峰值,而信號(hào)峰峰值就是正負(fù)峰值的絕對(duì)值。

方案一:峰值檢波法。峰值檢波法是利用硬件電路對(duì)電容進(jìn)行充放電,從而在電容兩端保持信號(hào)峰值。然后通過A/D轉(zhuǎn)換器采集電容兩端的電壓值,并把峰值顯示出來。峰值檢波法能有效的測(cè)量出信號(hào)的峰值,且由于是采用硬件電路來實(shí)現(xiàn)峰值的檢測(cè),不會(huì)對(duì)MCU增加任何的負(fù)擔(dān)。但該方案的缺點(diǎn)是需要采用高速運(yùn)算放大器,不但增加了系統(tǒng)的設(shè)計(jì)成本,同時(shí)也增加了硬件系統(tǒng)的復(fù)雜度。

方案二:數(shù)字方法。所謂數(shù)字方法,就是通過分析A/D轉(zhuǎn)換器所采集到的波形數(shù)據(jù),采用最大值和最小值算法,計(jì)算出信號(hào)的正峰值和負(fù)峰值。該方案的缺點(diǎn)是增加了軟件算法的復(fù)雜度,從而降低了波形數(shù)據(jù)采集、處理和顯示的速度。另外,由于受到A/D轉(zhuǎn)換器最高采樣率的限制,該方法不適用于高頻信號(hào)的測(cè)量。

考慮到本設(shè)計(jì)測(cè)量的頻率范圍不是很大,且在軟件系統(tǒng)中增加峰值測(cè)量算法,對(duì)信號(hào)數(shù)據(jù)處理及顯示速度的影響不大。同時(shí)為了不增加系統(tǒng)的設(shè)計(jì)成本,本設(shè)計(jì)的峰值測(cè)量方案采用方案二。

3.3.3 測(cè)量頻率方案選擇

因?yàn)楸粶y(cè)信號(hào)頻率的大小決定了示波器的采樣方式,且直接決定采樣時(shí)鐘的選擇,因而測(cè)量頻率在示波器中顯得尤為重要。測(cè)量頻率的方案通常有測(cè)周法和測(cè)頻法兩種。

方案一:測(cè)周法。這是一種比較簡(jiǎn)單易用的方案,其原理是被測(cè)信號(hào)通過觸發(fā)電路,連接到單片機(jī)定時(shí)器的計(jì)數(shù)IO口上,實(shí)現(xiàn)對(duì)被測(cè)信號(hào)周期數(shù)的測(cè)量。然后取一個(gè)固定的計(jì)數(shù)門限,通過計(jì)算在該固定時(shí)間內(nèi)計(jì)數(shù)器的計(jì)數(shù)值,就可以計(jì)算出被測(cè)信號(hào)的頻率。也可以是通過計(jì)算一定周期數(shù)的脈沖,然后再算出計(jì)數(shù)所使用的時(shí)間,就能知道被測(cè)信號(hào)的頻率了。 在被測(cè)信號(hào)頻率較高的場(chǎng)合,該方案可以做到很高的精度。在被測(cè)信號(hào)頻率較低時(shí),如果想保持高精度的話,則需要加長(zhǎng)計(jì)數(shù)門限時(shí)間,但這會(huì)使得示波器的響應(yīng)變慢。換言之,該方案的缺點(diǎn)是測(cè)量精度受被測(cè)信號(hào)頻率的影響。

方案二:等精度測(cè)頻法。其原理是在一個(gè)固定的門限時(shí)間內(nèi),使用一個(gè)固定頻率的基準(zhǔn)脈沖,使得被測(cè)信號(hào)與基準(zhǔn)脈沖同時(shí)計(jì)數(shù),再通過兩個(gè)計(jì)數(shù)值之間的關(guān)系便可以計(jì)算出被測(cè)信號(hào)頻率。門限時(shí)間的開啟由被測(cè)脈沖的邊沿來觸發(fā)。該方案的優(yōu)點(diǎn)是測(cè)量精度與被測(cè)信號(hào)頻率無關(guān),且只要基準(zhǔn)脈沖頻率足夠大,系統(tǒng)就能夠?qū)崿F(xiàn)很高的測(cè)量精度。

考慮到本設(shè)計(jì)的測(cè)量頻率范圍比較大,且要求在整個(gè)頻段內(nèi)都能保持一定的測(cè)量精度,因此采用方案二。

3.3.4 采樣方案選擇

在現(xiàn)代數(shù)字示波器一般都會(huì)同時(shí)采用實(shí)時(shí)采樣和等效采樣這兩種采樣方式。

方案一:實(shí)時(shí)采樣。實(shí)時(shí)采樣是在信號(hào)的一個(gè)完整周期內(nèi)對(duì)其采樣,故顯示的都是信號(hào)的實(shí)時(shí)波形。按照奈奎斯特抽樣定理,采樣速率必須高于信號(hào)最高頻率分量的2倍,否則無法恢復(fù)原始信號(hào)。對(duì)于周期正弦信號(hào),一個(gè)周期內(nèi)的采樣點(diǎn)要多于2個(gè)。考慮實(shí)際因素的影響,為了不失真地恢復(fù)被測(cè)信號(hào)的波形,通常按照恢復(fù)失真度選取相應(yīng)的采樣點(diǎn)數(shù)。這里用采樣點(diǎn)直接恢復(fù)方式,因此一個(gè)信號(hào)周期內(nèi)至少需要20個(gè)采樣點(diǎn)數(shù)。該方案的缺點(diǎn)是在信號(hào)頻率很高時(shí),由于受到采樣器件的限制,很難實(shí)現(xiàn)實(shí)時(shí)采樣。

方案二:等效采樣。等效采樣又稱為非實(shí)時(shí)采樣,可分為順序采樣和隨機(jī)采樣兩種方式。順序采樣是對(duì)每一個(gè)信號(hào)周期僅采樣一點(diǎn),經(jīng)過若干個(gè)周期的采樣之后,就能完整的恢復(fù)原始信號(hào)的波形。隨機(jī)采樣是在每個(gè)采樣周期內(nèi)采集多個(gè)采樣點(diǎn),并且每個(gè)采樣周期第一個(gè)采樣點(diǎn)的時(shí)刻是隨機(jī)的,經(jīng)過多個(gè)采樣周期的疊加即可還原原始波形。但等效采樣法的前提是,被測(cè)信號(hào)必須是周期信號(hào)且能有效的觸發(fā),也就是說等效采樣方式對(duì)單次信號(hào)的測(cè)量是無能為力的。

等效采樣雖然可以對(duì)很高頻率的信號(hào)進(jìn)行采樣,但是步進(jìn)延遲的采樣技術(shù)較難實(shí)現(xiàn),而且總采樣時(shí)間過長(zhǎng),從而導(dǎo)致示波器反應(yīng)速度慢。而實(shí)時(shí)采樣方式的優(yōu)點(diǎn)是采樣所需的時(shí)間很短,示波器響應(yīng)快。同時(shí)考慮到本設(shè)計(jì)所要求的采樣率不是特別高,因此本設(shè)計(jì)選用實(shí)時(shí)采樣的方式。


4 系統(tǒng)硬件電路設(shè)計(jì)
4.1 微控制器電路

主控制器采用STM32F103系列單片機(jī)作為控制核心。STM32系列基于專為要求高性能、低成本、低功耗的嵌入式應(yīng)用專門設(shè)計(jì)的ARM Cortex-M3內(nèi)核。其具有最高72MHz的工作頻率,能夠滿足系統(tǒng)對(duì)速度的要求。微控制器電路如圖4.1所示。

圖4.1              微控制器電路

4.2 電源電路設(shè)計(jì)

本設(shè)計(jì)的定位是便攜式,因此采用鋰電池供電。鋰電池選用目前市場(chǎng)上性價(jià)比最高的18650電池,容量為2000mAh,并可充電。因?yàn)殇囯姵氐碾妷簽?.7V,因此需要設(shè)計(jì)一個(gè)升壓電路把電壓升壓到5V,才能給系統(tǒng)供電。升壓電路如圖4.2所示。

           

圖4.2              升壓電路

此外,還需要設(shè)計(jì)一個(gè)負(fù)電壓轉(zhuǎn)換電路,以產(chǎn)生-5V來給運(yùn)放供電。負(fù)電壓轉(zhuǎn)換電路采用芯片ICL7660來完成,該芯片具有成本低、電路結(jié)構(gòu)簡(jiǎn)單等優(yōu)點(diǎn)。負(fù)電壓轉(zhuǎn)換電路如圖4.3所示。

         

圖4.3              負(fù)電壓轉(zhuǎn)換電路

4.3 信號(hào)采集電路設(shè)計(jì)

信號(hào)采集部分是數(shù)字示波器和模擬示波器在本質(zhì)上的區(qū)別,其組成包括模擬信號(hào)的調(diào)理和數(shù)字信號(hào)的處理。數(shù)字示波器的性能也主要是受到信號(hào)采集系統(tǒng)的限制。因此對(duì)數(shù)字示波器來說,一個(gè)好的信號(hào)采集系統(tǒng)是至關(guān)重要的。

4.3.1 A/D轉(zhuǎn)換及FIFO緩存器

A/D轉(zhuǎn)換器是模擬信號(hào)轉(zhuǎn)換為數(shù)字信號(hào)的核心部分,其作用是將模擬信號(hào)轉(zhuǎn)換為便于存儲(chǔ)和處理的數(shù)字信號(hào)。在本設(shè)計(jì)中選用的AD轉(zhuǎn)換芯片為TI公司的8位高速AD轉(zhuǎn)換器ADS830E,它的采樣頻率為10kSa/s~60MSa/s,通過實(shí)驗(yàn)發(fā)現(xiàn)轉(zhuǎn)換速率在lK以下也能正常工作,本設(shè)計(jì)的最低采樣頻率為600Sa/s。由于高速AD轉(zhuǎn)換器一般都有高低端轉(zhuǎn)換速率的限制,選擇AD轉(zhuǎn)換芯片時(shí),不僅要注意最高轉(zhuǎn)換速率還要關(guān)注最低轉(zhuǎn)換速率,否則可能導(dǎo)致電路無法正常工作。

A/D采樣出來的數(shù)據(jù),是隨采樣時(shí)鐘和被測(cè)信號(hào)的變化而變化的,所以要能夠再現(xiàn)被測(cè)信號(hào),必須要把每次采集的數(shù)據(jù)存人緩存器。F1F0就是一個(gè)典型的緩存器,它是一個(gè)先進(jìn)先出的存儲(chǔ)器,可同時(shí)對(duì)存儲(chǔ)空間進(jìn)行讀寫,沒有地址線,第一個(gè)讀出來的數(shù)據(jù)是第一個(gè)寫進(jìn)去的數(shù)據(jù)。在本設(shè)計(jì)中選擇了專門的FIFO芯片IDT7203,如圖4.4所示。

圖4.4  A/D轉(zhuǎn)換及FIFO緩存電路

4.3.2 程控放大電路

程控放大電路主要是對(duì)被測(cè)信號(hào)在幅度上進(jìn)行線性處理,使信號(hào)在垂直方向上處于A/D轉(zhuǎn)換器的輸入范圍內(nèi)。待測(cè)模擬信號(hào)輸入到數(shù)字示波器時(shí)首先要經(jīng)過相關(guān)的處理才能夠送給ADC,因?yàn)锳DC對(duì)輸入電壓的幅度有一定的要求,比如2V~3V,或者1.5V~3.5V等。對(duì)于輸入的模擬信號(hào),要根據(jù)不同的垂直靈敏度做出調(diào)整,具體說就是把小電壓信號(hào)放大,將大電壓信號(hào)衰減使之符合ADC的輸入電壓范圍。因此,需要對(duì)電壓大小不同的信號(hào)進(jìn)行增益調(diào)整,也就是需要一個(gè)程控放大電路。本設(shè)計(jì)采用的程控放大電路如圖4.5所示。

圖4.5              程控放大電路

本設(shè)計(jì)采用可變?cè)鲆娣糯笃鰽D603來構(gòu)成程控放大電路。AD603是AD公司推出的一種低噪聲且由電壓控制的增益放大器。它提供精確的、可由管腳選擇的增益,它的增益是線性變化的,且在溫度和電源電壓變化時(shí)有很高的穩(wěn)定性,增益變化的范圍40dB,增益控制轉(zhuǎn)換比例25mV/dB, 響應(yīng)速度為40dB,變化范圍所需時(shí)間小于1us。AD603內(nèi)部包含一個(gè)七級(jí)R-2R梯形網(wǎng)絡(luò)組成的0dB到-42.14dB的可變衰減器和一個(gè)固定增益的放大器,此固定增益放大器的增益可通過外接不同反饋網(wǎng)絡(luò)的方式改變,以選擇AD603不同的增益變化范圍。

4.3.3 電平移位電路設(shè)計(jì)

因?yàn)锳DS830E的模擬輸入電壓范圍是1.5V~3.5V,輸入中點(diǎn)電壓為2.5V,所以基線電壓應(yīng)為2.5V。因此需要設(shè)計(jì)一個(gè)電平移位電路,把前級(jí)經(jīng)過調(diào)理后的信號(hào)疊加2.5V,以滿足AD轉(zhuǎn)換器的電壓輸入范圍。電平移位電路如圖4.6所示。

圖4.6              電平移位電路

電路圖中,IN為前級(jí)調(diào)理后的輸入信號(hào),ADC端接到AD轉(zhuǎn)換器的輸入端,Level為單片機(jī)的PWM輸出端。單片機(jī)輸出的PWM經(jīng)過RC低通濾波器之后,將會(huì)變成一個(gè)和占空比相對(duì)應(yīng)的電壓值,從而實(shí)現(xiàn)了通過改變PWM的占空比來改變信號(hào)波形的基線。

4.3.4 頻率測(cè)量電路

頻率的測(cè)量采用單片機(jī)外部中斷/INT,對(duì)頻率測(cè)量電路產(chǎn)生的脈沖進(jìn)行計(jì)數(shù),再通過對(duì)測(cè)量數(shù)據(jù)的校正來完成。為抑制干擾引起的誤翻轉(zhuǎn),本設(shè)計(jì)應(yīng)用滯回比較電路,將信號(hào)由反向端輸入。電路的正向閾值電壓滿足公式4.1,對(duì)應(yīng)于輸出信號(hào)的下降沿;其負(fù)向閾值電平為0V,對(duì)應(yīng)于輸出信號(hào)的上升沿。滯回比較器如圖4.7所示。

                                                (4.1)

在數(shù)字測(cè)量和控制系統(tǒng)中,由傳感器送來的波形邊沿較差,此外,脈沖信號(hào)經(jīng)過遠(yuǎn)距離的傳輸后,往往會(huì)發(fā)生各種各樣的畸變,利用滯回比較電路可以對(duì)這些信號(hào)進(jìn)行整形。整形效果如圖4.8所示。

圖4.7  波形整形電路

圖4.8  整形效果圖

4.4 無線數(shù)據(jù)傳輸

本設(shè)計(jì)的一大特點(diǎn)是,把采集到的波形數(shù)據(jù)發(fā)送到Android設(shè)備平臺(tái)進(jìn)行顯示,并使用藍(lán)牙技術(shù)進(jìn)行無線數(shù)據(jù)傳輸。本設(shè)計(jì)選用博陸科公司的BLK-MD-BC04-B型藍(lán)牙模塊,其采用英國CSR公司Blue Core4-Ext芯片,遵循V2.1+EDR藍(lán)牙規(guī)范。其支持UART、USB、SPI、PCM、SPDIF等接口,并支持SPP藍(lán)牙串口協(xié)議,具有成本低、體積小、功耗低、收發(fā)靈敏性高等優(yōu)點(diǎn),只需配備少許的外圍元件就能實(shí)現(xiàn)其強(qiáng)大功能。

該模塊主要用于短距離的數(shù)據(jù)無線傳輸領(lǐng)域?梢苑奖愕暮 PC機(jī)的藍(lán)牙設(shè)備相連,也可以兩個(gè)模塊之間的數(shù)據(jù)互通。避免繁瑣的線纜連接,能直接替代串口線。該模塊廣泛應(yīng)用于工業(yè)遙控、遙測(cè);POS系統(tǒng),無線鍵盤、鼠標(biāo);樓宇系統(tǒng)化、安防、機(jī)房設(shè)備無線監(jiān)控、門禁系統(tǒng);汽車檢測(cè)設(shè)備等領(lǐng)域。

藍(lán)牙模塊功能框圖如圖4.9所示,應(yīng)用電路如圖4.10所示。

圖4.9              藍(lán)牙模塊功能框圖

圖4.10              藍(lán)牙模塊應(yīng)用電路


5 系統(tǒng)軟件設(shè)計(jì)
5.1 單片機(jī)軟件開發(fā)環(huán)境

本設(shè)計(jì)采用STM32F103系列單片機(jī)作為控制核心,軟件開發(fā)環(huán)境選用keil uVision。

keil uVision是美國Keil Software公司出品的51系列兼容單片機(jī)C語言軟件開發(fā)統(tǒng),與匯編相比,C語言在功能上、結(jié)構(gòu)性、可讀性、可維護(hù)性上有明顯的優(yōu)勢(shì),因而易學(xué)易用。keil uVision軟件提供豐富的庫函數(shù)和功能強(qiáng)大的集成開發(fā)調(diào)試工具,全Windows界面。另外重要的一點(diǎn),只要看一下編譯后生成的匯編代碼,就能體會(huì)到Keil C51生成的目標(biāo)代碼效率非常之高,多數(shù)語句生成的匯編代碼很緊湊,容易理解。在開發(fā)大型軟件時(shí)更能體現(xiàn)高級(jí)語言的優(yōu)勢(shì)。

C51工具包的整體結(jié)構(gòu),其中uVision是C51 for Windows的集成開發(fā)環(huán)境(IDE),可以完成編輯、編譯、連接、調(diào)試、仿真等整個(gè)開發(fā)流程。開發(fā)人員可用IDE本身或其它編輯器編輯C或匯編源文件。然后分別由C51及A5l編譯器編譯生成目標(biāo)文件(.OBJ)。目標(biāo)文件可由LIB51創(chuàng)建生成庫文件,也可以與庫文件一起經(jīng)L51連接定位生成絕對(duì)目標(biāo)文件(.ABS)。ABS由OH51轉(zhuǎn)換成標(biāo)準(zhǔn)的Hex文件,以供調(diào)試器dScope51或tScope51使用進(jìn)行源代碼級(jí)調(diào)試,也可由仿真器使用直接對(duì)目標(biāo)板進(jìn)行調(diào)試,也可以直接寫入程序存儲(chǔ)器如EPROM中。

5.2 主程序設(shè)計(jì)及流程圖

本設(shè)計(jì)是一個(gè)以硬件為基礎(chǔ)的、軟硬件緊密結(jié)合的系統(tǒng)。對(duì)于智能儀器儀表來說,軟件就是靈魂。示波器軟件采用C語言來編寫,完成對(duì)人機(jī)界面、系統(tǒng)控制、系統(tǒng)硬件、波形參數(shù)分析等的控制。主程序流程圖如圖5.1所示。

5.3 數(shù)據(jù)處理子程序

5.3.1 同步觸發(fā)的軟件實(shí)現(xiàn)

為了降低電路的復(fù)雜性,本設(shè)計(jì)采用軟件來實(shí)現(xiàn)同步觸發(fā)。軟件觸發(fā)的好處是觸發(fā)

條件更易調(diào)整,只需調(diào)整比較語句中的參數(shù)即可。保證可以用軟件觸發(fā)的條件是要有足夠大的存儲(chǔ)空間,顯示一屏的數(shù)據(jù)為240個(gè),但每次讀進(jìn)單片機(jī)的數(shù)據(jù)為500個(gè),多余260個(gè)數(shù)據(jù)就是作為不滿足觸發(fā)條件的舍棄余量,為了以防萬一,當(dāng)從500個(gè)數(shù)據(jù)中以經(jīng)讀出超過260個(gè)數(shù)據(jù)但還沒有符合觸發(fā)條件的數(shù)據(jù)時(shí),將跳出觸發(fā)比較循環(huán),重新從FIFO存儲(chǔ)器中讀出500個(gè)數(shù)據(jù),因?yàn)镕IFO存儲(chǔ)器為4K容量,最多可以這樣重復(fù)讀取8次數(shù)據(jù),所以軟觸發(fā)可以非常穩(wěn)定的工作。

同步觸發(fā)子程序:

read:

for(i=0;i<500;i++)   // 從FIFO存儲(chǔ)器中讀500 個(gè)數(shù)據(jù)

{

FIFO_R=0;

add[ i]=FIFO_bus;

FIFO_R=1;

}

while(!(add[q]<=m&&add[q+1]>=m))  //滿足幅度為m 且為上升沿則觸發(fā)

{

              q+=1;

if(q>=260)  //若存儲(chǔ)數(shù)據(jù)不足則重新讀數(shù)據(jù)

goto read;

}

程序的意思是只有當(dāng)此時(shí)采樣信號(hào)的數(shù)值是m且為上升沿時(shí)才可以觸發(fā),改變觸發(fā)沿只需改變運(yùn)算符,改變觸發(fā)電壓只需改變m的值即可,m的取值范圍是0~255。

5.3.2 頻率計(jì)算原理及流程圖

本設(shè)計(jì)的頻率計(jì)算采用外部中斷和兩個(gè)定時(shí)器來完成,其中一個(gè)定時(shí)器用來對(duì)脈沖個(gè)數(shù)進(jìn)行計(jì)算,另一個(gè)定時(shí)器用于定時(shí)。其原理是,當(dāng)整形后的脈沖的下降沿帶來時(shí),觸發(fā)外部中斷。在外部中斷響應(yīng)程序里,開啟TIM1并設(shè)置其時(shí)鐘來源為外部輸入;開啟TIM2,設(shè)置為定時(shí)模式。等待TIM1計(jì)數(shù)溢出中斷,然后停止計(jì)時(shí)并讀出定時(shí)器的值。假設(shè)計(jì)數(shù)的脈沖個(gè)數(shù)為N,所用的時(shí)間為T,那么頻率可有式(5.1)計(jì)算得出。

                                              (5.1)

頻率計(jì)算流程圖如圖5.2所示。



圖5.2  頻率計(jì)算流程圖
5.3.3 測(cè)量信號(hào)峰峰值

本示波器就能夠測(cè)量輸入信號(hào)電壓的峰峰值,并顯示在屏幕上。這個(gè)功能由峰峰值測(cè)量子程序完成,見下面的程序段。

在程序開始時(shí)給a中賦值128,即基線電壓值。因?yàn)橐黄聊坏娘@示數(shù)據(jù)為240個(gè),所以用for循環(huán)將if…else…判斷語句執(zhí)行240次,在a中存放最大值,在b中存放最小值。對(duì)每個(gè)數(shù)據(jù)進(jìn)行比較,如果該數(shù)據(jù)比a大則將這個(gè)數(shù)據(jù)存入a;如果小于a,則將這個(gè)數(shù)據(jù)與b進(jìn)行比較,比b大則拋棄,比b小則存入b。故當(dāng)240個(gè)循環(huán)執(zhí)行完后a中存放的是這一屏幕數(shù)據(jù)中的最大值,b中存放的是這一屏幕顯示數(shù)據(jù)中的最小值。在比較完后用a減去b,得到差值存入c中,則c中保存的值就是電壓的峰峰值,調(diào)用電壓計(jì)算顯示子程序根據(jù)當(dāng)前的垂直靈敏度給c乘以不同的倍數(shù),得到實(shí)際的峰峰值。

峰峰值測(cè)量子程序:

a=128;

for(i=0;i<240;i+ +)      //取數(shù)據(jù)中的最大值與最小值

  {

     if(add[ i]>a)

       {

          a=add[ i];

        }

        else if(add[ i]<b)[ size][="" font][="" color][="" p][p="24," null,="" left]顯示平臺(tái)6.1 Android應(yīng)用開發(fā)環(huán)境6.1.1 Android簡(jiǎn)介

  Android是Google于2007年11月5日宣布的基于Linux平臺(tái)的開源手機(jī)操作系統(tǒng)的名稱,該平臺(tái)由操作系統(tǒng)、中間件、用戶界面和應(yīng)用軟件組成,號(hào)稱是首個(gè)為移動(dòng)終端打造的真正開放和完整的移動(dòng)軟件?梢园阉(jiǎn)單理解成Linux上套了一個(gè)JAVA的殼。

6.1.2 開發(fā)所需的軟件包

  1、java JDK 6.0最好下載新版。它可從Sun公司的官網(wǎng)下載。

  2、Android SDK 這是Android開發(fā)必需的。

  3、Eclipse 3.5最好使用這個(gè)版。它可從Eclipse官網(wǎng)下載。

  4、Eclipse所需的插件ADT-0.9.7它可從google網(wǎng)站上下載。

6.1.3 搭建Android開發(fā)環(huán)境

準(zhǔn)備好開以上軟件包之后,我們便可以搭建Android的開發(fā)環(huán)境了。

第一步:安裝java JDK 6.0。

第二步:把下載好的Eclipse 3.5解壓。

第三步:Android SDK 安裝。

Android SDK可以通過SDK下載器自動(dòng)下載和配置,適合網(wǎng)絡(luò)好,下載速度快的情況下;也可以借助工具下載SDK文件,手工配置,適合網(wǎng)絡(luò)不是很好,下載速度慢的情況下。

第四步、Eclipse集成開發(fā)環(huán)境(IDE)搭建

1、打開Eclipse,選擇菜單:Help->Install New Software...

2、彈出“Available Software”對(duì)話框,點(diǎn)擊“Add...”按鈕

3、彈出“Add Repository”對(duì)話框。中Name中輸入ADT,然后點(diǎn)擊Archive把路徑設(shè)置到下載的ADT-0.9.7文件的位置,然后安裝。

4、安裝成功后,安裝提示重啟Eclipse,即完成整個(gè)安裝過程。

第五步:Android SDK 配置,即配制Android 虛擬設(shè)備,亦即嵌入式開發(fā)中常用的模擬器。

6.1.4 測(cè)試所配的開發(fā)環(huán)境
  • 新建項(xiàng)目:打開Eclipse,選擇File > New > Project > Android Project,便會(huì)打開新建項(xiàng)目界面,如圖6.1所示。

在Project name中輸入工程的名字,build target中選擇所用的平臺(tái),Application name為應(yīng)用程序的名稱,create activity為活動(dòng)類的名稱。

圖6.1              新建項(xiàng)目

2、配制運(yùn)行方式:點(diǎn)擊Run Configurations會(huì)出現(xiàn)配制運(yùn)行方式界面,如圖6.2所示。然后點(diǎn)擊Android application新建一個(gè)動(dòng)行方式,在右邊project中輸入要運(yùn)行的工程名稱。至此運(yùn)行方式配制完成。

圖6.2  配制運(yùn)行方式

3、運(yùn)擊會(huì)行,便會(huì)出下如下界面,如圖6.3:

圖6.3              運(yùn)行界面

至此,Android的開發(fā)環(huán)境已搭建成功。

6.2 Android藍(lán)牙通信設(shè)計(jì)

藍(lán)牙是一種支持設(shè)備短距離通信(一般10m內(nèi))的無線電技術(shù)。能在包括移動(dòng)電話、PDA、無線耳機(jī)、筆記本電腦、相關(guān)外設(shè)等眾多設(shè)備之間進(jìn)行無線信息交換。利用“藍(lán)牙”技術(shù),能夠有效地簡(jiǎn)化移動(dòng)通信終端設(shè)備之間的通信,從而數(shù)據(jù)傳輸變得更加迅速高效,為無線通信拓寬道路。

本設(shè)計(jì)分為信號(hào)采集模塊和Android顯示終端,兩部分采用藍(lán)牙技術(shù)進(jìn)行無線通信。Android顯示終端實(shí)現(xiàn)波形的顯示和示波器參數(shù)的設(shè)置。

6.2.1 Android設(shè)備中藍(lán)牙模塊的使用
  • 使用藍(lán)牙的響應(yīng)權(quán)限

[html]view plaincopyprint



  • 配置本機(jī)藍(lán)牙模塊

BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();

//直接打開系統(tǒng)的藍(lán)牙設(shè)置面板

Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);

startActivityForResult(intent, 0x1);

//直接打開藍(lán)牙

adapter.enable();

//打開本機(jī)的藍(lán)牙發(fā)現(xiàn)功能(默認(rèn)打開120秒,可以將時(shí)間最多延長(zhǎng)至300秒)

Intent discoveryIntent = new                                                        

Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);

discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);//設(shè)置持續(xù)時(shí)間(最多300秒)

  • 搜索藍(lán)牙設(shè)備

使用BluetoothAdapter的startDiscovery()方法來搜索藍(lán)牙設(shè)備。

startDiscovery()方法是一個(gè)異步方法,調(diào)用后會(huì)立即返回。該方法會(huì)進(jìn)行對(duì)其他藍(lán)牙設(shè)備的搜索,該過程會(huì)持續(xù)12秒。該方法調(diào)用后,搜索過程實(shí)際上是在一個(gè)System Service中進(jìn)行的,所以可以調(diào)用cancelDiscovery()方法來停止搜索(該方法可以在未執(zhí)行discovery請(qǐng)求時(shí)調(diào)用)。請(qǐng)求Discovery后,系統(tǒng)開始搜索藍(lán)牙設(shè)備,在這個(gè)過程中,系統(tǒng)會(huì)發(fā)送以下三個(gè)廣播:

ACTION_DISCOVERY_START:開始搜索

ACTION_DISCOVERY_FINISHED:搜索結(jié)束

ACTION_FOUND:找到設(shè)備

這個(gè)Intent中包含兩個(gè)extra fields:EXTRA_DEVICE和EXTRA_CLASS,分別包含BluetooDevice和BluetoothClass。我們可以自己注冊(cè)相應(yīng)的BroadcastReceiver來接收響應(yīng)的廣播,以便實(shí)現(xiàn)某些功能。

功能代碼如下:

// 創(chuàng)建一個(gè)接收ACTION_FOUND廣播的BroadcastReceiver

private final BroadcastReceivermReceiver = new BroadcastReceiver() {

public void onReceive(Context context, Intent intent) {

String action = intent.getAction();

// 發(fā)現(xiàn)設(shè)備

if (BluetoothDevice.ACTION_FOUND.equals(action)) {

// 從Intent中獲取設(shè)備對(duì)象

BluetoothDevice device =               intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

// 將設(shè)備名稱和地址放入array adapter,以便在ListView中顯示

mArrayAdapter.add(device.getName() + "" + device.getAddress());

}

}

};

// 注冊(cè)BroadcastReceiver

IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);

registerReceiver(mReceiver, filter); // 不要忘了之后解除綁定

6.2.2 藍(lán)牙數(shù)據(jù)通信

如果打算建議兩個(gè)藍(lán)牙設(shè)備之間的連接,則必須實(shí)現(xiàn)服務(wù)器端與客戶端的機(jī)制。當(dāng)兩個(gè)設(shè)備在同一個(gè)RFCOMM channel下分別擁有一個(gè)連接的BluetoothSocket,這兩個(gè)設(shè)備才可以說是建立了連接。服務(wù)器設(shè)備與客戶端設(shè)備獲取BluetoothSocket的途徑是不同的。服務(wù)器設(shè)備是通過accepted一個(gè)incoming connection來獲取的,而客戶端設(shè)備則是通過打開一個(gè)到服務(wù)器的RFCOMM channel來獲取的。

  • 服務(wù)器端的實(shí)現(xiàn)

通過調(diào)用BluetoothAdapter的listenUsingRfcommWithServiceRecord(String, UUID)方法來獲取BluetoothServerSocket,并調(diào)用BluetoothServerSocket的accept()方法監(jiān)聽連接請(qǐng)求,如果收到請(qǐng)求,則返回一個(gè)BluetoothSocket實(shí)例(此方法為block方法,應(yīng)置于新線程中)。如果不想在accept其他的連接,則調(diào)用BluetoothServerSocket的close()方法釋放資源。

  • 客戶端的實(shí)現(xiàn)

通過搜索可以得到服務(wù)器端的BluetoothService,并通過調(diào)用BluetoothService的listen

UsingRfcommWithServiceRecord(String, UUID)方法獲取BluetoothSocket(該UUID應(yīng)該同于服務(wù)器端的UUID)。調(diào)用BluetoothSocket的connect()方法,如果UUID同服務(wù)器端的UUID匹配,并且連接被服務(wù)器端accept,則connect()方法返回。

3、數(shù)據(jù)通信

可以分別通過BluetoothSocket的getInputStream()和getOutputStream()兩種方法獲取InputStream和OutputStream,并使用read(bytes[])和write(bytes[])方法分別進(jìn)行讀寫操作。其中,read(bytes[])方法會(huì)一直block,直到從數(shù)據(jù)流中讀取到信息;而write(bytes[])方法并不是經(jīng)常的block,比如在另一設(shè)備沒有及時(shí)read或者中間緩沖區(qū)已滿的情況下,write方法會(huì)block。

6.3 Android上繪制波形

利用SurfaceView類來實(shí)現(xiàn)波形的繪制。SurfaceView是視圖(View)的繼承類,這個(gè)視圖里內(nèi)嵌了一個(gè)專門用于繪制的Surface控件?梢酝ㄟ^SurfaceHolder接口訪問這個(gè)surface,getHolder()方法可以得到這個(gè)接口。surfaceview的核心在于提供了兩個(gè)線程:UI線程和渲染線程。SurfaceView的性質(zhì)決定了其比較適合一些場(chǎng)景:需要界面迅速更新、對(duì)幀率要求較高的情況。

6.3.1 SurfaceView的使用

只要繼承SurfaceView類并實(shí)現(xiàn)SurfaceHolder.Callback接口就可以實(shí)現(xiàn)一個(gè)自定義的SurfaceView。SurfaceHolder.Callback在底層的Surface狀態(tài)發(fā)生變化的時(shí)候通知View,SurfaceHolder.Callback具有如下的接口:

1、surfaceCreated(SurfaceHolder holder):當(dāng)Surface第一次創(chuàng)建后會(huì)立即調(diào)用該函數(shù)。程序可以在該函數(shù)中做些和繪制界面相關(guān)的初始化工作,一般情況下都是在另外的線程來繪制界面,所以不要在這個(gè)函數(shù)中繪制Surface。

2、surfaceChanged(SurfaceHolder holder,int format,int width,int height):當(dāng)Surface的狀態(tài)(大小和格式)發(fā)生變化的時(shí)候會(huì)調(diào)用該函數(shù),在surfaceCreated調(diào)用后該函數(shù)至少會(huì)被調(diào)用一次。

3、surfaceDestroyed(SurfaceHolder holder):當(dāng)Surface被摧毀前會(huì)調(diào)用該函數(shù),該函數(shù)被調(diào)用后不能繼續(xù)使用Surface,一般在該函數(shù)中清理使用的資源。通過SurfaceView的getHolder()函數(shù)可以獲取SurfaceHolder對(duì)象,Surface就在SurfaceHolder對(duì)象內(nèi)。雖然Surface保存了當(dāng)前窗口的像素?cái)?shù)據(jù),但是在使用過程中是不直接和Surface打交道的,由SurfaceHolder的CanvaslockCanvas( )或Canvas的lockCanvas(Rect dirty)函數(shù)來獲取Canvas對(duì)象,通過在Canvas上繪制內(nèi)容來修改Surface中的數(shù)據(jù)。當(dāng)在Canvas中繪制完成后,調(diào)用函數(shù)unlockCanvasAndPost(Canvas canvas)來通知系統(tǒng)Surface已經(jīng)繪制完成,這樣系統(tǒng)會(huì)把繪制完的內(nèi)容顯示出來。為了充分利用不同平臺(tái)的資源,發(fā)揮平臺(tái)的最優(yōu)效果,可以通過SurfaceHolder的setType函數(shù)來設(shè)置繪制的類型,可接收如下的參數(shù):

SURFACE_TYPE_NORMAL:用RAM緩存原生數(shù)據(jù)的普通Surface。

SURFACE_TYPE_HARDWARE:適用于DMA(Direct memory access )引擎和硬件加速的Surface。

SURFACE_TYPE_GPU:適用于GPU加速的Surface。

SURFACE_TYPE_PUSH_BUFFERS:表明該Surface不包含原生數(shù)據(jù),Surface用到的數(shù)據(jù)由其他對(duì)象提供,在Camera圖像預(yù)覽中就使用該類型的Surface,有Camera負(fù)責(zé)提供給預(yù)覽Surface數(shù)據(jù),這樣圖像預(yù)覽會(huì)比較流暢。如果設(shè)置這種類型則就不能調(diào)用lockCanvas來獲取Canvas對(duì)象了。

6.3.2 繪制波形子程序

該子程序的功能是,先繪制8*8的顯示網(wǎng)格,然后把接收到的波形數(shù)據(jù)在SurfaceView中顯示出來。功能程序如下:

   void DrawWave(int length) {

   Canvas canvas = sfh.lockCanvas(new Rect(0, 0, 480,480));//獲取畫布

   Canvas.drawColor(Color.BLACK);              //清除畫布

   Paint mPaint = new Paint();                            //獲取畫筆

   mPaint.setColor(Color.GRAY);              //設(shè)置畫筆為黃色

   mPaint.setStrokeWidth(1);                            //設(shè)置畫筆粗細(xì)

   oldY=0;

   //繪制8*8的網(wǎng)格

   for (int i = 0; i <= 8; i++) {// 繪畫橫線

                 canvas.drawLine(0, oldY, 479, oldY, mPaint);

                 oldY = oldY+60;}

   oldX=0;

   for (int i = 0; i <= 8; i++) {// 繪畫縱線

                 canvas.drawLine(oldX, 0, oldX, 479, mPaint);

                 oldX = oldX+60;}

//繪制波形

                   mPaint.setColor(Color.YELLOW);// 畫筆設(shè)置為綠色

                              for (int x = 0; x < length; x++) {

                 y = data_osc[ i];//讀取y軸數(shù)值,波形數(shù)據(jù)保存在數(shù)組ata_osc[]中

                 canvas.drawPoint(x, y, mPaint);//描點(diǎn)

   }

   sfh.unlockCanvasAndPost(canvas);//解鎖畫布,提交畫好的圖像

}


結(jié)  論

經(jīng)過三個(gè)月的努力,終于完成了本畢業(yè)設(shè)計(jì)。總結(jié)這三個(gè)月來的工作,主要有以下幾個(gè)方面:

1、綜述了現(xiàn)階段數(shù)字存儲(chǔ)示波器技術(shù)及產(chǎn)品的國內(nèi)外發(fā)展?fàn)顩r,對(duì)數(shù)字存儲(chǔ)示波器的原理、工作方式、顯示方式等的基本概念及技術(shù)發(fā)展進(jìn)行了介紹。

2、針對(duì)設(shè)計(jì)的任務(wù)和要求,確定了存儲(chǔ)示波器波形采樣和數(shù)據(jù)處理及波形重組的硬件和軟件方案。

3、對(duì)整機(jī)各部分關(guān)鍵電路進(jìn)行相關(guān)理論分析、計(jì)算和設(shè)計(jì)。

4、本系統(tǒng)由單片機(jī)主控,高速A/D轉(zhuǎn)換器ADS830進(jìn)行模數(shù)轉(zhuǎn)換,用FIFO緩存芯片IDT7203來實(shí)現(xiàn)波形的存儲(chǔ)。通過軟件對(duì)轉(zhuǎn)換后的數(shù)字信號(hào)進(jìn)行處理,并通過藍(lán)牙把波形數(shù)據(jù)發(fā)送到Android設(shè)備上進(jìn)行顯示。

5、完成了作品的制作與調(diào)試;論述了儀器的測(cè)試方法,完成數(shù)據(jù)測(cè)試及測(cè)試結(jié)果分析。

采用Android設(shè)備作為顯示平臺(tái),是本設(shè)計(jì)最大的一個(gè)特點(diǎn)。本設(shè)計(jì)的基本思路是,由單片機(jī)對(duì)ADC采樣到的數(shù)據(jù)進(jìn)行處理,再通過藍(lán)牙把波形數(shù)據(jù)發(fā)送到Android設(shè)備上進(jìn)行顯示。同時(shí)由于Android設(shè)備都采用觸摸屏,因此示波器的參數(shù)可以很方便的通過觸摸屏進(jìn)行設(shè)置。本設(shè)計(jì)采用Android設(shè)備取代液晶屏,并使用藍(lán)牙進(jìn)行數(shù)據(jù)傳輸,充分利用了Android設(shè)備的硬件資源。其優(yōu)點(diǎn)是降低了系統(tǒng)開發(fā)成本,并大大減小了系統(tǒng)硬件體積,完全實(shí)現(xiàn)了本設(shè)計(jì)小巧便攜的設(shè)計(jì)宗旨。

本系統(tǒng)的數(shù)據(jù)采集系統(tǒng)、數(shù)據(jù)處理系統(tǒng)和波形顯示系統(tǒng)等模塊都經(jīng)過了軟硬件的調(diào)試。雖然整個(gè)系統(tǒng)的實(shí)現(xiàn)方案基本完成,但是還有一些不夠理想的地方,仍然有不少的工作需要繼續(xù)。比如需要進(jìn)一步改善測(cè)量精度、模擬帶寬以及系統(tǒng)噪聲等性能;添加等效采樣、波形回調(diào)以及數(shù)據(jù)導(dǎo)出等功能。


參  考  文  獻(xiàn)

[1]  張永瑞. 電子測(cè)量技術(shù)基礎(chǔ)[M] . 西安:西安電子科技大學(xué)出版社,2006:131-133.

[2]  朱明強(qiáng). 基于單片機(jī)及CPLD的數(shù)字存儲(chǔ)示波器的研究與設(shè)計(jì)[D] . 北京:北京交通大學(xué),2008.

[3]  王彥斌. 數(shù)字存儲(chǔ)示波器中模擬通道設(shè)計(jì)[D] . 成都:電子科技大學(xué),2008.

[4]  馮靜亞,于強(qiáng),呂朝暉,羅福山. 虛擬示波器的軟件設(shè)計(jì)與應(yīng)用[J] . 計(jì)算機(jī)工程與設(shè)計(jì),2007,28(1):211-273.

[5]  張虹. 泰克公司推出可分析帶寬達(dá)20GHz信號(hào)的Signal Vu軟件[J] . 中國無線電,2008,9(7):23-25.

[6]  趙茂泰. 簡(jiǎn)易數(shù)字存儲(chǔ)示波器評(píng)述[J] . 電子世界,2002,5(11):40-42.

[7]  徐俊毅. 力科推出帶寬可達(dá)30GHz的WaveMaster8Zi系列示波器[J] . 電子與電腦,2009,5(13):53-56.

[8]  蒙玉寶. 40Gsps隨機(jī)取樣數(shù)字示波器關(guān)鍵技術(shù)預(yù)先研究[D] . 成都:電子科技大學(xué),2003.

[9]  楊豐盛. Android應(yīng)用開發(fā)揭秘[M] . 北京:機(jī)械工業(yè)出版社,2009:15-16.

[10]  陳景波,楊放,姚定江. 基于CompuScope 82G型高速數(shù)據(jù)采集卡的虛擬示波器設(shè)計(jì)[J] . 國外電子元器件,2006,11(2):60-62.

[11]  H.Troy Nagle,D.Carroll,J.David Irwin . DIGITAL LOGIC CIRCUIT ANALYSIS & DESIGN[M] . 北京:清華大學(xué)出版,2009:57-71.

[12] V.V.Panasyuk. Electronic oscillograph unit for recording failure diagrams in the impact testing of metals[J] . Soviet Materials Science,2001,9(5):10-12.

[13] 劉楊斌,劉其峰,華慧. 基于AT89S52單片機(jī)的簡(jiǎn)易數(shù)字示波器設(shè)計(jì)[J] . 現(xiàn)代電子技術(shù),2011,14(14):17-18.

[14] 賈春霞,張洪艷. 數(shù)字存儲(chǔ)示波器現(xiàn)狀初探[J] . 儀器儀表用戶,2004,8(15):25-26.

[15] 張根柱,陳勇鋼. 數(shù)字存儲(chǔ)示波器[J] . 現(xiàn)代技術(shù)開發(fā),1999,5(12):49-50.

[16]  J. Molenaar,R. Voorhorst. Study on Remote Control Techniques to the Digital Storage Oscilloscope[J] . Energy Procedia,2012,16(9):34-35.

[17] 劉巖. 數(shù)字示波器的設(shè)計(jì)[J] . 電腦知識(shí)與技術(shù),2008,12(20):21-22.

[18] R. P. Patterson. Design and Implementation of Multifunctional Virtual Oscilloscope Using USB Data-Acquisition Card[J] . Procedia Engineering,2012,10(25):40-42.

[19] W. A. Grind. Patent Application Titled "Oscilloscope with Internally Generated Mixed Signal Oscilloscope Demo Mode Stimulus, and Integrated Demonstration" Under Review[J] . Journal of Engineering,2012,9(17):7-8.


致  謝

在這里要衷心感謝我的指導(dǎo)老師蘇成悅教授的悉心指導(dǎo)和多方關(guān)懷。蘇老師思維敏銳,視野開闊,創(chuàng)新性強(qiáng)。他淵博的學(xué)識(shí),嚴(yán)謹(jǐn)?shù)闹螌W(xué)作風(fēng),執(zhí)著的敬業(yè)精神都深深地影響著我。我深深感受到他對(duì)研究的精益求精,對(duì)學(xué)生的鼓勵(lì)和愛護(hù)。他對(duì)工作和生活的態(tài)度將是我一生學(xué)習(xí)的榜樣。

此外,還需要感謝我身邊的同學(xué)們。在設(shè)計(jì)過程中碰到的問題,我都會(huì)找同學(xué)一起來討論解決。同學(xué)們都很熱情、很積極的參與到討論中,而且大部分問題在討論之后都得到了解決。除了學(xué)習(xí)之外,在生活上同學(xué)們對(duì)我的幫助也是非常大的。在此,我衷心感謝各位親愛的同學(xué)們。


附錄 A  實(shí)物圖

圖A1  信號(hào)采集模塊

圖A2  系統(tǒng)測(cè)試圖


附錄 B  系統(tǒng)主程序設(shè)計(jì)源碼

#include "STM32Lib\stm32f10x.h"

#include "hal.h"

extern void SetLevel(u8 pulse);

extern void Adc1_Init(u8 ADC_CH_x,u8 ADC_CH_SMP);

extern u16 Get_Adc(u8 ADC_CH_x);

u16 data_test_16;

u8 data_test_8;

u8 Data_osc[320];              //波形數(shù)據(jù)

u8 Data_osc_full=0;

u8 Data_set[10];

//延遲函數(shù)

void Delay(u16 speed)

{

              u16 i;

              while(speed!=0)

              {

                            speed--;

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

              }

}

//設(shè)置水平掃描速度

void shuiping(u8 sp)

{

              if(sp >= 12)

                            sp=12;

              if(sp <= 1)

                            sp=1;

              //設(shè)置不同采樣速率

              switch(sp)

              {

                            case 1:TIM1->PSC=0; break;

                            case 2:TIM1->PSC=1; break;

                            case 3:TIM1->PSC=3; break;

                            case 4:TIM1->PSC=9; break;

                            case 5:TIM1->PSC=19; break;

                            case 6:TIM1->PSC=39; break;

                            case 7:TIM1->PSC=99; break;

                            case 8:TIM1->PSC=199; break;

                            case 9:TIM1->PSC=399; break;

                            case 10:TIM1->PSC=999; break;

                            case 11:TIM1->PSC=1999; break;

                            case 12:TIM1->PSC=3999; break;            

                            default :break;                           

              }

}

//設(shè)置水平靈敏度

void SetAGC(u16 pulse)

{

              if(pulse >= 3)

                            pulse=3;

              if(pulse <= 1)

                            pulse=1;

              //設(shè)置不同的增益

              switch(pulse)

              {

                case 1: TIM4->CCR1=255;break;

                case 2: TIM4->CCR1=195;break;

                case 3: TIM4->CCR1=153;break;

              }

}

int main(void)

{

              u16 i_osc=0;

              u16 i_start=0;

              ChipHalInit();                            //片內(nèi)硬件初始化

              ChipOutHalInit();              //片外硬件初始化                                                                                                                  

              SetLevel(128);                //初始化垂直基線

              SetAGC(2);                                          //初始化垂直靈敏度

              shuiping(6);                  //初始化水平靈敏度            

              while(1)

              {

                            if(Data_osc_full==1)

                            {

                                          Data_osc_full=0;

                                          while(!(Data_osc[i_start]<=160&& Data_osc[i_start+1]>=160))

                                          {

                                                        i_start++;

                                                        if(i_start>=150)

                                                                      break;            

                                          }

            if(i_start < 150)

                                          {

                                                        for( i_osc=0; i_osc<160; i_osc++)

                                                        {

                                                                      USART2_Putc(Data_osc[i_osc + i_start]);

                                                        }

                                          }

                                          Delay(500);              //延時(shí),等待Android系統(tǒng)處理完畢數(shù)據(jù)

                                TIM1->CR1 |= 0x0001;              //開啟定時(shí)器TIM1            

                            }

              }

}


附錄 C  Android藍(lán)牙服務(wù)程序設(shè)計(jì)源碼

package com.test.BTClient;

import android.app.Activity;

import android.bluetooth.BluetoothAdapter;

import android.bluetooth.BluetoothDevice;

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.content.IntentFilter;

import android.os.Bundle;

import android.util.Log;

import android.view.View;

import android.view.Window;

import android.view.View.OnClickListener;

import android.widget.AdapterView;

import android.widget.ArrayAdapter;

import android.widget.Button;

import android.widget.ListView;

import android.widget.TextView;

import android.widget.AdapterView.OnItemClickListener;

public class DeviceListActivity extends Activity {

    // 調(diào)試用

    private static final String TAG = "DeviceListActivity";

    private static final boolean D = true;

    // 返回時(shí)數(shù)據(jù)標(biāo)簽

    public static String EXTRA_DEVICE_ADDRESS = "設(shè)備地址";

    // 成員域

    private BluetoothAdapter mBtAdapter;

    private ArrayAdapter mPairedDevicesArrayAdapter;

    private ArrayAdapter mNewDevicesArrayAdapter;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        // 創(chuàng)建并顯示窗口,并設(shè)置窗口顯示模式為窗口方式

        requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);

        setContentView(R.layout.device_list);

        // 設(shè)定默認(rèn)返回值為取消

        setResult(Activity.RESULT_CANCELED);

        // 設(shè)定掃描按鍵響應(yīng)

        Button scanButton = (Button) findViewById(R.id.button_scan);

        scanButton.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {

                doDiscovery();

                v.setVisibility(View.GONE);

            }

        });

        // 初使化設(shè)備存儲(chǔ)數(shù)組

        mPairedDevicesArrayAdapter = new ArrayAdapter(this,

R.layout.device_name);

        mNewDevicesArrayAdapter = new ArrayAdapter(this,

R.layout.device_name);

        // 設(shè)置已配隊(duì)設(shè)備列表

        ListView pairedListView = (ListView) findViewById(R.id.paired_devices);

        pairedListView.setAdapter(mPairedDevicesArrayAdapter);

        pairedListView.setOnItemClickListener(mDeviceClickListener);

        // 設(shè)置新查找設(shè)備列表

        ListView newDevicesListView = (ListView) findViewById(R.id.new_devices);

        newDevicesListView.setAdapter(mNewDevicesArrayAdapter);

        newDevicesListView.setOnItemClickListener(mDeviceClickListener);

        // 注冊(cè)接收查找到設(shè)備action接收器

        IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);

        this.registerReceiver(mReceiver, filter);

        // 注冊(cè)查找結(jié)束action接收器

        filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);

        this.registerReceiver(mReceiver, filter);

        // 得到本地藍(lán)牙句柄

        mBtAdapter = BluetoothAdapter.getDefaultAdapter();

    }

    @Override

    protected void onDestroy() {

        super.onDestroy();

        // 關(guān)閉服務(wù)查找

        if (mBtAdapter != null) {

            mBtAdapter.cancelDiscovery();

        }

        // 注銷action接收器

        this.unregisterReceiver(mReceiver);

    }

    public void OnCancel(View v){

                  finish();

    }

    //開始服務(wù)和設(shè)備查找

    private void doDiscovery() {

        if (D) Log.d(TAG, "doDiscovery()");

        // 在窗口顯示查找中信息

        setProgressBarIndeterminateVisibility(true);

        setTitle("查找設(shè)備中...");

        // 顯示其它設(shè)備(未配對(duì)設(shè)備)列表

        findViewById(R.id.title_new_devices).setVisibility(View.VISIBLE);

        // 關(guān)閉再進(jìn)行的服務(wù)查找

        if (mBtAdapter.isDiscovering()) {

            mBtAdapter.cancelDiscovery();

        }

        //并重新開始

        mBtAdapter.startDiscovery();

    }

    // 選擇設(shè)備響應(yīng)函數(shù)

    private OnItemClickListener mDeviceClickListener = new OnItemClickListener() {

        public void onItemClick(AdapterView av, View v, int arg2, long arg3) {

            // 準(zhǔn)備連接設(shè)備,關(guān)閉服務(wù)查找

            mBtAdapter.cancelDiscovery();

            // 得到mac地址

            String info = ((TextView) v).getText().toString();

            String address = info.substring(info.length() - 17);

            // 設(shè)置返回?cái)?shù)據(jù)

            Intent intent = new Intent();

            intent.putExtra(EXTRA_DEVICE_ADDRESS, address);

            // 設(shè)置返回值并結(jié)束程序

            setResult(Activity.RESULT_OK, intent);

            finish();

        }

    };

    // 查找到設(shè)備和搜索完成action監(jiān)聽器

    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {

        @Override

        public void onReceive(Context context, Intent intent) {

            String action = intent.getAction();

            // 查找到設(shè)備action

            if (BluetoothDevice.ACTION_FOUND.equals(action)) {

                // 得到藍(lán)牙設(shè)備

                BluetoothDevice device =

  intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

                // 如果是已配對(duì)的則略過,其余的在添加到列表中進(jìn)行顯示

                if (device.getBondState() != BluetoothDevice.BOND_BONDED) {

                    mNewDevicesArrayAdapter.add(device.getName() + "" +

device.getAddress());

                }else{  //添加到已配對(duì)設(shè)備列表

                mPairedDevicesArrayAdapter.add(device.getName() + "" +

device.getAddress());

                }

            // 搜索完成action

            } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {

                setProgressBarIndeterminateVisibility(false);

                setTitle("選擇要連接的設(shè)備");

                if (mNewDevicesArrayAdapter.getCount() == 0) {

                    String noDevices = "沒有找到新設(shè)備";

                    mNewDevicesArrayAdapter.add(noDevices);

                }

            }

        }

    };


}

評(píng)分

參與人數(shù) 4黑幣 +11 收起 理由
lxj199610 + 6 很給力!
ljldx + 3 分析得很到位,受教了,硬件部分可參考魏源.
541199109 + 1 贊一個(gè)!
打卡機(jī)的 + 1 很給力!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏29 分享淘帖 頂3 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:113875 發(fā)表于 2016-4-13 09:10 | 只看該作者
學(xué)習(xí)了~~~~~~~~~~
回復(fù)

使用道具 舉報(bào)

板凳
ID:114085 發(fā)表于 2016-4-14 23:05 | 只看該作者
非常感謝!我先下載學(xué)習(xí)下!
回復(fù)

使用道具 舉報(bào)

地板
ID:123117 發(fā)表于 2016-5-25 15:08 | 只看該作者
好東西啊,很值得學(xué)習(xí)!
回復(fù)

使用道具 舉報(bào)

5#
ID:123154 發(fā)表于 2016-5-25 16:43 | 只看該作者
受教了 很不錯(cuò) 就是沒錢下載
回復(fù)

使用道具 舉報(bào)

6#
ID:117823 發(fā)表于 2016-6-4 01:54 來自手機(jī) | 只看該作者
這個(gè)很有用
回復(fù)

使用道具 舉報(bào)

7#
ID:129333 發(fā)表于 2016-11-11 21:23 | 只看該作者
很不錯(cuò),樓主,謝謝了
回復(fù)

使用道具 舉報(bào)

8#
ID:171328 發(fā)表于 2017-3-16 20:11 | 只看該作者
學(xué)習(xí)了,剛好可以借用,51黑有你更精彩
回復(fù)

使用道具 舉報(bào)

9#
ID:204243 發(fā)表于 2017-5-24 12:18 來自手機(jī) | 只看該作者
感謝樓主
回復(fù)

使用道具 舉報(bào)

10#
ID:135643 發(fā)表于 2017-5-25 19:06 | 只看該作者
這個(gè)確實(shí)比較實(shí)用
回復(fù)

使用道具 舉報(bào)

11#
ID:75267 發(fā)表于 2017-6-27 11:59 | 只看該作者
感謝分享 這個(gè)厲害了
回復(fù)

使用道具 舉報(bào)

12#
ID:233712 發(fā)表于 2017-9-17 20:36 | 只看該作者

這個(gè)確實(shí)比較實(shí)用
回復(fù)

使用道具 舉報(bào)

13#
ID:237354 發(fā)表于 2018-2-27 23:41 | 只看該作者
很好的資料
回復(fù)

使用道具 舉報(bào)

14#
ID:142638 發(fā)表于 2018-4-12 15:03 | 只看該作者
感謝樓主
回復(fù)

使用道具 舉報(bào)

15#
ID:341542 發(fā)表于 2018-5-30 17:16 | 只看該作者
不錯(cuò) ,學(xué)習(xí)~
回復(fù)

使用道具 舉報(bào)

16#
ID:368366 發(fā)表于 2018-7-11 11:43 | 只看該作者
白高興一場(chǎng),哎,android不是源碼,根本沒法實(shí)現(xiàn)功能,是不是樓主傳錯(cuò)了求源碼,求源碼
回復(fù)

使用道具 舉報(bào)

17#
ID:125889 發(fā)表于 2018-8-28 21:14 | 只看該作者
謝謝作者開源分享,我下載下來學(xué)習(xí)一下
回復(fù)

使用道具 舉報(bào)

18#
ID:125889 發(fā)表于 2018-8-29 07:32 | 只看該作者
樓主這個(gè)的線路板是怎么弄的?用洞洞板可以嗎?
回復(fù)

使用道具 舉報(bào)

19#
ID:74977 發(fā)表于 2018-12-13 15:50 | 只看該作者
哇,樓主厲害了,我也來學(xué)習(xí)學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

20#
ID:521014 發(fā)表于 2019-6-3 18:29 | 只看該作者
樓主厲害了,學(xué)習(xí)學(xué)習(xí)學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

21#
ID:405966 發(fā)表于 2019-6-23 23:13 來自手機(jī) | 只看該作者
幾個(gè)主要的元件有點(diǎn)小貴
回復(fù)

使用道具 舉報(bào)

22#
ID:405966 發(fā)表于 2019-6-27 06:28 來自手機(jī) | 只看該作者
不錯(cuò)的東西,可惜木有幣
回復(fù)

使用道具 舉報(bào)

23#
ID:576975 發(fā)表于 2019-7-3 13:07 | 只看該作者
不錯(cuò)的東西
回復(fù)

使用道具 舉報(bào)

24#
ID:452731 發(fā)表于 2019-7-11 12:07 | 只看該作者
只來學(xué)習(xí),支持樓主
回復(fù)

使用道具 舉報(bào)

25#
ID:696797 發(fā)表于 2020-2-23 09:17 | 只看該作者
很棒  很有用
回復(fù)

使用道具 舉報(bào)

26#
ID:253767 發(fā)表于 2020-4-22 06:51 | 只看該作者
謝謝分享!!!
回復(fù)

使用道具 舉報(bào)

27#
ID:1043982 發(fā)表于 2022-9-14 08:11 | 只看該作者
樓主做的真好,學(xué)習(xí)了,對(duì)我?guī)椭艽?/td>
回復(fù)

使用道具 舉報(bào)

28#
ID:909377 發(fā)表于 2022-10-8 20:33 | 只看該作者
可進(jìn)行瞬態(tài)分析?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表