久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 34598|回復: 28
收起左側

基于Android顯示的便攜式數字示波器 畢業設計(論文)

  [復制鏈接]
ID:113472 發表于 2016-4-11 19:48 | 顯示全部樓層 |閱讀模式

本設計是基于stm32單片機制作的,實物圖片如下:

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

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

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

以下是論文預覽:

本科畢業設計論文)

基于Android顯示的便攜式數字示波器
        學    院      物理與光電工程學院      
        專    業        電子科學與技術         
        年級班別2009級(5)班         
        學    號
        學生姓名
        指導教師
摘要

數字示波器作為一種測量儀器,因其具有體積小、可長期貯存波形并具有波形分析處理能力等優點,使得它日益普及。由于目前國外在數字技術方面比國內發達很多,數字存儲示波器的大部分市場被國外企業占有。而國內的數字存儲示波器的研制處于起步階段,因此迫切需要加快相關技術的發展。

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

采用Android設備作為顯示平臺,是本設計最大的一個特點。本設計的基本思路是,由單片機對ADC采樣到的數據進行處理,再通過藍牙把波形數據發送到Android設備上進行顯示。同時由于Android設備都采用觸摸屏,因此示波器的參數可以很方便的通過觸摸屏進行設置。本設計采用Android設備取代液晶屏,并使用藍牙進行數據傳輸,充分利用了Android設備的硬件資源。其優點是降低了系統開發成本,并大大減小了系統硬件體積,完全實現了本設計小巧便攜的設計宗旨。

關鍵詞:數字示波器,STM32,安卓,藍牙

1 緒論

1.1 示波器概述

1.2 數字示波器的特點及原理

1.3 數字示波器國內外研究狀況

1.4 Android概述

1.5 題目研究背景及意義

2 數字示波器原理分析與技術指標

2.1 數字示波器的組成原理

2.2 數字示波器與模擬示波器相比較

2.3 數字示波器技術指標

2.3.1 最大采樣速率

2.3.2 存儲寬度

2.3.3 分辨率

2.3.4 記錄長度

2.3.5 存儲帶寬

2.3.6 垂直靈敏度及誤差

2.3.7 掃描速度及誤差

2.4 采樣原理分析

2.4.1 實時采樣方式的原理

2.4.2 等效取樣方式的原理

3 系統方案論證

3.1 系統總體方案設計

3.2 數據采集系統

3.2.1 波形整形電路方案選擇

3.2.2 程控放大電路方案選擇

3.3 數據處理系統

3.3.1 觸發方案選擇

3.3.2 峰值測量方案選擇

3.3.3 測量頻率方案選擇

3.3.4 采樣方案選擇

4 系統硬件電路設計

4.1 微控制器電路

4.2 電源電路設計

4.3 信號采集電路設計

4.3.1 A/D轉換及FIFO緩存器

4.3.2 程控放大電路

4.3.3 電平移位電路設計

4.3.4 頻率測量電路

4.4 無線數據傳輸

5 系統軟件設計

5.1 單片機軟件開發環境

5.2 主程序設計及流程圖

5.3 數據處理子程序

5.3.1 同步觸發的軟件實現

5.3.2 頻率計算原理及流程圖

5.3.3 測量信號峰峰值

6 Android顯示平臺

6.1 Android應用開發環境

6.1.1 Android簡介

6.1.2 開發所需的軟件包

6.1.3 搭建Android開發環境

6.1.4 測試所配的開發環境

6.2 Android藍牙通信設計

6.2.1 Android設備中藍牙模塊的使用

6.2.2 藍牙數據通信

6.3 Android上繪制波形

6.3.1 SurfaceView的使用

6.3.2 繪制波形子程序

結論

參考文獻

致謝

附錄 A  實物圖

附錄 B  系統主程序設計源碼

附錄 C  Android藍牙服務程序設計源碼




1 緒論1.1 示波器概述

示波器作為一種精密的測量儀器,廣泛地應用在科研、教育、農業生產、軍事等各個領域。示波器是一種用短暫掃描的方式記錄并顯示一個瞬間信號的測量儀器,可以直觀地表示二維變量之間的瞬態或穩態函數關系、邏輯關系,以及實現對部分物理量的存儲和變換[1]。

隨著上個世紀七十年代雷達、電視和航空等領域的發展,研制對于電信號能夠實現檢測和跟蹤的設備已成為急需,示波器在這個時期應運而生。帶寬為100MHz的同步示波器研制成功,成為近代示波器的基礎[2]。1972年美國尼科萊特公司利用模數轉換器件,成功研制出世界上首臺數字存儲示波器,為信號數字化、數據的存儲、信號處理和參數跟蹤開辟了一條新的途徑。

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

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

1.2 數字示波器的特點及原理

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

與模擬示波器比較,數字示波器具有很多方面的有點,包括:

1、數字信號處理:數字示波器都使用了微處理器,所以它能對所采集到的數據進行幅度和時間等基本運算,高級的還能完成更復雜的數學運算,如平均值、極值、積分、微分、數字濾波、倒數等。

2、單次多通道信號捕獲:數字示波器一般擁有多個通道,能夠同時捕獲多個單次瞬態信號(比如像電源開、關或故障發生等事件)。

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

4、數據存儲:數字示波器可把波形數據保存在存儲器上,可在任意需要的時候調出波形數據進行顯示。數字示波器也很容易實現與打印機和繪圖儀進行連接,把波形以圖片的格式輸出。

數字示波器的重點是將連續的模擬信號轉化成離散的數字信號,也就是從連續的模擬信號上以一定的時間間隔離散地采用。采樣有實時采樣和等效采樣兩種方式。數字示波器可按取樣方式分為隨機采樣數字示波器、實時采樣數字示波器、順序采樣數字示波器三種。這三種各自有各自的優點和缺點,等效采樣可以做到用比較低速的ADC轉換器對高頻信號進行觀察。

