單片機實例分享,自制數字示波器

示波器是最常用的電子測量儀器之一,它能把肉眼看不見的電信號變換成看得見的圖像。為了攜帶方便,我曾經做過一臺簡易數字示波器(見圖22.2),材料成本只有150元左右,這臺數字示波器的設計思想是:簡單實用,價格低廉,容易製作。

主要性能指標:

最高採樣率:20MSa/s

模擬帶寬:4MHz

輸入阻抗:1MΩ

垂直靈敏度:0.01V/div~5V/div(按1-2-5方式遞進,共9擋)

水平掃描速度:1.5µs/div~6ms/div(按1-2-5方式遞進,共12擋)

垂直分辨率:8位

顯示屏:2.4 英寸 TFT320×240(驅動控制芯片:ILI9325)

測量時能同時顯示信號的頻率、電壓峰峰值,具有信號保持(HOLD)功能。

單片機實例分享,自制數字示波器

圖22.2 自制的簡易數字示波器

電路工作原理

單片機實例分享,自制數字示波器

圖22.3 數字示波器結構框圖

我們知道,模擬示波器是用陰極射線示波管(CRT)顯示被測信號波形的,而數字示波器是採用LCM(LCD顯示模塊,含LCD及顯示驅動控制芯片)顯示被測信號波形。因為LCM的每一個顯示像素都對應一個地址,地址要用數據表示,每一個像素的顏色也是用數據表示的。因此電路向LCM發送的是數據編碼信號,這就決定了它和模擬示波器的電路結構不一樣。

本文介紹的數字示波器的結構框圖如圖22.3所示。它由垂直輸入電路、A/D轉換電路、數字信號處理與控制電路、液晶屏顯示電路、電源電路等部分組成。

單片機實例分享,自制數字示波器

圖22.4 數字示波器電路原理圖

輸入的電壓信號經垂直輸入電路放大,以提高示波器的靈敏度和動態範圍。對輸出的信號取樣後由 A/D 轉換器實現數字化,模擬信號變成了數字形式存入存儲器,微處理器對存儲器中的數據根據需要進行處理,最終在顯示屏上顯示測量波形和相關的參數,這就是數字存儲示波器的工作過程。

數字示波器的電路原理圖如圖22.4所示,下面分別對各單元電路進行介紹。

單片機實例分享,自制數字示波器

表22.1 垂直靈敏度和K1~K5的對應關係

1. 垂直輸入電路

垂直輸入電路由雙運算放大器LM6172和衰減電路等部分組成。對其有兩個基本的要求:一是對放大倍數的控制,二是要有滿足設計要求的足夠的帶寬。

示波器輸入信號電壓的動態範圍很大,為了將輸入信號電壓調節到A/D轉換電路的最佳採樣範圍,以便得到最合理的顯示波形,在信號電壓較小時要進行放大,在信號過大時要進行衰減。

示波器輸入信號的頻率範圍也很寬,為了使垂直輸入電路有較平坦的頻率特性曲線,即對不同頻率的信號放大電路的增益基本保持一致。為此選用了高速雙運放LM6172,其帶寬為100MHz,並在衰減電路中加了頻率補償電容。

電阻R1、R2、R3和繼電器K1、K2、K3等組成衰減電路,衰減係數分3擋:1:1、1:10、1:100,由K1、K2、K3控制。第一級運算放大器接成電壓跟隨器的模式,主要起到緩衝的作用,提高輸入阻抗,降低輸出阻抗。第二級運算放大器接成電壓串聯負反饋電路的模式,其中電阻R6、R7、R8和繼電器K4、K5等組成3擋增益調節電路,放大器的增益由K4、K5控制。當觸點K4閉合時增益為(R6+R9)/R6;當觸點K4開啟、K5閉合時增益為(R6+R7+R9)/(R6+R7);當觸點K4、K5均開啟時增益為(R6+R7+R8+R9)/(R6+R7+R8)。按電路圖中各電阻的取值,對應本級3擋的增益分別為25、12.5、5。

