你的位置:首頁(yè) > 測(cè)試測(cè)量 > 正文

如何使用Python編程語(yǔ)言和ADALM2000創(chuàng)建虛擬示波器

發(fā)布時(shí)間:2022-08-08 來(lái)源:ADI 責(zé)任編輯:wenwei

【導(dǎo)讀】一個(gè)功能齊全的物理實(shí)驗(yàn)室造價(jià)不菲,其中的各式實(shí)驗(yàn)儀器常常價(jià)格昂貴,而且管理復(fù)雜。試想如果能夠構(gòu)建一個(gè)可放入口袋、隨時(shí)便攜的虛擬電子實(shí)驗(yàn)室,那么將為未來(lái)帶來(lái)無(wú)限的可能。虛擬電子實(shí)驗(yàn)室,是通過(guò)一系列基于軟件的應(yīng)用來(lái)實(shí)現(xiàn)的仿真電子儀器所組成的模擬實(shí)驗(yàn)室環(huán)境,用戶可以在該環(huán)境中開(kāi)展大量電子實(shí)驗(yàn)。


本文旨在演示用戶如何使用ADI ADALM2000和簡(jiǎn)單的開(kāi)源編程語(yǔ)言Python開(kāi)發(fā)所需的虛擬實(shí)驗(yàn)室儀器。通過(guò)Python與ADALM2000相結(jié)合,可以開(kāi)發(fā)多種虛擬實(shí)驗(yàn)室儀器,如示波器、信號(hào)發(fā)生器、數(shù)字萬(wàn)用表等。其中,示波器作為物理電子實(shí)驗(yàn)室中常用的基本儀器之一,是個(gè)不錯(cuò)的入門(mén)選擇,將在下文中重點(diǎn)討論。


什么是示波器?


示波器可用于常見(jiàn)電路和復(fù)雜電路的信號(hào)分析,是電子工程的重要組成部分。如今的示波器能夠與計(jì)算機(jī)連接,因此在示波器中捕獲的信號(hào)能夠以數(shù)字形式存儲(chǔ),供日后分析。


1658742784984133.jpg

圖1.示波器示意圖


示波器用于直觀呈現(xiàn)模擬或數(shù)字波形的電壓和時(shí)間特性。前面板控件(放大器觸發(fā)、掃描時(shí)間和顯示屏)用于調(diào)整顯示內(nèi)容,以更好地直觀呈現(xiàn)信號(hào)。


示波器可展示信號(hào)輸入在特定時(shí)間段內(nèi)的行為,這對(duì)于分析常見(jiàn)電路至關(guān)重要。此外,它有助于驗(yàn)證這些電路的功能。這也是示波器成為不可或缺的電子實(shí)驗(yàn)設(shè)備的主要原因。ADI允許工程師定制自己的示波器來(lái)滿足需求,從而可以改進(jìn)特定電子電路的分析。


ADALM2000是什么?


ADALM2000是主動(dòng)學(xué)習(xí)模塊,具有數(shù)字示波器、函數(shù)發(fā)生器、邏輯分析儀、電壓表、頻譜和數(shù)字總線分析儀,以及兩個(gè)可編程的電源。對(duì)于基礎(chǔ)用戶或?qū)W生,可以將Scopy與ADALM2000連接。對(duì)于應(yīng)用開(kāi)發(fā)人員,可使用libm2k庫(kù)開(kāi)發(fā)應(yīng)用接口。對(duì)于固件開(kāi)發(fā)人員,還可以選擇開(kāi)發(fā)能夠直接在ADALM2000上運(yùn)行的定制軟件或HDL。


開(kāi)始使用


安裝Python和PyCharm


Python是功能強(qiáng)大、簡(jiǎn)單易學(xué)的開(kāi)源編程語(yǔ)言。Python可從Python官方網(wǎng)站下載。如果不確定要使用哪個(gè)版本,請(qǐng)選擇Python 3.7。


Python可在沒(méi)有集成開(kāi)發(fā)環(huán)境(IDE)的情況下使用,但為了更輕松地下載庫(kù)和進(jìn)行調(diào)試,可以使用PyCharm。PyCharm是一個(gè)IDE,為開(kāi)發(fā)人員提供多個(gè)必需的工具,因而是用于Python開(kāi)發(fā)的熱門(mén)IDE。在JetBrains官方網(wǎng)站下載最新版PyCharm Community。


安裝庫(kù)


Python庫(kù)包含可用于特定應(yīng)用的方法或函數(shù)。在本文中,將使用libm2k、matplotlib和NumPy。


Libm2k