1.3 數字示波器國內外研究狀況

國際數字存儲示波器的領域,最主要的生產廠商是泰克公司、力科公司和安捷倫公司。泰克公司創始人在1946年發明了世界上第一臺觸發式示波器,始于這個突破性的技術創新,如今的泰克已經崛起成為全球最大的測試、測量和監測設備供應商之一。現在,泰克公司在全球19個國家都設有辦事機構,2006年銷售收入超過11億美元。該公司早在2000年就推出了模擬帶寬為4GHz帶寬的示波器,以后陸續在2002年和2004年推出了模擬帶寬分別為6GHz和8GHz的示波器。目前,泰克的最先進的數字示波器的模擬帶寬已經高達80GHz[6]。

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

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

1.4 Android概述

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

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

1.5 題目研究背景及意義

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

傳統的模擬示波器存在諸多弊端:第一,模擬示波器升級困難;第二,模擬示波器的造價高;第三,模擬示波器的精度低;第四,模擬示波器操作復雜;第五,模擬示波器處理的是模擬信號,模擬信號處理起來很困難。基于以上的考慮,數字示波器的開發是非常必要的。


2 數字示波器原理分析與技術指標

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

2.1 數字示波器的組成原理

數字示波器是上世紀70年代初發展起來的新型示波器。該類型的示波器能夠實現長期存儲模擬信號,并能能夠運用相應的編程語言編寫相應的算法對存儲的數據進行處理,如對被測信號的波形、頻率、相位、功率譜和幅度等參數進行精確的測量。數字示波器的出現,是示波器技術發展的一個里程碑,其成功的實現了傳統模擬示波器所無法完成的功能,為現代測量技術的發展提供了強大的動力[10]。

數字示波器典型原理框圖如圖2.1所示。

1.006.jpg

圖2.1              數字示波器典型原理框圖

2.2 數字示波器與模擬示波器相比較

1、數字示波器的一大特點是能夠無閃爍地觀察出很低頻率的被測信號,這是模擬示波器無法勝任的。對于很高頻率的被測信號,模擬示波器首先要有很高的帶寬,同時還要有陰極射線示波管,這些將大大提高模擬示波器的造價,而且模擬示波器的穩定性與顯示精度也將大打折扣。而在數字示波器上,由于可以用一個固定的刷新顯示速度對存儲數據進行顯示,而且波形數據可以在液晶屏幕上顯示,這樣將大幅降低示波器的造價和讀出顯示所要求的帶寬。并且在觀察低頻信號時,不至于因為過快的顯示而丟失波形的細節信息[11]。

2、數字示波器能做到很深的存儲深度,即允許存儲很長時間內捕捉到的信號。在對單次瞬變信號的分析和處理方面,數字示波器的這一大優點將大有作為。在實際應用中常常會碰到很多瞬變的信號,比如放電現象、單次沖擊波等都是在短暫的一瞬間產生的。用模擬示波器觀察這些瞬變信號時,波形將在屏幕上一閃而過,根本來不及觀察,很多的波形細節都會被忽略[12]。在數字示波器出現之前的年代,當時的工程師設計了“屏幕照相”,來解決模擬示波器在觀察瞬變信號時的缺陷。

3、具有多樣的觸發功能。數字示波器不僅能檢測并顯示觸發后的信號,而且還能檢測并顯示觸發前的信號,并且顯示波形的超前或滯后時間可以任意選擇。在材料強度、地震研究、生物機能等方面的實驗研究上,數字示波器是一個非常有利的工具。通過不同的器件或算法,數字示波器可以實現不同的觸發方式,使得在對電信號進行跟蹤和分析時變得更加的方便和準確。

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

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

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

2.3 數字示波器技術指標2.3.1 最大采樣速率

定義:單位時間內所完成的對模擬輸入信號的采樣次數就叫做最大A/D采樣速率,單位為Sa/S(次/秒)。最大采樣速率主要取決于A/D轉換器的最高轉換速率,同時也受處理器處理速度的限制。最大采樣速率代表數字示波器在時間軸上對信號的捕獲能力,其采樣率越大,在時間軸上對高速單次信號的捕獲能力就越強。

數字示波器實際所使用的采樣速率與所設定的示波器水平掃描時間之間具有一定的關系,即示波器需要顯示的點數和水平掃描時間因子將一起決定示波器實際所使用的采樣速率,其計算公式可表示為

1.007.jpg                                                                                                (2.1)

式(2.1)中,N表示顯示屏每格顯示的點數;t/div表示示波器水平掃描時間因子,也就是示波器掃描顯示一格所需的時間[14]。比如選示波器的水平掃描時間為10ms/div,每格包含100個采樣點,那么可以計算得知此時示波器的采樣率為10KHz。因為示波器水平顯示的點數是固定的,那么示波器的水平掃描速度將和采樣速率具有一一對應的關系,也就是說示波器最快的掃描速度是由其最大采樣速率決定的。如果某示波器的最大采樣速率為100MHz,那么其最快的掃描速度為1uS/div。

2.3.2 存儲寬度

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

2.3.3 分辨率

分辨率是指能夠分辨出的被測信號波形的最小幅值,其指示的是信號波形細節的綜合指標,包括水平分辨率和垂直分辨率。

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

水平分辨率又稱時間間隔分辨率,通常以數字示波器在進行波形采樣時所能分辨的最小時間間隔值來表示。如果沒有加入內插,當數字示波器的采樣速率為 1.008.jpg 時,則定義數字示波器的水平分辨率為 1.009.jpg ;如果加入內插算法,并且內插器的增益為N,則定義數字示波器的水平分辨率為 1.010.jpg 。如果某數字示波器的記錄長度為1KB,顯示屏橫向坐標為十格,則該示波器水平分辨率約為100點/div。

分辨率與測量準確度緊密相關,但分辨率并非就是測量準確度,而是理想情況下測量準確度的上線。

2.3.4 記錄長度

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