繼電器K1~K5工作狀態受單片機控制,所以垂直輸入電路是一個程控放大器。垂直靈敏度和K1~K5工作狀態的對應關係見表22.1(1表示閉合,0表示斷開)。

2. A/D 轉換電路

我們知道,A/D轉換電路的作用就是將模擬信號數字化。一般把實現連續信號到離散信號的過程叫採樣。連續信號經過採樣和量化後才能被單片機處理。通過測量等時間間隔波形的電壓幅值,並把該電壓值轉化為用二進制代碼表示的數字信息,這就是數字示波器的採樣,採樣的工作過程見圖22.5。採樣的時間間隔越小,重建出來的波形就越接近原始信號。採樣率就是每秒採樣的次數,例如,示波器的採樣率是10MSa/s,即每秒採樣10M次,則表示每 0.1μs進行一次採樣。採樣率是數字示波器最重要的一項指標。

根據Nyquist採樣定理,當對一個最高頻率為f的模擬信號進行採樣時,採樣率必須大於f的兩倍以上才能確保從採樣值完全重構原來的信號。對於正弦波,每個週期至少需要兩次以上的採樣才能保證根據採樣數據恢復原始波形。在數字示波器中,為了減小顯示波形的失真,採樣率至少要取被測信號頻率的5~8倍。本文介紹的數字示波器採樣率取被測信號頻率的5倍,因為最高採樣率為20MSa/s,所以當被測信號的帶寬在4MHz以內時有比較好的測量結果。

採樣率的提高受制於A/D轉換芯片的工作速度,本文電路中使用的單片機ATmega16內部雖然也有A/D轉換器,但其工作頻率太低,不能滿足數字示波器的採樣要求。因此我們用了一片高速A/D轉換芯片ADS830E,其最高採樣率可達60MSa/s。ADS830E的轉換精度為8位二進制數,即垂直分辨率為256,因為選用的LCM的分辨率為320×240,對應垂直分辨率為240,所以ADS830E完全能滿足分辨率的使用要求。

ADS830E的IN(17腳)是供採樣的模擬信號的輸入端,CLK(10腳)是採樣時鐘信號輸入端。每輸入一個時鐘脈衝就進行一次A/D轉換,轉換後的8位二進制數據由D0~D7輸出。ADS830E的輸入電壓幅度可以通過11腳進行控制,當11腳接高電平時,ADS830E的輸入電壓範圍是1.5~3.5V;當11腳接低電平時,輸入電壓範圍是2~3V。這裡選用1.5~3.5V的輸入電壓範圍,中點電壓為2.5V,中點電壓由電位器RP進行調節。當IN輸入電壓為1.5V時,D0~D7輸出的轉換數據是0x00,當IN輸入電壓為3.5V時,D0~D7輸出的轉換數據是0xff,即255。

單片機實例分享,自制數字示波器

圖22.5 採樣的工作過程

3. 數字信號處理與控制電路

數字信號處理與控制電路由單片機ATmega16、FIFO(先進先出)存儲器IDT7205、4個2輸入與非門74HC00等組成。

單片機ATmega16在電路中的主要作用是:(1)對A/D轉換後的數字信號進行處理,轉換成LCM能接受的數據格式,輸出給它顯示;(2)產生ADS830E、IDT7205工作所需要的時鐘脈衝信號;(3)通過按鍵對示波器參數進行控制調節,輸出繼電器的控制信號。

單片機實例分享,自制數字示波器

圖22.6 倍頻電路及各點的脈衝

FIFO存儲器IDT7205是一個雙端口的存儲緩衝芯片,具有控制端、標誌端、擴展端和8192×9的內部RAM陣列,12ns的高速存取時間。內部讀、寫指針在先進先出的基礎上可進行數據的自動寫入和讀出。當有數據輸入到數據輸入端口D0~D8時,可由控制端Wclk來控制數據的寫入。為了防止數據的寫溢出,可用標誌端滿FF、半滿HF來標明數據的寫入情況,寫入時由內部寫指針安排其寫入的位置。由於內部RAM陣列的特殊設計,先存入的數據將被先讀出。如果需要數據外讀,則可由控制端Rclk來控制數據的讀出。RST為復位端。Wclk、Rclk、RST均由單片機ATmega16提供控制脈衝。數據輸出端口Q0~Q8是三態的,在無讀信號時呈高阻態。輸入數據位D0~D8和輸出數據位Q0~Q8均為9位,這裡輸入和輸出均只使用了8位,即只使用了D0~D7和Q0~Q7。