若要使用Python與ADALM2000交互,需要安裝libm2k庫(kù)。這是C++庫(kù),帶有可用于Python、C#、MATLAB?和LabVIEW?的綁定,具備以下功能:


   ○ AnalogIn用于示波器或電壓表。我們將重點(diǎn)介紹該功能。

   ○ AnalogOut用于信號(hào)發(fā)生器。

   ○ Digital用于邏輯分析儀或模式發(fā)生器。

   ○ PowerSupply用于恒壓發(fā)電機(jī)。

   ○ DMM用于數(shù)字萬(wàn)用表。


安裝Libm2k


安裝該庫(kù)的一種方法是按照以下步驟操作:


   ○ 轉(zhuǎn)到發(fā)布頁(yè)面。


■下載該庫(kù)的最新可執(zhí)行版本。示例:Libm2k-0.4.0-Windows-Setup.exe


   ○ 運(yùn)行可執(zhí)行文件。當(dāng)“設(shè)置”窗口提示選擇其他任務(wù)時(shí),請(qǐng)務(wù)必選擇安裝libm2k Python綁定。


2.jpg

圖2.Libm2k安裝窗口


   ○ 安裝結(jié)束。Libm2k將安裝在Python的默認(rèn)環(huán)境中。


Matplotlib


若要?jiǎng)?chuàng)建示波器顯示,您需要使用matplotlib庫(kù)。該庫(kù)備受歡迎且易于使用,用于在Python中定制和顯示可視化內(nèi)容。有關(guān)該庫(kù)的詳細(xì)信息,請(qǐng)?jiān)L問(wèn)matplotlib網(wǎng)站。


NumPy


簡(jiǎn)單的示波器仍將需要大量數(shù)學(xué)計(jì)算。NumPy庫(kù)可以為復(fù)雜的計(jì)算提供簡(jiǎn)單的函數(shù)。有關(guān)該庫(kù)的詳細(xì)信息,請(qǐng)?jiān)L問(wèn)NumPy網(wǎng)站。


安裝Matplotlib和NumPy


若要安裝matplotlib和NumPy,請(qǐng)?jiān)赑yCharm中按照以下步驟操作:


   ○ 轉(zhuǎn)到“文件”>“設(shè)置”>“項(xiàng)目解釋器”。

   ○ 點(diǎn)擊“設(shè)置”窗口右側(cè)的+圖標(biāo)。

   ○ 將出現(xiàn)“可用軟件包”窗口。在搜索框中,搜索matplotlib和NumPy。

   ○ 指定要安裝的版本(選擇最新版本)。

   ○ 點(diǎn)擊安裝軟件包按鈕。


1658742713343599.jpg

圖3.在PyCharm中安裝庫(kù)包


硬件設(shè)置


在開(kāi)始編碼前,我們先設(shè)置硬件組件。需要使用以下硬件組件:


   ○ 信號(hào)源(或信號(hào)發(fā)生器,如適用)

   ○ ADALM2000

   ○ 探頭和限幅器


如果信號(hào)發(fā)生器可用,請(qǐng)按照?qǐng)D4中顯示的配置,使用探頭和/或限幅器將ADALM2000設(shè)備連接到通道1和通道2。


1658742696233711.jpg

圖4.使用信號(hào)發(fā)生器和ADALM2000的實(shí)際設(shè)置


表1.引腳配置

5.png


對(duì)于其他可用的信號(hào)源,也可以遵循相同配置。最后,通過(guò)USB端口將ADALM2000設(shè)備連接到PC。


簡(jiǎn)單的虛擬示波器


在這一部分將逐個(gè)代碼塊介紹程序,還將討論代碼的作用,并說(shuō)明以這些方式編寫(xiě)代碼的原因。隨后的部分中將演示修改基礎(chǔ)代碼,以添加更多功能,從而滿足開(kāi)發(fā)人員用例要求。


首先,導(dǎo)入將用于開(kāi)發(fā)虛擬示波器的三個(gè)庫(kù)(libm2k、matplotlib和NumPy)。


6.jpg


統(tǒng)一資源標(biāo)識(shí)符(URI)是連接到PC的每個(gè)ADALM2000的唯一標(biāo)識(shí)符。該代碼塊確保ADALM2000連接到PC。如果沒(méi)有ADALM2000設(shè)備插入PC,代碼將自動(dòng)退出。


7.jpg


通過(guò)檢測(cè)到的URI連接到ADALM2000?!皍ri[0]”是在連接了多個(gè)設(shè)備的情況下檢測(cè)到的第一個(gè)ADALM2000設(shè)備的URI。


8.jpg


對(duì)ADC和DAC運(yùn)行校準(zhǔn)。這是確保獲得準(zhǔn)確測(cè)量的重要步驟。


9.jpg