2.3.5 存儲帶寬

存儲帶寬定義為示波器輸入不同頻率的等幅正弦波信號時,顯示屏上顯示的信號幅度下降3dB時所對應的輸入信號的上、下限頻率之差,也稱為示波器的頻帶寬度,單位為MHz或GHz[16]。

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

2.3.6 垂直靈敏度及誤差

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

1.011.jpg                                                             (2.2)

式(2.2)中,e為垂直靈敏度誤差,V1為測量讀數值(V),V2為校準信號每格電壓值(V),D為校準信號格數(div)。

2.3.7 掃描速度及誤差

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

1.012.jpg                                                                              (2.3)

掃描速度誤差是指示波器測量時間間隔的準確度。一般用具有標準周期時間的脈沖信號作為校驗信號,其計算公式如下式

1.013.jpg                                                   (2.4)

式(2.4)中,e為掃描誤差;Δt為校準信號周期時間測量讀數值;T0為校準信號周期時間值。

2.4 采樣原理分析2.4.1 實時采樣方式的原理

實時取樣指的是利用等時間間隔取樣脈沖對被測信號進行取樣,按照取樣時鐘的先后順序將A/D采樣的數據存在存儲器中的過程。取樣就是對連續的信號波形進行量化的過程,如圖2.2所示。其方法可用圖2.3說明。

1.014.jpg

圖2.2   取樣示意圖

圖片請下載附件中有完整版

圖2.3   取樣方框圖

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

2.4.2 等效取樣方式的原理

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

1.024.jpg

圖2.4              等效取樣方式采集系統框圖


3 系統方案論證
3.1 系統總體方案設計

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

本文的設計理念是便攜式、低成本,因此需要尋找一款性能高、價格低的微處理器。考慮到成本和實際應用,本文選擇了意法半導體公司的STM32微處理器作為主控制器。STM32系列是基于專為要求高性能、低成本、低功耗的嵌入式應用專門設計的ARM Cortex-M3內核,能完全滿足本設計對成本和性能的要求。

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

數字示波器的結構框圖如圖3.1所示。

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

圖片請下載附件有完整版

圖3.1  結構框圖

模擬信號處理是示波器的重要組成部分,也是信號采集系統中的一個核心部分。圖3.1清晰的介紹了數字示波器的結構框圖,從圖中可以看出,模擬通道的輸入信號被分成兩路,一路送至程控放大器,用來實現垂直靈敏度的調節;另一路送至觸發電路,用于測量被測信號的頻率。其中程控放大器是示波器模擬部分設計的關鍵,也是示波器帶寬最重要的限制因素。

3.2 數據采集系統3.2.1 波形整形電路方案選擇

波形整形電路的選擇主要是選擇合適的比較器芯片,為了防止波形在過零點出現抖動,比較電路最好是接成滯回比較結構,以免影響比較器的輸出波形。

方案一:采用Maxim公司的高速比較芯片Max912構成滯回比較器。Max912的最高轉換速度可達ns級別,對頻率很高的信號都能進行有效的整形。但缺點是Max912的成本太高。

方案二:采用比較器LM311構成滯回比較器。在對5M以下的信號進行整形時,能收到比較好的效果。最主要的還是其價格相對比較低,能滿足本設計對成本的控制。但當信號頻率高于5M時,由于收到LM311轉換速度的限制,其整形效果比較差。

基于本設計對測試范圍的要求以及成本的控制,本設計選擇方案二。

3.2.2 程控放大電路方案選擇

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

方案一:利用高速運放LM6172構成放大電路,并設置多種不同放大倍數的反饋電阻網絡,然后通過控制繼電器選擇不同的反饋電阻,從而實現不同放大倍數的切換。其優點是電路和控制都比較簡單,放大倍數穩定。但缺點是繼電器的工作電流大,且需要多個繼電器配合才能實現多種不同的放大倍數,很明顯不符合本設計便攜小巧的宗旨。同時繼電器在開和關的瞬間都會產生很大的電磁干擾,有可能會影響到系統的正常運行。

方案二:使用模擬開關HCF4051BE代替繼電器,來實現不同放大倍數的切換。優點是克服了繼電器工作電流大、體積大等缺點,且電路結構簡單,成本低廉。但缺點是模擬開關無法實現零阻抗,且其帶寬有限,通過高頻信號將會產生失真。

方案三:使用專用PGA芯片AD603,可以通過MCU來控制AD603的基準,進而實現不同放大倍數的調節。該電路優點是控制比較簡單,且增益調節范圍大,外圍電路簡單。缺點是成本稍微偏高。

基于本設計便攜小巧的宗旨,和電路復雜度的考慮,本設計選擇方案三。

3.3 數據處理系統3.3.1 觸發方案選擇

為了波形能在示波器顯示屏上穩定顯示,必須要到用觸發系統,以保證被測信號與掃描信號始終保持同步。也即是每次掃描的起始點,都是信號波形一個周期內固定的一個點。

方案一:采用高速比較器構成觸發電路。這種方法對于比較器的轉換速率要求很高,在帶寬很高的示波器上,一般的比較器難于滿足要求。并且采用高速比較器,將會增加系統的制作成本。此外,硬件觸發電路如果設計的不好,比較器的輸出容易產生抖動毛刺,容易使系統誤將抖動毛刺當作觸發信號,從而使整個硬件系統變的不可靠。

方案二:采用軟件觸發方式。軟件觸發的原理很簡單,就是在MCU內通過一定的算法,將A/D轉換器采集到的數據和軟件設置的觸發電平進行比較,從而實現可靠的波形觸發。其優點是可以根據實際情況方便的選擇不同的觸發方式和觸發電平,具有極高的靈活性。此外該方案在一定程度上消除了硬件觸發電路產生的干擾毛刺,提高系統的穩定性。

基于以上對系統穩定性和成本控制的考慮,本設計選擇方案二。

3.3.2 峰值測量方案選擇