讀到這裡,有的讀者可能會問:把ADS830E輸出端口D0~D7輸出的數據直接輸入ATmega16的PA端口不就行了嗎,為什麼還要在中間加上一個IDT7205?這是因為ADS830E工作速度比ATmega16快得多,即ATmega16讀取數據的速度比ADS830E輸出數據的速度慢,如果直接相連ATmega16就拖了ADS830E的後腿。加上IDT7205後就起到了緩衝的作用,ADS830E轉換的結果先存在IDT7205內,等到ATmega16需要時,再從IDT7205中讀出來。

ADS830E的採樣時鐘與IDT7205的寫信號時鐘是同一個時鐘源,以確保兩者同步。時鐘脈衝信號由ATmega16使用內部定時器產生,由於ATmega16外接晶體的頻率為20MHz,所以產生的時鐘信號最高頻率只能達到10MHz,為了使採樣率達到20MSa/s,使用了74HC00等構成的倍頻電路。若ATmega16 PD7端輸出的脈衝信號頻率為f,則74HC00的F4輸出的脈衝信號頻率為2f,倍頻電路的工作過程和各點脈衝信號時序關係如圖22.6所示。

K1~K5是幹簧繼電器,幹簧繼電器特點是吸合和釋放時噪聲很小,功耗低。因其吸合電流較小,所以可直接用ATmega16的輸出端口驅動。

SB1~SB5是示波器調節按鈕。SB1、SB2是水平掃描速度調節按鈕,按SB1時μs/div的值增加(水平掃描速度減小),按SB2時μs/div的值減小(水平掃描速度增加);SB3、SB4是垂直靈敏度調節按鈕,按SB3時V/div的值增加(垂直靈敏度減小),按SB4時V/div的值減小(垂直靈敏度增加);SB5是波形保持(HOLD)按鈕,按一下測量波形被凍結保持,同時在顯示屏上顯示字符“HOLD”,再按一下又恢復到正常測試狀態。所有調節參數均顯示在液晶屏上,調節好的參數將自動保存到ATmega16的EEPROM中,下次開機時有關參數將預設在上次關機前的設定值上。

4. 顯示電路

LCM採用2.4英寸TFT彩色液晶屏,分辨率為320像素×240像素,驅動控制芯片為ILI9325,該芯片傳遞數據8/16接口位兼容,使用8位接口時能夠節省單片機的輸出端口,在8位接口工作狀態時16位數據分兩次傳遞,速度稍慢。數據端口D0~D15中的高8位D8~D15為8位接口使用的端口。8/16接口位的選擇由端口IM0控制,IM0接高電平時為8位接口工作狀態,IM0接低電平時為16位接口工作狀態。

電路中ILI9325的工作電壓是3V,ATmega16的工作電壓是5V,兩者高電平不一致,通信端口相連時要進行電平轉換,因為這裡只需要ATmega16向ILI9325單向傳遞數據,所以只需要將5V向3V電平轉換,不需要將3V電平向5V電平轉換,就不必使用專用的電平轉換芯片,只要用電阻分壓電路將5V高電平轉換成3V高電平就行了。電路中R14~R35組成電阻分壓電路,連接端口有8個數據端口和3個控制端口。

5. 電源電路

這個數字示波器使用了交流電源,提供+5V、−5V、+3V三種直流電壓。

程序設計

設計好電路只是為數字示波器奠定基礎,更重要的是單片機程序的設計。實際上在設計硬件時既要考慮到功能,也要考慮到程序設計的需要。比如對單片機的選型,主要考慮功能、工作速度、端口的數量、程序存儲器Flash的容量、RAM的容量、有沒有EEPROM等。綜合考慮後選用AVR單片機ATmega16,它的程序存儲器Flash為16KB,RAM為1KB,使用時將16MHz的時鐘頻率超頻到20MHz,經過對其資源合理分配,完全可以滿足設計要求。