設(shè)置采樣速率和時(shí)長(zhǎng)??捎貌蓸铀俾视? kHz、10 kHz、100 kHz、1 MHz、10 MHz和100 MHz。采樣速率是在1秒內(nèi)獲得樣本的次數(shù),時(shí)長(zhǎng)是獲得這些樣本的持續(xù)采樣時(shí)間。例如,如果將采樣速率設(shè)為1000,時(shí)長(zhǎng)設(shè)為3,那么每秒將獲得1000個(gè)樣本,并持續(xù)采樣3秒。因此,共有3000個(gè)樣本。


10.jpg


啟用并將通道1設(shè)置為示波器的模擬輸入。


1658742632445294.jpg


Linspace用于創(chuàng)建等間距的樣本陣列,并可使用該NumPy函數(shù)創(chuàng)建時(shí)間x軸數(shù)據(jù)陣列。該函數(shù)的第一和第二個(gè)參數(shù)分別表示陣列的起始和結(jié)束值。最后一個(gè)參數(shù)是希望在起始和結(jié)束值范圍內(nèi)生成的樣本數(shù)。


在該示例中,起始值是0,結(jié)束值是設(shè)置的時(shí)長(zhǎng),也就是3。對(duì)于樣本數(shù),將duration與sample_rate相乘,即可獲得所需的總樣本數(shù),也就是3000個(gè)樣本。這3000個(gè)樣本將


均勻放置在0和3之間。該數(shù)組將存儲(chǔ)在time_x中。


data_y存儲(chǔ)我們使用ADALM2000設(shè)備收集的波形樣本。通道1的樣本存儲(chǔ)在data_y[0]中,通道2的樣本存儲(chǔ)在data_y[1]中。為了顯示精確的波形頻率,必須使用與time_x相同的樣本數(shù)量。


12.jpg


創(chuàng)建將處理的圖形。plt.subplots函數(shù)將返回圖形對(duì)象(存儲(chǔ)在g中)和軸對(duì)象(存儲(chǔ)在ax中),這些對(duì)象將用于自定義整個(gè)圖形。


這里可以添加網(wǎng)格線,作為波形的參考坐標(biāo)。添加軸標(biāo)簽和y限制,以添加有關(guān)圖形的更多細(xì)節(jié)。


13.jpg


顯示圖形。


14.jpg


在代碼末尾銷(xiāo)毀上下文。


15.jpg


運(yùn)行代碼,將會(huì)看到類(lèi)似圖5的圖形。


16.jpg

圖5.單通道正弦波輸出;一個(gè)信號(hào)發(fā)生器輸出:10 Hz,2 V p-p


雙通道虛擬示波器

在這一部分,將使用上一部分中的代碼,并添加更多代碼塊,以創(chuàng)建雙通道虛擬示波器。


若要添加另一個(gè)通道,請(qǐng)復(fù)制ocsi.enableChannel和ocsi.setRange行代碼,并將第一個(gè)參數(shù)從


1658742559585018.jpg


在創(chuàng)建圖形時(shí),為通道2添加另一個(gè)圖形。通道2的數(shù)據(jù)在data_y[1]陣列中。也可以自定義兩個(gè)圖形的顏色,以便輕松區(qū)分二者。在該示例中,通道1使用淺珊瑚色,通道2使用鋼藍(lán)色。


18.jpg


運(yùn)行代碼,應(yīng)該會(huì)得到類(lèi)似圖6的結(jié)果。


19.jpg

圖6.雙通道正弦波輸出。通道1信號(hào)發(fā)生器輸出:10 Hz,2 V p-p;通道2信號(hào)發(fā)生器輸出:5 Hz,3 V p-p。


虛擬示波器的其他功能


在這一部分,將為虛擬示波器添加其他功能,以提升交互性。Matplotlib提供我們可以使用的多個(gè)小部件。在該示例中,將使用文本標(biāo)簽和滑塊小部件,并將繼續(xù)使用上一部分中的代碼。


為matplotlib滑塊添加另一次導(dǎo)入。


20.jpg


將時(shí)間和數(shù)據(jù)陣列轉(zhuǎn)換為NumPy陣列。在下一個(gè)代碼塊進(jìn)行的計(jì)算中,將使用這些陣列。


21.jpg


獲取所有波形數(shù)據(jù)后,提取這些波形的特性將不在話下。在以下代碼塊中,從獲取的兩個(gè)通道的數(shù)據(jù)中提取了Vpp、Vave和Vrms。要計(jì)算Vpp,將data_y numpy陣列中找到的最大值和最小值的絕對(duì)值相加。要計(jì)算Vave,只需用Vpp除以pi。要計(jì)算Vrms,用Vpp除以2乘以√2。


22.jpg


該代碼塊與前面部分類(lèi)似。唯一的區(qū)別是,為圖形使用NumPy陣列,而不是使用原始陣列。同時(shí)還根據(jù)圖形創(chuàng)建了波形對(duì)象。稍后將使用這些對(duì)象。