對示波器來說,測量并顯示信號峰值是其必不可少的一部分。信號峰值測量包括正峰值和負峰值,而信號峰峰值就是正負峰值的絕對值。

方案一:峰值檢波法。峰值檢波法是利用硬件電路對電容進行充放電,從而在電容兩端保持信號峰值。然后通過A/D轉換器采集電容兩端的電壓值,并把峰值顯示出來。峰值檢波法能有效的測量出信號的峰值,且由于是采用硬件電路來實現峰值的檢測,不會對MCU增加任何的負擔。但該方案的缺點是需要采用高速運算放大器,不但增加了系統的設計成本,同時也增加了硬件系統的復雜度。

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

考慮到本設計測量的頻率范圍不是很大,且在軟件系統中增加峰值測量算法,對信號數據處理及顯示速度的影響不大。同時為了不增加系統的設計成本,本設計的峰值測量方案采用方案二。

3.3.3 測量頻率方案選擇

因為被測信號頻率的大小決定了示波器的采樣方式,且直接決定采樣時鐘的選擇,因而測量頻率在示波器中顯得尤為重要。測量頻率的方案通常有測周法和測頻法兩種。

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

方案二:等精度測頻法。其原理是在一個固定的門限時間內,使用一個固定頻率的基準脈沖,使得被測信號與基準脈沖同時計數,再通過兩個計數值之間的關系便可以計算出被測信號頻率。門限時間的開啟由被測脈沖的邊沿來觸發。該方案的優點是測量精度與被測信號頻率無關,且只要基準脈沖頻率足夠大,系統就能夠實現很高的測量精度。

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

3.3.4 采樣方案選擇

在現代數字示波器一般都會同時采用實時采樣和等效采樣這兩種采樣方式。

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

方案二:等效采樣。等效采樣又稱為非實時采樣,可分為順序采樣和隨機采樣兩種方式。順序采樣是對每一個信號周期僅采樣一點,經過若干個周期的采樣之后,就能完整的恢復原始信號的波形。隨機采樣是在每個采樣周期內采集多個采樣點,并且每個采樣周期第一個采樣點的時刻是隨機的,經過多個采樣周期的疊加即可還原原始波形。但等效采樣法的前提是,被測信號必須是周期信號且能有效的觸發,也就是說等效采樣方式對單次信號的測量是無能為力的。

等效采樣雖然可以對很高頻率的信號進行采樣,但是步進延遲的采樣技術較難實現,而且總采樣時間過長,從而導致示波器反應速度慢。而實時采樣方式的優點是采樣所需的時間很短,示波器響應快。同時考慮到本設計所要求的采樣率不是特別高,因此本設計選用實時采樣的方式。


4 系統硬件電路設計
4.1 微控制器電路

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

1.047.jpg

圖4.1              微控制器電路

4.2 電源電路設計

本設計的定位是便攜式,因此采用鋰電池供電。鋰電池選用目前市場上性價比最高的18650電池,容量為2000mAh,并可充電。因為鋰電池的電壓為3.7V,因此需要設計一個升壓電路把電壓升壓到5V,才能給系統供電。升壓電路如圖4.2所示。

            1.048.jpg

圖4.2              升壓電路

此外,還需要設計一個負電壓轉換電路,以產生-5V來給運放供電。負電壓轉換電路采用芯片ICL7660來完成,該芯片具有成本低、電路結構簡單等優點。負電壓轉換電路如圖4.3所示。

          1.049.jpg

圖4.3              負電壓轉換電路

4.3 信號采集電路設計

信號采集部分是數字示波器和模擬示波器在本質上的區別,其組成包括模擬信號的調理和數字信號的處理。數字示波器的性能也主要是受到信號采集系統的限制。因此對數字示波器來說,一個好的信號采集系統是至關重要的。

4.3.1 A/D轉換及FIFO緩存器

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

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

1.050.jpg

圖4.4  A/D轉換及FIFO緩存電路

4.3.2 程控放大電路

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

1.051.jpg

圖4.5              程控放大電路

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

4.3.3 電平移位電路設計

因為ADS830E的模擬輸入電壓范圍是1.5V~3.5V,輸入中點電壓為2.5V,所以基線電壓應為2.5V。因此需要設計一個電平移位電路,把前級經過調理后的信號疊加2.5V,以滿足AD轉換器的電壓輸入范圍。電平移位電路如圖4.6所示。

1.052.jpg

圖4.6              電平移位電路

電路圖中,IN為前級調理后的輸入信號,ADC端接到AD轉換器的輸入端,Level為單片機的PWM輸出端。單片機輸出的PWM經過RC低通濾波器之后,將會變成一個和占空比相對應的電壓值,從而實現了通過改變PWM的占空比來改變信號波形的基線。

4.3.4 頻率測量電路

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

1.053.jpg                                                 (4.1)

在數字測量和控制系統中,由傳感器送來的波形邊沿較差,此外,脈沖信號經過遠距離的傳輸后,往往會發生各種各樣的畸變,利用滯回比較電路可以對這些信號進行整形。整形效果如圖4.8所示。

1.054.jpg

圖4.7  波形整形電路

1.055.jpg

圖4.8  整形效果圖

4.4 無線數據傳輸

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

該模塊主要用于短距離的數據無線傳輸領域。可以方便的和 PC機的藍牙設備相連,也可以兩個模塊之間的數據互通。避免繁瑣的線纜連接,能直接替代串口線。該模塊廣泛應用于工業遙控、遙測;POS系統,無線鍵盤、鼠標;樓宇系統化、安防、機房設備無線監控、門禁系統;汽車檢測設備等領域。

藍牙模塊功能框圖如圖4.9所示,應用電路如圖4.10所示。

1.056.jpg

圖4.9              藍牙模塊功能框圖

1.057.jpg

圖4.10              藍牙模塊應用電路


5 系統軟件設計
5.1 單片機軟件開發環境