程序的開發環境為ICC-AVR V6.31A,使用 C語言編寫。程序採用了分時控制、順序調度的工作方式,沒有使用任何中斷程序,程序流程圖如圖22.7所示。

單片機實例分享,自制數字示波器

圖22.7 程序流程圖

下面對主要部分進行分別介紹。

1. 垂直靈敏度控制

按鈕SB3、SB4用來調節垂直靈敏度,按動後通過鍵盤掃描程序可以增加或減小程序中變量Key_ver的值,Key_ver取值範圍為1~9,分別對應9擋垂直靈敏度,通過Key_ver的取值控制繼電器K1~K5的工作狀態,從而得到相應的靈敏度。

以K1為例,K1接ATmega16的PB0端口,有關宏定義為:

#define K1_ON PORTB &=~(1<

#define K1_OFF PORTB |= (1<

因此,K1_ON表示PB0輸出低電平,K1閉合,觸點接通;K1_OFF表示PB0輸出高電平,K1釋放,觸點斷開。

2. 水平掃描速度控制

水平掃描速度控制是通過改變A/D轉換電路的採樣率來實現的,按動SB1、SB2可以改變程序中變量Key_hor的值,Key_hor取值範圍為1~12,分別對應12擋水平掃描速度。

A/D轉換電路所需的採樣時鐘脈衝用ATmega16的8位定時器/計數器2-T/C2產生,選擇CTC工作模式。其工作參數主要由控制寄存器TCCR2、計數寄存器TCNT2、輸出比較寄存器OCR2決定。TCCR2中的位CS22、CS21、CS20的取值確定T/C2的時鐘源的分頻係數,OCR2中的數據用於同TCNT2中的計數值進行連續的匹配比較,一旦TCNT2計數值與OCR2的數據相等,單片機端口OC2的輸出電平即取反,這樣即可輸出脈衝信號。脈衝信號的頻率f由時鐘源的分頻係數和OCR2的預置值決定,計算公式為f=時鐘源頻率/(2×(1+OCR2)),OC2輸出的脈衝信號經倍頻後作為採樣時鐘信號,相關參數之間的關係見表22.2。

只要對寄存器TCCR2、OCR2的值進行設置,就可以獲得我們所需頻率的採樣時鐘信號。

3. 數據的存儲和讀取

ADS830E的採樣數據存入IDT7205後達到一定數量就停止採樣,再將IDT7205存儲的數據讀入ATmega16,程序中用一個數組RAM[650]來存儲讀取的數據,存儲容量為650,即一次讀取650個採樣數據。

仔細看了電路圖的讀者可能會發現,IDT7205的滿FF端口並沒有使用,為什麼不用呢?這是因為ATmega16的RAM容量只有1KB,只能分配約650個存儲單元用來存儲從IDT7205讀取的數據,IDT7205存多了數據也沒有用,ATmega16不能全部存儲,多餘的數據就丟棄了,還不如少讀點數據節省時間,提高顯示波形的刷新頻率。這在採樣時鐘頻率較低時效果尤為明顯,因為採樣時鐘頻率越低,採集一個數據所花的時間越長。以採樣時鐘頻率5kHz為例,如果要將IDT7205存滿8192個數據,所需要的時間為8192/5000≈1.6s, 顯示波形1.6s以上才能刷新一次,這顯然是不行的。如果存滿700個就結束,則所需要的時間為700/5000=0.14s,刷新速度提高了很多。

從上面的分析可以看出,FIFO存儲器其實使用IDT7202就夠了,IDT7202有1024個存儲單元。不過筆者只買到了DIP封裝的IDT7205,雖然有點大材小用,但為以後數字示波器升級提供了空間。FIFO存儲器存儲數據的容量稱為數字示波器的存儲深度,也稱記錄長度,存儲深度也是數字示波器的一個重要技術指標,適當存儲深度便於對顯示波形進行分析和處理。