23.jpg


為了在圖形中顯示計(jì)算的Vpp、Vave和Vrms,將利用matplotlib庫(kù)中的文本標(biāo)簽小部件。創(chuàng)建字符串標(biāo)簽label_ch1和label_ch2,然后連接這兩個(gè)字符串,以創(chuàng)建最終標(biāo)簽n_label。通過(guò)使用plt.text創(chuàng)建文本標(biāo)簽。第一和第二個(gè)參數(shù)(0.2, 3)是文本的x和y位置。第三個(gè)參數(shù)是要顯示的字符串。第四和第五個(gè)參數(shù)分別是文本和框的樣式。


1658742501945304.jpg


接下來(lái),創(chuàng)建偏移滑塊。該滑塊用于調(diào)整波形的參考電平。將主圖形向左調(diào)整,為滑塊留出空間。plt.axes定義滑塊的尺寸、位置和表面顏色。Slider函數(shù)用于為偏移滑塊創(chuàng)建具有特定特性的對(duì)象。


25.jpg


創(chuàng)建update_offset函數(shù),并將其注冊(cè)到offset_slider對(duì)象。每次更改滑塊的值時(shí),該函數(shù)都會(huì)向波形添加偏移量。


26.jpg


運(yùn)行代碼,將會(huì)看到類(lèi)似圖7的圖形。


27.jpg

圖7.帶偏移滑塊的默認(rèn)雙通道正弦波輸出


嘗試使用滑塊調(diào)整偏移量。將會(huì)看到波形實(shí)時(shí)上下移動(dòng)。


1658742462750569.jpg

圖8.調(diào)整偏移量滑塊(向左滑動(dòng)),用于調(diào)整兩個(gè)通道輸出的偏移量


總結(jié)


本文解釋了擁有虛擬電子實(shí)驗(yàn)室的重要性和便利性。文中還演示了如何使用ADALM2000和Python開(kāi)發(fā)虛擬示波器。討論了軟件要求和硬件設(shè)置,并提供了3個(gè)示例供參考。


關(guān)于ADI公司


ADI是全球領(lǐng)先的高性能模擬技術(shù)公司,致力于解決最艱巨的工程設(shè)計(jì)挑戰(zhàn)。憑借杰出的檢測(cè)、測(cè)量、電源、連接和解譯技術(shù),搭建連接現(xiàn)實(shí)世界和數(shù)字世界的智能化橋梁,從而幫助客戶重新認(rèn)識(shí)周?chē)氖澜?。詳情?qǐng)瀏覽ADI官網(wǎng)www.analog.com/cn。


關(guān)于作者


Arnie Mae Baes于2019年12月加入ADI公司,擔(dān)任固件工程師。在進(jìn)入公司的第一年,她重點(diǎn)負(fù)責(zé)GUI和固件開(kāi)發(fā)。2020年12月,她加入消費(fèi)電子軟件工程部門(mén),現(xiàn)在重點(diǎn)負(fù)責(zé)固件測(cè)試開(kāi)發(fā)。她畢業(yè)于菲律賓八打雁國(guó)立大學(xué),獲電子工程學(xué)士學(xué)位。聯(lián)系方式:arniemae.baes@analog.com。


Christian Jason Garcia是ADI公司的一名固件驗(yàn)證工程師,工作地點(diǎn)在菲律賓垂亞斯將軍城。他擁有圣托馬斯大學(xué)電子和通信工程學(xué)士學(xué)位,于2018年11月加入ADI公司。他在電動(dòng)交通部門(mén)專(zhuān)門(mén)負(fù)責(zé)SmartMesh網(wǎng)絡(luò)的軟件測(cè)試和系統(tǒng)驗(yàn)證。聯(lián)系方式:christian.garcia@analog.com。


作者:ADI軟件系統(tǒng)工程師Christian Jason Garcia & Arnie Mae Baes



免責(zé)聲明:本文為轉(zhuǎn)載文章,轉(zhuǎn)載此文目的在于傳遞更多信息,版權(quán)歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權(quán)問(wèn)題,請(qǐng)聯(lián)系小編進(jìn)行處理。


推薦閱讀:


TDK如何助力于無(wú)線耳機(jī)音質(zhì)的不斷發(fā)展?

完整教程:設(shè)計(jì)一款小巧但強(qiáng)大的傳感器

深度解讀鎖存器和開(kāi)關(guān)技術(shù)及其應(yīng)用

如何加速USB快充電池充電器設(shè)計(jì)

實(shí)現(xiàn)小型化電源設(shè)計(jì)的4個(gè)小技巧

特別推薦
技術(shù)文章更多>>
技術(shù)白皮書(shū)下載更多>>
熱門(mén)搜索
?

關(guān)閉

?

關(guān)閉