本設計采用STM32F103系列單片機作為控制核心,軟件開發環境選用keil uVision。

keil uVision是美國Keil Software公司出品的51系列兼容單片機C語言軟件開發統,與匯編相比,C語言在功能上、結構性、可讀性、可維護性上有明顯的優勢,因而易學易用。keil uVision軟件提供豐富的庫函數和功能強大的集成開發調試工具,全Windows界面。另外重要的一點,只要看一下編譯后生成的匯編代碼,就能體會到Keil C51生成的目標代碼效率非常之高,多數語句生成的匯編代碼很緊湊,容易理解。在開發大型軟件時更能體現高級語言的優勢。

C51工具包的整體結構,其中uVision是C51 for Windows的集成開發環境(IDE),可以完成編輯、編譯、連接、調試、仿真等整個開發流程。開發人員可用IDE本身或其它編輯器編輯C或匯編源文件。然后分別由C51及A5l編譯器編譯生成目標文件(.OBJ)。目標文件可由LIB51創建生成庫文件,也可以與庫文件一起經L51連接定位生成絕對目標文件(.ABS)。ABS由OH51轉換成標準的Hex文件,以供調試器dScope51或tScope51使用進行源代碼級調試,也可由仿真器使用直接對目標板進行調試,也可以直接寫入程序存儲器如EPROM中。

5.2 主程序設計及流程圖

本設計是一個以硬件為基礎的、軟硬件緊密結合的系統。對于智能儀器儀表來說,軟件就是靈魂。示波器軟件采用C語言來編寫,完成對人機界面、系統控制、系統硬件、波形參數分析等的控制。主程序流程圖如圖5.1所示。

5.3 數據處理子程序

5.3.1 同步觸發的軟件實現

為了降低電路的復雜性,本設計采用軟件來實現同步觸發。軟件觸發的好處是觸發

條件更易調整,只需調整比較語句中的參數即可。保證可以用軟件觸發的條件是要有足夠大的存儲空間,顯示一屏的數據為240個,但每次讀進單片機的數據為500個,多余260個數據就是作為不滿足觸發條件的舍棄余量,為了以防萬一,當從500個數據中以經讀出超過260個數據但還沒有符合觸發條件的數據時,將跳出觸發比較循環,重新從FIFO存儲器中讀出500個數據,因為FIFO存儲器為4K容量,最多可以這樣重復讀取8次數據,所以軟觸發可以非常穩定的工作。

同步觸發子程序:

read:

for(i=0;i<500;i++)   // 從FIFO存儲器中讀500 個數據

{

FIFO_R=0;

add[ i]=FIFO_bus;

FIFO_R=1;

}

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

{

              q+=1;

if(q>=260)  //若存儲數據不足則重新讀數據

goto read;

}

程序的意思是只有當此時采樣信號的數值是m且為上升沿時才可以觸發,改變觸發沿只需改變運算符,改變觸發電壓只需改變m的值即可,m的取值范圍是0~255。

5.3.2 頻率計算原理及流程圖

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

1.078.jpg                                               (5.1)

頻率計算流程圖如圖5.2所示。



圖5.2  頻率計算流程圖
5.3.3 測量信號峰峰值

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

在程序開始時給a中賦值128,即基線電壓值。因為一屏幕的顯示數據為240個,所以用for循環將if…else…判斷語句執行240次,在a中存放最大值,在b中存放最小值。對每個數據進行比較,如果該數據比a大則將這個數據存入a;如果小于a,則將這個數據與b進行比較,比b大則拋棄,比b小則存入b。故當240個循環執行完后a中存放的是這一屏幕數據中的最大值,b中存放的是這一屏幕顯示數據中的最小值。在比較完后用a減去b,得到差值存入c中,則c中保存的值就是電壓的峰峰值,調用電壓計算顯示子程序根據當前的垂直靈敏度給c乘以不同的倍數,得到實際的峰峰值。

峰峰值測量子程序:

a=128;

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

  {

     if(add[ i]>a)

       {

          a=add[ i];

        }

        else if(add[ i]<b)[ size][="" font][="" color][="" p][p="24," null,="" left]顯示平臺6.1 Android應用開發環境6.1.1 Android簡介

  Android是Google于2007年11月5日宣布的基于Linux平臺的開源手機操作系統的名稱,該平臺由操作系統、中間件、用戶界面和應用軟件組成,號稱是首個為移動終端打造的真正開放和完整的移動軟件。可以把它簡單理解成Linux上套了一個JAVA的殼。

6.1.2 開發所需的軟件包

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

  2、Android SDK 這是Android開發必需的。

  3、Eclipse 3.5最好使用這個版。它可從Eclipse官網下載。

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

6.1.3 搭建Android開發環境

準備好開以上軟件包之后,我們便可以搭建Android的開發環境了。

第一步:安裝java JDK 6.0。

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

第三步:Android SDK 安裝。

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

第四步、Eclipse集成開發環境(IDE)搭建

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

2、彈出“Available Software”對話框,點擊“Add...”按鈕

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

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

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

6.1.4 測試所配的開發環境
  • 新建項目:打開Eclipse,選擇File > New > Project > Android Project,便會打開新建項目界面,如圖6.1所示。

在Project name中輸入工程的名字,build target中選擇所用的平臺,Application name為應用程序的名稱,create activity為活動類的名稱。

1.092.jpg

圖6.1              新建項目

2、配制運行方式:點擊Run Configurations會出現配制運行方式界面,如圖6.2所示。然后點擊Android application新建一個動行方式,在右邊project中輸入要運行的工程名稱。至此運行方式配制完成。

1.093.jpg

圖6.2  配制運行方式

3、運擊會行,便會出下如下界面,如圖6.3:

1.094.jpg

圖6.3              運行界面

至此,Android的開發環境已搭建成功。

6.2 Android藍牙通信設計

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

本設計分為信號采集模塊和Android顯示終端,兩部分采用藍牙技術進行無線通信。Android顯示終端實現波形的顯示和示波器參數的設置。

6.2.1 Android設備中藍牙模塊的使用
  • 使用藍牙的響應權限

[html]view plaincopyprint



  • 配置本機藍牙模塊

BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();

//直接打開系統的藍牙設置面板

Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);

startActivityForResult(intent, 0x1);

//直接打開藍牙

adapter.enable();

//打開本機的藍牙發現功能(默認打開120秒,可以將時間最多延長至300秒)

Intent discoveryIntent = new                                                        

Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);

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

  • 搜索藍牙設備

使用BluetoothAdapter的startDiscovery()方法來搜索藍牙設備。

startDiscovery()方法是一個異步方法,調用后會立即返回。該方法會進行對其他藍牙設備的搜索,該過程會持續12秒。該方法調用后,搜索過程實際上是在一個System Service中進行的,所以可以調用cancelDiscovery()方法來停止搜索(該方法可以在未執行discovery請求時調用)。請求Discovery后,系統開始搜索藍牙設備,在這個過程中,系統會發送以下三個廣播:

ACTION_DISCOVERY_START:開始搜索

ACTION_DISCOVERY_FINISHED:搜索結束

ACTION_FOUND:找到設備

這個Intent中包含兩個extra fields:EXTRA_DEVICE和EXTRA_CLASS,分別包含BluetooDevice和BluetoothClass。我們可以自己注冊相應的BroadcastReceiver來接收響應的廣播,以便實現某些功能。

功能代碼如下:

// 創建一個接收ACTION_FOUND廣播的BroadcastReceiver

private final BroadcastReceivermReceiver = new BroadcastReceiver() {

public void onReceive(Context context, Intent intent) {

String action = intent.getAction();

// 發現設備

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

// 從Intent中獲取設備對象

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

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

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

}

}

};

// 注冊BroadcastReceiver

IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);

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

6.2.2 藍牙數據通信

如果打算建議兩個藍牙設備之間的連接,則必須實現服務器端與客戶端的機制。當兩個設備在同一個RFCOMM channel下分別擁有一個連接的BluetoothSocket,這兩個設備才可以說是建立了連接。服務器設備與客戶端設備獲取BluetoothSocket的途徑是不同的。服務器設備是通過accepted一個incoming connection來獲取的,而客戶端設備則是通過打開一個到服務器的RFCOMM channel來獲取的。

  • 服務器端的實現

通過調用BluetoothAdapter的listenUsingRfcommWithServiceRecord(String, UUID)方法來獲取BluetoothServerSocket,并調用BluetoothServerSocket的accept()方法監聽連接請求,如果收到請求,則返回一個BluetoothSocket實例(此方法為block方法,應置于新線程中)。如果不想在accept其他的連接,則調用BluetoothServerSocket的close()方法釋放資源。

  • 客戶端的實現

通過搜索可以得到服務器端的BluetoothService,并通過調用BluetoothService的listen

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

3、數據通信

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

6.3 Android上繪制波形

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

6.3.1 SurfaceView的使用

只要繼承SurfaceView類并實現SurfaceHolder.Callback接口就可以實現一個自定義的SurfaceView。SurfaceHolder.Callback在底層的Surface狀態發生變化的時候通知View,SurfaceHolder.Callback具有如下的接口:

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

2、surfaceChanged(SurfaceHolder holder,int format,int width,int height):當Surface的狀態(大小和格式)發生變化的時候會調用該函數,在surfaceCreated調用后該函數至少會被調用一次。

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

SURFACE_TYPE_NORMAL:用RAM緩存原生數據的普通Surface。

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

SURFACE_TYPE_GPU:適用于GPU加速的Surface。

SURFACE_TYPE_PUSH_BUFFERS:表明該Surface不包含原生數據,Surface用到的數據由其他對象提供,在Camera圖像預覽中就使用該類型的Surface,有Camera負責提供給預覽Surface數據,這樣圖像預覽會比較流暢。如果設置這種類型則就不能調用lockCanvas來獲取Canvas對象了。

6.3.2 繪制波形子程序

該子程序的功能是,先繪制8*8的顯示網格,然后把接收到的波形數據在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);              //設置畫筆為黃色

   mPaint.setStrokeWidth(1);                            //設置畫筆粗細

   oldY=0;

   //繪制8*8的網格

   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);// 畫筆設置為綠色

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

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

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

   }

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

}


結  論

經過三個月的努力,終于完成了本畢業設計。總結這三個月來的工作,主要有以下幾個方面:

1、綜述了現階段數字存儲示波器技術及產品的國內外發展狀況,對數字存儲示波器的原理、工作方式、顯示方式等的基本概念及技術發展進行了介紹。

2、針對設計的任務和要求,確定了存儲示波器波形采樣和數據處理及波形重組的硬件和軟件方案。

3、對整機各部分關鍵電路進行相關理論分析、計算和設計。

4、本系統由單片機主控,高速A/D轉換器ADS830進行模數轉換,用FIFO緩存芯片IDT7203來實現波形的存儲。通過軟件對轉換后的數字信號進行處理,并通過藍牙把波形數據發送到Android設備上進行顯示。

5、完成了作品的制作與調試;論述了儀器的測試方法,完成數據測試及測試結果分析。

采用Android設備作為顯示平臺,是本設計最大的一個特點。本設計的基本思路是,由單片機對ADC采樣到的數據進行處理,再通過藍牙把波形數據發送到Android設備上進行顯示。同時由于Android設備都采用觸摸屏,因此示波器的參數可以很方便的通過觸摸屏進行設置。本設計采用Android設備取代液晶屏,并使用藍牙進行數據傳輸,充分利用了Android設備的硬件資源。其優點是降低了系統開發成本,并大大減小了系統硬件體積,完全實現了本設計小巧便攜的設計宗旨。

本系統的數據采集系統、數據處理系統和波形顯示系統等模塊都經過了軟硬件的調試。雖然整個系統的實現方案基本完成,但是還有一些不夠理想的地方,仍然有不少的工作需要繼續。比如需要進一步改善測量精度、模擬帶寬以及系統噪聲等性能;添加等效采樣、波形回調以及數據導出等功能。


參  考  文  獻

[1]  張永瑞. 電子測量技術基礎[M] . 西安:西安電子科技大學出版社,2006:131-133.

[2]  朱明強. 基于單片機及CPLD的數字存儲示波器的研究與設計[D] . 北京:北京交通大學,2008.

[3]  王彥斌. 數字存儲示波器中模擬通道設計[D] . 成都:電子科技大學,2008.

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

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

[6]  趙茂泰. 簡易數字存儲示波器評述[J] . 電子世界,2002,5(11):40-42.

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

[8]  蒙玉寶. 40Gsps隨機取樣數字示波器關鍵技術預先研究[D] . 成都:電子科技大學,2003.

[9]  楊豐盛. Android應用開發揭秘[M] . 北京:機械工業出版社,2009:15-16.

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

[11]  H.Troy Nagle,D.Carroll,J.David Irwin . DIGITAL LOGIC CIRCUIT ANALYSIS & DESIGN[M] . 北京:清華大學出版,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] . 現代電子技術,2011,14(14):17-18.

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

[15] 張根柱,陳勇鋼. 數字存儲示波器[J] . 現代技術開發,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] 劉巖. 數字示波器的設計[J] . 電腦知識與技術,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.


致  謝

在這里要衷心感謝我的指導老師蘇成悅教授的悉心指導和多方關懷。蘇老師思維敏銳,視野開闊,創新性強。他淵博的學識,嚴謹的治學作風,執著的敬業精神都深深地影響著我。我深深感受到他對研究的精益求精,對學生的鼓勵和愛護。他對工作和生活的態度將是我一生學習的榜樣。

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


附錄 A  實物圖

1.095.jpg

圖A1  信號采集模塊

1.096.jpg

圖A2  系統測試圖


附錄 B  系統主程序設計源碼

#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];              //波形數據

u8 Data_osc_full=0;

u8 Data_set[10];

//延遲函數

void Delay(u16 speed)

{

              u16 i;

              while(speed!=0)

              {

                            speed--;

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

              }

}

//設置水平掃描速度

void shuiping(u8 sp)

{

              if(sp >= 12)

                            sp=12;

              if(sp <= 1)

                            sp=1;

              //設置不同采樣速率

              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;                           

              }

}

//設置水平靈敏度

void SetAGC(u16 pulse)

{

              if(pulse >= 3)

                            pulse=3;

              if(pulse <= 1)

                            pulse=1;

              //設置不同的增益

              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();                            //片內硬件初始化

              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);              //延時,等待Android系統處理完畢數據

                                TIM1->CR1 |= 0x0001;              //開啟定時器TIM1            

                            }

              }

}


附錄 C  Android藍牙服務程序設計源碼

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 {

    // 調試用

    private static final String TAG = "DeviceListActivity";

    private static final boolean D = true;

    // 返回時數據標簽

    public static String EXTRA_DEVICE_ADDRESS = "設備地址";

    // 成員域

    private BluetoothAdapter mBtAdapter;

    private ArrayAdapter mPairedDevicesArrayAdapter;

    private ArrayAdapter mNewDevicesArrayAdapter;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        // 創建并顯示窗口,并設置窗口顯示模式為窗口方式

        requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);

        setContentView(R.layout.device_list);

        // 設定默認返回值為取消

        setResult(Activity.RESULT_CANCELED);

        // 設定掃描按鍵響應

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

        scanButton.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {

                doDiscovery();

                v.setVisibility(View.GONE);

            }

        });

        // 初使化設備存儲數組

        mPairedDevicesArrayAdapter = new ArrayAdapter(this,

R.layout.device_name);

        mNewDevicesArrayAdapter = new ArrayAdapter(this,

R.layout.device_name);

        // 設置已配隊設備列表

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

        pairedListView.setAdapter(mPairedDevicesArrayAdapter);

        pairedListView.setOnItemClickListener(mDeviceClickListener);

        // 設置新查找設備列表

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

        newDevicesListView.setAdapter(mNewDevicesArrayAdapter);

        newDevicesListView.setOnItemClickListener(mDeviceClickListener);

        // 注冊接收查找到設備action接收器

        IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);

        this.registerReceiver(mReceiver, filter);

        // 注冊查找結束action接收器

        filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);

        this.registerReceiver(mReceiver, filter);

        // 得到本地藍牙句柄

        mBtAdapter = BluetoothAdapter.getDefaultAdapter();

    }

    @Override

    protected void onDestroy() {

        super.onDestroy();

        // 關閉服務查找

        if (mBtAdapter != null) {

            mBtAdapter.cancelDiscovery();

        }

        // 注銷action接收器

        this.unregisterReceiver(mReceiver);

    }

    public void OnCancel(View v){

                  finish();

    }

    //開始服務和設備查找

    private void doDiscovery() {

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

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

        setProgressBarIndeterminateVisibility(true);

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

        // 顯示其它設備(未配對設備)列表

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

        // 關閉再進行的服務查找

        if (mBtAdapter.isDiscovering()) {

            mBtAdapter.cancelDiscovery();

        }

        //并重新開始

        mBtAdapter.startDiscovery();

    }

    // 選擇設備響應函數

    private OnItemClickListener mDeviceClickListener = new OnItemClickListener() {

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

            // 準備連接設備,關閉服務查找

            mBtAdapter.cancelDiscovery();

            // 得到mac地址

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

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

            // 設置返回數據

            Intent intent = new Intent();

            intent.putExtra(EXTRA_DEVICE_ADDRESS, address);

            // 設置返回值并結束程序

            setResult(Activity.RESULT_OK, intent);

            finish();

        }

    };

    // 查找到設備和搜索完成action監聽器

    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {

        @Override

        public void onReceive(Context context, Intent intent) {

            String action = intent.getAction();

            // 查找到設備action

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

                // 得到藍牙設備

                BluetoothDevice device =

  intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

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

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

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

device.getAddress());

                }else{  //添加到已配對設備列表

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

device.getAddress());

                }

            // 搜索完成action

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

                setProgressBarIndeterminateVisibility(false);

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

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

                    String noDevices = "沒有找到新設備";

                    mNewDevicesArrayAdapter.add(noDevices);

                }

            }

        }

    };


}

評分

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

查看全部評分

回復

使用道具 舉報

ID:113875 發表于 2016-4-13 09:10 | 顯示全部樓層
學習了~~~~~~~~~~
回復

使用道具 舉報

ID:114085 發表于 2016-4-14 23:05 | 顯示全部樓層
非常感謝!我先下載學習下!
回復

使用道具 舉報

ID:123117 發表于 2016-5-25 15:08 | 顯示全部樓層
好東西啊,很值得學習!
回復

使用道具 舉報

ID:123154 發表于 2016-5-25 16:43 | 顯示全部樓層
受教了 很不錯 就是沒錢下載
回復

使用道具 舉報

ID:117823 發表于 2016-6-4 01:54 來自觸屏版 | 顯示全部樓層
這個很有用
回復

使用道具 舉報

ID:129333 發表于 2016-11-11 21:23 | 顯示全部樓層
很不錯,樓主,謝謝了
回復

使用道具 舉報

ID:171328 發表于 2017-3-16 20:11 | 顯示全部樓層
學習了,剛好可以借用,51黑有你更精彩
回復

使用道具 舉報

ID:204243 發表于 2017-5-24 12:18 來自觸屏版 | 顯示全部樓層
感謝樓主
回復

使用道具 舉報

ID:135643 發表于 2017-5-25 19:06 | 顯示全部樓層
這個確實比較實用
回復

使用道具 舉報

ID:75267 發表于 2017-6-27 11:59 | 顯示全部樓層
感謝分享 這個厲害了
回復

使用道具 舉報

ID:233712 發表于 2017-9-17 20:36 | 顯示全部樓層

這個確實比較實用
回復

使用道具 舉報

ID:237354 發表于 2018-2-27 23:41 | 顯示全部樓層
很好的資料
回復

使用道具 舉報

ID:142638 發表于 2018-4-12 15:03 | 顯示全部樓層
感謝樓主
回復

使用道具 舉報

ID:341542 發表于 2018-5-30 17:16 | 顯示全部樓層
不錯 ,學習~
回復

使用道具 舉報

ID:368366 發表于 2018-7-11 11:43 | 顯示全部樓層
白高興一場,哎,android不是源碼,根本沒法實現功能,是不是樓主傳錯了求源碼,求源碼
回復

使用道具 舉報

ID:125889 發表于 2018-8-28 21:14 | 顯示全部樓層
謝謝作者開源分享,我下載下來學習一下
回復

使用道具 舉報

ID:125889 發表于 2018-8-29 07:32 | 顯示全部樓層
樓主這個的線路板是怎么弄的?用洞洞板可以嗎?
回復

使用道具 舉報

ID:74977 發表于 2018-12-13 15:50 | 顯示全部樓層
哇,樓主厲害了,我也來學習學習
回復

使用道具 舉報

ID:521014 發表于 2019-6-3 18:29 | 顯示全部樓層
樓主厲害了,學習學習學習
回復

使用道具 舉報

ID:405966 發表于 2019-6-23 23:13 來自觸屏版 | 顯示全部樓層
幾個主要的元件有點小貴
回復

使用道具 舉報

ID:405966 發表于 2019-6-27 06:28 來自觸屏版 | 顯示全部樓層
不錯的東西,可惜木有幣
回復

使用道具 舉報

ID:576975 發表于 2019-7-3 13:07 | 顯示全部樓層
不錯的東西
回復

使用道具 舉報

ID:452731 發表于 2019-7-11 12:07 | 顯示全部樓層
只來學習,支持樓主
回復

使用道具 舉報

ID:696797 發表于 2020-2-23 09:17 | 顯示全部樓層
很棒  很有用
回復

使用道具 舉報

ID:253767 發表于 2020-4-22 06:51 | 顯示全部樓層
謝謝分享!!!
回復

使用道具 舉報

ID:1043982 發表于 2022-9-14 08:11 | 顯示全部樓層
樓主做的真好,學習了,對我幫助很大
回復

使用道具 舉報

ID:909377 發表于 2022-10-8 20:33 | 顯示全部樓層
可進行瞬態分析?
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲一区二区三区视频 | 91xxx在线观看 | 亚洲精品综合 | 99热在这里只有精品 | 国产精品久久免费观看 | 亚洲精品视频在线看 | 一级黄色av电影 | 久久久999免费视频 999久久久久久久久6666 | 国产偷自视频区视频 | 国产日韩一区二区三免费高清 | 麻豆久久久久久久久久 | 日韩三级一区 | 亚洲欧美一区二区三区视频 | 免费看啪啪网站 | 91国自视频| 国产成人免费视频网站视频社区 | 99re视频在线| 亚洲日韩中文字幕 | 一区二区国产在线观看 | 男人天堂色 | 久久黄色 | 玖玖视频国产 | 成人二区 | 一级黄色毛片子 | 日韩一区中文字幕 | 91社影院在线观看 | 国产在线精品一区二区 | 国产精品久久免费观看 | www.久久| 久久精品亚洲精品国产欧美 | 成人免费视频观看视频 | 亚洲欧美在线一区 | 香蕉91| 国内久久 | 久在线精品视频 | 日韩成人在线电影 | 伊人色综合久久久天天蜜桃 | 欧洲精品在线观看 | 91精品国产777在线观看 | 二区久久 | 亚洲精品久久久久国产 |