不使用FF端口是如何控制IDT7205存儲數量的呢?我在IDT7205存儲數據時根據不同的採樣時鐘頻率設置了不同的延時時間,在此時間內能存入多於700個數據即可。延時結束後即將IDT7205的存儲數據讀入ATmega16。

單片機實例分享,自制數字示波器

表22.2 相關參數之間的關係

由於ADS830E每次重新進入工作狀態要有一個穩定的過程,開始採樣的幾個數據精度不高,因此在讀取IDT7205數據時先空讀50個數據,將這些數據丟棄,然後再將後面的數據讀入ATmega16。

單片機實例分享,自制數字示波器

圖22.8 顯示區域

4. 數據計算處理

數據計算處理工作主要包括同步觸發信號檢測、信號電壓峰峰值測量、信號頻率測量。這部分程序設計的思路是:

先在650個數據的前350個數據中以顯示屏的垂直中點對應數據120為基準,找到同步觸發信號。之所以在前350個數據中找同步觸發信號,是為保留後面至少有300個數據供顯示波形用。找到同步觸發信號後,則把對應該點數據為起點的連續300個數據作為顯示數據。

然後找到650個數據中的最大值和最小值,求最大值和最小值的算術平均數,即可得到中點電壓值,檢測信號相鄰兩次向上穿過中點的時間差即可計算出信號的週期。

5. LCM的控制與顯示

TFT-LCD顯示屏的分辨率為320像素×240像素。顯示屏的每一個像素都對應著驅動控制芯片ILI9325內部存儲器唯一的一個地址(x,y),x為橫座標,尋址範圍為0~319;y為縱座標,尋址範圍為0~239。在像素對應地址寫入16位顏色數據就可以顯示相應的顏色,如果某一點要清除,只要對該像素對應的地址寫入背景色就可以了。由於這裡ILI9325採用8位接口工作模式,因此傳遞16位數要分兩次進行。

因為數字示波器既要顯示被測信號的波形,也要顯示有關的測量數據,如電壓峰峰值、頻率、水平掃描速度、垂直靈敏度等,所以必須對顯示區域進行合理的劃分,並對顏色進行規劃設置,分配好的顯示區域如圖22.8所示。圖中用來顯示波形的區域為中間的300×200。在這個區域畫了刻度線,將水平方向分成10格,垂直方向分成8格。其餘區域用來顯示各種數據。

對ILI9325最基本的操作有兩種:發送命令和發送數據。無論是顯示屏的初始化,還是設置顯示地址和顯示顏色,都要用到這兩種基本操作。

顯示被測信號波形的過程是:先清除上一幀顯示波形,然後畫刻度線(刻度線每次都要重畫,因為有些和顯示波形交叉的點也被清除了),最後畫新的一幀信號波形,同時備份數據作下一次清除用。顯示信號波形時,存儲器地址(x,y)中的x代表水平掃描信號所處的位置,y代表信號電壓的大小。每次刷新信號波形時,信號電壓峰峰值和信號頻率顯示數據也同時刷新一次。水平掃描速度和垂直靈敏度的數據只有在重新調整後才刷新。

單片機實例分享,自制數字示波器

表22.3 主要元器件清單

元器件選擇

主要元器件的清單見表22.3。

經過試驗,我發現在工作電壓為5V時,單片機ATmega16和ATmega16L在時鐘頻率為20MHz下均能正常工作。因此,如果你手頭只有ATmega16L也可以使用。

IDT7205如果使用PLCC封裝的芯片,請注意引腳編號不同。

幹簧繼電器也可以選用其他型號的,只要工作電壓是5V,閉合電流小於20mA即可。

機箱我選用的是成品塑料機箱,你也可以用其他樣式的,或者自己用有機玻璃DIY。

顯示屏和ADS830E的兩塊轉接板是必須要用的,不然無法在萬能板上安裝,可以設法和元器件一起採購。

單片機實例分享,自制數字示波器

圖22.9 緩衝區對比圖

單片機實例分享,自制數字示波器

圖22.10 開關單獨安裝在小的萬能板上

