步驟1:模擬前端
Xilinx Zynq IC具有“ XADC”模數(shù)轉(zhuǎn)換器。 XADC最多以1MSPS(每秒兆采樣)采樣,輸出12位值。該ADC的輸入范圍為0-1V。
XADC能夠?qū)讉€(gè)輸入通道進(jìn)行采樣,但是在Zynq板上,用戶實(shí)際上只能訪問(wèn)幾個(gè)特定的輔助輸入。在示波器中,我使用了Zybo XADC PMOD上可用的AUX14 ADC輸入。
由于0-1V的示波器輸入范圍不是很有用,因此必須在ADC輸入的前面添加模擬電路,以便縮放和移動(dòng)輸入電壓,請(qǐng)參見此步驟的框圖。
此框圖是使用LTSPICE原理圖/仿真中顯示的電路實(shí)現(xiàn)的(為仿真附上原理圖文件)。根據(jù)需要,增益為1/20 = 0.05,直到抗混疊濾波器導(dǎo)致其下降約400kHz(1MSPS ADC的奈奎斯特頻率= 500kHz)為止。
我在面包板上實(shí)現(xiàn)了該設(shè)計(jì)(沒(méi)有時(shí)間使用通孔組件設(shè)計(jì)PCB)。第二個(gè)LTSPICE原理圖中顯示了用于實(shí)現(xiàn)此設(shè)計(jì)的組件(不可仿真,僅用于設(shè)計(jì)用于訂購(gòu)零件的電路),以及實(shí)際構(gòu)建的電路。 3.3V和GND來(lái)自XADC PMOD連接器。
步驟2:ADC緩沖器/觸發(fā)器
設(shè)計(jì)負(fù)責(zé)采樣輸入信號(hào),在發(fā)生波形事件時(shí)觸發(fā)并在完成時(shí)使數(shù)據(jù)可用于PS。
-processing_system7_0:Zynq PS
-rst_processing_system7_0_100M:零件AXI通信(添加到連接自動(dòng)化中)
-processing_system7_0_ai_periph:AXI通信(添加到連接自動(dòng)化中)
-xadc_wiz_0:XADC實(shí)現(xiàn)。在DRP,單通道模式下配置,具有最大轉(zhuǎn)換率(實(shí)際為961KSPS)。 VAUX14被配置為雙極性模式。
-gpio_trigger_settings:GPIO IP用于設(shè)置子采樣和觸發(fā)閾值。二次采樣是指選擇從ADC接受輸入值的頻率。如果將示波器的時(shí)基縮小很長(zhǎng)一段時(shí)間,則緩沖區(qū)將太小而無(wú)法填滿(例如)以1MSPS采集的1秒數(shù)據(jù)。觸發(fā)閾值是指觸發(fā)發(fā)生時(shí)的電壓電平。
-gpio_trigger_control:GPIO IP。通道1輸出,能夠復(fù)位觸發(fā)塊(當(dāng)PS準(zhǔn)備好用于新的數(shù)據(jù)緩沖區(qū)時(shí))并聲明要讀取的存儲(chǔ)器的地址值。通道2是輸入,允許讀取數(shù)據(jù)緩沖區(qū)的輸出數(shù)據(jù),最后寫入的地址以及觸發(fā)緩沖區(qū)是否已滿。
-drp_int_0:我的IP,用于解釋XADC的DRP輸出。
-trigger_0:我的IP,用于實(shí)現(xiàn)觸發(fā)行為
-blk_mem_gen_0:用于保存過(guò)去的采樣值的IP。
此部分所有IP的SystemVerilog文件都包括在內(nèi)。
步驟3:用戶輸入處理
設(shè)計(jì)的這一部分負(fù)責(zé)對(duì)編碼器和按鈕輸入進(jìn)行采樣。 “標(biāo)準(zhǔn)速度” PMOD用于將這些信號(hào)引入Zynq。只需使用GPIO模塊即可對(duì)按鈕輸入進(jìn)行采樣。編碼器輸入由編碼器IP塊(由我編寫)處理,以便獲得與旋轉(zhuǎn)編碼器多少有關(guān)的“計(jì)數(shù)”值。
由于使用了機(jī)械式旋轉(zhuǎn)編碼器,因此開關(guān)和編碼器輸出均需要上拉電阻(5k Ohm),并且還添加了一個(gè)去抖動(dòng)的LP濾波器。這可能是我設(shè)計(jì)中最薄弱的部分,并且肯定需要做更多的工作。盡管對(duì)硬件模塊進(jìn)行了仿真,但顯示出正常的功能(圖像已附上),但我仍然無(wú)法從編碼器獲取準(zhǔn)確的計(jì)數(shù)值。在最后的演示之前,我沒(méi)有時(shí)間來(lái)診斷這個(gè)問(wèn)題,因此我建議您花一些時(shí)間比我更多的時(shí)間來(lái)設(shè)計(jì)這個(gè)問(wèn)題!
-encoder_btn_gpio:輸入了通道1,正在計(jì)數(shù)來(lái)自三個(gè)編碼器和兩個(gè)按鈕的值
-encoder0,1,2:我的IP,用于解釋旋轉(zhuǎn)編碼器的正交輸入。編碼器的步長(zhǎng)被記錄為可以為負(fù)或正的“計(jì)數(shù)”值。存在RST輸入以重置計(jì)數(shù)值,允許PS讀取計(jì)數(shù)值,然后將其重置。這樣,計(jì)數(shù)值將永遠(yuǎn)不會(huì)溢出并導(dǎo)致奇怪的結(jié)果。
步驟4:視頻驅(qū)動(dòng)程序
設(shè)計(jì)的這一部分負(fù)責(zé)繪制GUI和輸入波形。示波器波形,觸發(fā)電平線和其他變化的指示器存儲(chǔ)在幀緩沖器中,每個(gè)存儲(chǔ)器地址保存一個(gè)像素值。該幀緩沖區(qū)是一個(gè)塊內(nèi)存,VGA驅(qū)動(dòng)程序從中讀取值,然后將其發(fā)送到VGA端口以在屏幕上顯示。
最初,屏幕的大小希望為640 x480。但是,存儲(chǔ)一個(gè)塊RAM中的所有這些像素值都是不可能的,因?yàn)閴Kram的最大深度是262144(對(duì)應(yīng)于18位的地址,2 ^ 18 = 262144),并且640 x 480 = 307200像素。做出了妥協(xié),將屏幕縮小到480 x 512,以便將整個(gè)屏幕緩沖區(qū)存儲(chǔ)在一個(gè)塊ram中。
為了簡(jiǎn)化以后的編碼,在計(jì)算機(jī)上的圖像編輯器中繪制了背景圖像(網(wǎng)格和屏幕輪廓)。編寫(包括)了一個(gè)matlab腳本,將黑白BMP轉(zhuǎn)換為.coe文件,該文件可以預(yù)加載到塊ram單元中。這意味著圖像已經(jīng)存儲(chǔ)在內(nèi)存中,不需要用代碼或硬件“繪制”。這是與屏幕緩沖區(qū)分開的獨(dú)立塊內(nèi)存,因此兩個(gè)塊RAM的輸出將運(yùn)行到自定義IP塊(顏色處理器)中,以便“決定”應(yīng)顯示哪種顏色,示波器信號(hào)和指示器具有更高的層優(yōu)先級(jí)在網(wǎng)格上。
-axi_gpio_0:輸出通道1。控制地址,數(shù)據(jù)和啟用信號(hào)以寫入屏幕緩沖區(qū)。輸入通道2。讀取確認(rèn)位以確認(rèn)寫入操作已完成。
-bram_write_controller:從GPIO模塊獲取地址,數(shù)據(jù)和啟用信號(hào),以寫入塊ram。地址和數(shù)據(jù)信號(hào)無(wú)需更改即可簡(jiǎn)單路由。 EN信號(hào)帶來(lái)了復(fù)雜性。我不確定從GPIO寫入“ 1”和“ 0”將花費(fèi)多長(zhǎng)時(shí)間(就時(shí)鐘周期而言),因此我想確保塊wram僅被寫入一次。該寫控制器在GPIO的EN信號(hào)的上升沿運(yùn)行,以便為塊ram的寫使能產(chǎn)生一個(gè)1時(shí)鐘寬度的使能脈沖。完成該脈沖后,可以將確認(rèn)信號(hào)置為高電平,以確認(rèn)它已被寫入。
-signals_buffer1:這是一個(gè)3位寬的塊ram,用于在屏幕上存儲(chǔ)變化的像素值,例如波形,觸發(fā)電平線和電壓/分壓指示器。每個(gè)存儲(chǔ)器地址代表一個(gè)像素。地址系統(tǒng)的工作方式是,高9位是像素的行,低9位是像素的列。
-gui_buffer:這是一個(gè)1位寬的塊ram,用于存儲(chǔ)通過(guò)圖像生成的.coe文件加載的不變的GUI(網(wǎng)格,輪廓等)。 (附加了MATLAB腳本)
-vga_driver_0:為VGA協(xié)議生成水平和垂直同步信號(hào)。生成代表當(dāng)前顯示像素的列和行值。這些用于從塊RAM中讀出以讀取當(dāng)前像素的存儲(chǔ)值
-color_processor_0:此IP根據(jù)存儲(chǔ)的像素值決定顯示哪種顏色。我將優(yōu)先級(jí)從最高設(shè)置為最低(紅色觸發(fā)電平線,黃色信號(hào)線,白色GUI/網(wǎng)格)。每個(gè)像素的值存儲(chǔ)為3位值,每個(gè)位代表一個(gè)“層”。優(yōu)先級(jí)較高的信號(hào)(如觸發(fā)線)應(yīng)出現(xiàn)在“頂層”,而優(yōu)先級(jí)較低的信號(hào)(如背景網(wǎng)格)應(yīng)出現(xiàn)在“底層”。
步驟5 :處理系統(tǒng)
將前面介紹的設(shè)計(jì)組合在一起,以提供最終設(shè)計(jì),并由一個(gè)PS來(lái)控制它們。所有模塊的接口均通過(guò)GPIO IP。結(jié)合使用時(shí),請(qǐng)參見圖像以查看所有先前的GPIO模塊的命名約定:
-gpio_trigger_control:控制觸發(fā)模塊,讀取緩沖區(qū)值
-gpio_trigger_settings:設(shè)置閾值和子采樣
-screen_buffer_gpio:將值寫入屏幕緩沖區(qū)
-encoder_btn_gpio:讀取編碼器計(jì)數(shù)和按鈕值。
寫入(包括)用于寫入像素的庫(kù),讀取編碼器/按鈕輸入,并讀取樣本緩沖區(qū)值。由于時(shí)間有限,主代碼有些大,沒(méi)有足夠的時(shí)間使它們具有模塊化功能。
在最初的開發(fā)中,FreeRTOS將用于PS中。由于時(shí)間限制,這被放棄并且沒(méi)有使用任何任務(wù)。但是,我一直在進(jìn)行的CORTEX_A9_Zynq_ZC702 FreeRTOS演示項(xiàng)目仍在使用,其名義是在最后一刻盡可能少地更改。
我的示波器的最終版本僅具有垂直刻度調(diào)整和觸發(fā)電平調(diào)整,因此未使用時(shí)分顯示。
主程序的基本流程是:
1)檢查編碼器和按鈕輸入,適當(dāng)調(diào)整觸發(fā)值
2)檢查范圍是否已觸發(fā)(重復(fù)1&2,直到觸發(fā))
3)擦除并更新顯示V/Second劃分的標(biāo)記。
4)讀取觸發(fā)緩沖區(qū)的所有值。
5)計(jì)算觸發(fā)電平線在像素位置的位置
6)計(jì)算當(dāng)前和下一個(gè)樣本的位置以像素為單位
7)刪除當(dāng)前列中的所有像素
8)繪制一條從當(dāng)前樣本位置的行到下一個(gè)樣本位置的行的垂直線。
9)繪制觸發(fā)電平線
10)繪制三角形以顯示0V電平
11 )重置觸發(fā)器以再次開始采樣。
12)從1開始重復(fù)。
第6步:結(jié)論,注釋,未來(lái)改進(jìn)
回頭看看有一些變化我想做。大部分時(shí)間都受我時(shí)間緊迫的限制。
-編碼器:目前,編碼器的工作情況很差。我需要使用示波器進(jìn)行更多調(diào)試,以確保正交輸出“無(wú)反彈”且干凈,以便在解釋它們時(shí)沒(méi)有錯(cuò)誤。
-應(yīng)該添加垂直偏移和水平偏移/縮放。
責(zé)任編輯:wv
-
示波器
+關(guān)注
關(guān)注
113文章
6705瀏覽量
189289 -
Digilent
+關(guān)注
關(guān)注
2文章
219瀏覽量
16436
發(fā)布評(píng)論請(qǐng)先 登錄
Keysight是德Z系列數(shù)字示波器維修服務(wù)中心

是德示波器如何用數(shù)字通道快速定位PWM故障

泰克 Tektronix TDS3014C 數(shù)字示波器 TDS3014B
豐富的觸發(fā)功能-4457系列數(shù)字示波器

示波器測(cè)量電壓的步驟 數(shù)字示波器的基本操作方法
示波器的觸發(fā)功能(上)

示波器的基本原理 數(shù)字示波器與模擬示波器的區(qū)別
4457數(shù)字示波器 2Gpts的深度存儲(chǔ)
4457H系列數(shù)字示波器-H02函數(shù)發(fā)生器

HDI板盲孔制作常見缺陷及解決
MXO44-2410數(shù)字示波器
SDS1000系列數(shù)字存儲(chǔ)示波器
普源MHO5106示波器測(cè)電壓原理

與模擬示波器相比數(shù)字示波器的優(yōu)點(diǎn)有哪些
基于XIAO SAMD21開發(fā)板的數(shù)字鍵盤制作方案

評(píng)論