顯示屏的品牌很多,你很難買到和我一樣的品牌。但有一點要注意,驅動控制芯片一定要是ILI9325的,如果不是,你就要修改程序了,不同的芯片即使是同一系列,驅動程序也往往不兼容。即使驅動芯片一樣,不同品牌的顯示屏引腳編號也可能不一致,接線時要仔細對照。另外有一點提醒一下:我買的顯示屏的4個背光二極管是並聯的,我是把它們公共的陽極串接一個電阻(不知道模塊內部有沒有限流電阻,還是外接一個電阻保險)接到+5V電源,如果你買的顯示屏的背光二極管是串聯的,要求的工作電壓就高了,接到+5V是不能發光的,可串連一個100Ω(電阻的取值使發光二極管工作電流不超過20mA為宜)接到LM7805的輸入端,此處的電壓約有10V,可以滿足驅動要求。

安裝

安裝前先將目標文件dso.hex寫入單片機ATmega16,特別提醒一下:用編程器將目標文件調入時要選擇“緩衝區預先填充00”選項,否則在顯示屏顯示字符時會出現色塊。如果你用下載線寫入文件,則往往不提供該選項給你選,會直接把緩衝區都填入了FF,見圖22.9上半部分,這時你可以手工編輯一下,把方框中的FF全部改為00,結果見圖22.9下半部分。

5個按鈕開關單獨安裝在小的萬能板上,見圖22.10。其餘的元件除顯示屏直接固定在機箱面板上外,都安裝在大的萬能板上。接線時注意同一單元要一點接地,數字地和模擬地要分開。三端穩壓器LM7805要加一個小的散熱片。

機箱的面板根據顯示屏的大小、按鈕開關和BNC插座的安裝位置開孔,面板上的標記可打印在一張紙上,再用1~2mm的透明有機玻璃做一塊尺寸一樣的面板(對應顯示屏的位置不開窗口,正好做防護屏),再把打印好的紙夾在兩層中間,用螺絲固定好後,面板就做好了。

按鈕開關電路板是直接用4個螺絲固定在面板上的,顯示屏可用熱熔玻璃膠固定,把顯示屏在窗口擺正位置後,在4個角用熱熔玻璃膠固定一下就可以了。

安裝好的示波器內部結構見圖22.11。

單片機實例分享,自制數字示波器

圖22.11 安裝完成的內部結構

調試

如果安裝時沒有接線錯誤,元器件沒有質量問題,調試還是比較容易的。

調試分4步進行。

(1)各單元先不接電源,測量電源部分輸出電壓是否正常,正常後再接通各部分的電源。

單片機實例分享,自制數字示波器

圖22.12 水平掃描線與中線未重合

單片機實例分享,自制數字示波器

圖22.13 補償電容與方波波形的關係

單片機實例分享,自制數字示波器

圖22.14 調試好的示波器的使用效果

(2)檢查顯示屏工作是否正常,接通電源,顯示屏初始化後先是全屏顯示白色閃亮一下,然後顯示刻度線和相關數據。如果開機後顯示屏沒有反應,先檢查單片機有沒有正常工作,如按動K3、K4繼電器的工作狀態應該有所改變。如正常再查顯示屏的連線和供電是否正常,直至顯示正常才能進入下一步。

(3)將示波器輸入端信號線短接,調節電位器RP,使其中點電壓為2.44V(注意不是1.5~3.5V的中點電壓2.5V,因為顯示屏垂直方向中點的值是120,120是2.44V電壓經A/D轉換後對應的值,對應2.5V電壓的A/D轉換值是255/2),這時候可以看到一條水平掃描線出現在水平中線附近,見圖22.12,仔細調節RP,使得其和水平中線重合。

(4)對衰減器的頻率補償電容進行調整,將垂直靈敏度調到0.5V/div,輸入 200kHz、幅度1V的方波,改變電容C2的容量,使示波器顯示的方波波形最好;再將垂直靈敏度調到1V/div,輸入200kHz、幅度2V的方波,改變電容C3的容量,使示波器顯示的方波波形最好。頻率補償電容與方波波形的關係見圖22.13。

裝配調試好的數字示波器的使用效果見圖22.14。


分享到:


相關文章: