胡險峰
(四川大學 物理科學與技術學院,四川 成都 610064)
?
基于USBee DX數(shù)據(jù)采樣和LabVIEW編程的虛擬示波器
胡險峰
(四川大學 物理科學與技術學院,四川 成都 610064)
摘要:介紹了用LabVIEW軟件對USBee DX數(shù)據(jù)采集器編程的方法,LabVIEW通過執(zhí)行系統(tǒng)命令模塊調(diào)用C可執(zhí)行程序,實現(xiàn)USBee DX的控制和采集數(shù)據(jù)與LabVIEW程序間傳遞,實現(xiàn)用計算機模擬虛擬雙蹤示波器.
關鍵詞:數(shù)據(jù)采集;虛擬示波器;LabVIEW;USBee DX
利用數(shù)據(jù)采集卡或聲卡,編制程序在微機上模擬示波器[1-7],可用于各種物理實驗. 廉價的數(shù)據(jù)采集卡或聲卡,由于數(shù)據(jù)采集速度較低,虛擬的示波器帶寬小,不能滿足信號頻率較高的場合. USBee DX數(shù)據(jù)采集器使用USB接口,采樣速率可達24 MB/s,價格便宜,有多個數(shù)字模入和模出通道,主要用于虛擬邏輯分析器;還有2個獨立的8位AD模入通道可用于虛擬示波器. 用USBee DX數(shù)據(jù)采集器使用手冊[8]介紹的API函數(shù)編寫LabVIEW庫函數(shù)節(jié)點調(diào)用不成功,則利用USBee DX數(shù)據(jù)采集器安裝程序提供的工具創(chuàng)建器的C原程序,修改創(chuàng)建兩通道AD變換可執(zhí)行程序,通過LabVIEW執(zhí)行系統(tǒng)命令模塊調(diào)用該可執(zhí)行程序,將USBee DX采集到的數(shù)據(jù)通過執(zhí)行系統(tǒng)命令模塊的標準輸出傳遞到LabVIEW程序中. 用For循環(huán)、字符截取模塊和字符數(shù)據(jù)轉換模塊重新組織數(shù)據(jù)隊列,再從數(shù)據(jù)隊列中拆分出數(shù)字通道信號和2個AD模入通道信號. 利用LabVIEW編程進行后續(xù)的信號處理做成虛擬示波器.
1兩通道AD變換可執(zhí)行程序
USBee DX數(shù)據(jù)采集器安裝程序提供的工具創(chuàng)建器的C原程序[8],包含初始化功能、基本I/O功能、邏輯分析器及示波器和信號發(fā)生器等幾個程序段,刪除其中基本I/O功能和信號發(fā)生器等幾段,保留初始化功能和邏輯分析器及示波器兩段. USBee DX的采樣速率隨應用程序的運行環(huán)境需要做相應調(diào)整,不然采樣速率過高采樣會失敗,需要自動回調(diào)過高的采樣速率. 添加采樣速率自動調(diào)整,以及與LabVIEW程序通過讀寫文本文件交換采樣通道、采樣速率、采樣長度、數(shù)據(jù)傳遞長度、數(shù)據(jù)傳遞間隔和3個觸發(fā)控制數(shù)據(jù)的程序段,編譯后生成可執(zhí)行程序供LabVIEW通過執(zhí)行系統(tǒng)命令模塊調(diào)用. 修改后的原程序如下,其中斜體部分為添加或修改的語句.
#include “stdio.h”
#include “conio.h”
#include “windows.h”
#define CWAV_API __stdcall
#define CWAV_IMPORT __declspec(dllimport)
CWAV_IMPORT unsigned long * CWAV_API MakeBuffer(unsigned long Size);
CWAV_IMPORT int CWAV_API DeleteBuffer(unsigned long *buffer);
CWAV_IMPORT int CWAV_API EnumerateDXPods(unsigned int *Pods);
CWAV_IMPORT int CWAV_API InitializeDXPod(unsigned int PodNumber);
CWAV_IMPORT int CWAV_API StartCapture(unsigned int Channels, unsigned int Slope, unsigned int AnalogChannel, unsigned int Level,unsigned int SampleRate, unsigned int ClockMode, unsigned long *Triggers, signed int TriggerNumber, unsigned long *buffer, unsigned long length, unsigned long poststore);
CWAV_IMPORT int CWAV_API CaptureStatus(char *breaks, char *running, char *triggered, long *start, long *end, long *trigger, char *full);
CWAV_IMPORT int CWAV_API StopCapture(void);
int main()
{unsigned int PodNumber, PodID[10], NumberOfPods;
int ReturnVal;
NumberOfPods = EnumerateDXPods(PodID);
if (NumberOfPods == 0) {
printf(“No USBee DX Pods found ”);
return 0;
}
PodNumber = PodID[0];
ReturnVal = InitializeDXPod(PodNumber);
if (ReturnVal != 1) {
printf(“Failure Initializing the Pod ”);
return 0;
}
unsignedlongx,y,z;
unsignedlonglabview[8];
FILE*fp;
fp=fopen(“C:\ProgramFiles\USBeeDxLabViewOSC\data\labview.txt”,“r+”);
y=8
for(x= 0;x {fscanf(fp, “%d”, &labview[x]); } long Channels =labview[0]; unsigned char Slope =labview[1]; unsigned char AnalogTriggerChannel =labview[2]; unsigned char Level =labview[3]; unsigned char Rate =labview[4]; unsigned char ClockMode = 2; unsigned long Triggers[2]; Triggers[0]= 0;. Triggers[1]= 0; char NumberOfTriggers = 1; long SampleBufferLength =labview[5]* 65536; unsigned long *SampleBuffer; *SampleBuffer =MakeBuffer(SampleBufferLength); long PostStore = SampleBufferLength; char Breaks, Running, Triggered, Full; long Start, End, Trigger; SR: ReturnVal = StartCapture(Channels, Slope, AnalogTriggerChannel, Level, Rate, ClockMode, Triggers, NumberOfTriggers, SampleBuffer, SampleBufferLength, PostStore); if (ReturnVal != 1) { printf(“Failure Starting Capture
”); return 0; } do { Sleep(50); ReturnVal = CaptureStatus(&Breaks, &Running, &Triggered, &Start, &End, &Trigger, &Full); if (Running && (Breaks != 0)) { break; } } while (Running && (Breaks == 0)); StopCapture(); if(Breaks==0) {gotoI;} if(Rate==247) {Rate=167;gotoSR;} if(Rate==167) {Rate=127;gotoSR;} if(Rate==127) {Rate=87;gotoSR;} if(Rate==87) {Rate=67;gotoSR;} if(Rate==67) {Rate=47;gotoSR;} if(Rate==47) {Rate=37;gotoSR;} if(Rate==37) {Rate=27;gotoSR;} if(Rate==27) {Rate=17;gotoSR;} I:y=labview[6]; z=labview[7]; for(x= 0;x {printf(“%8x”,SampleBuffer[x]); } DeleteBuffer(SampleBuffer); return Rate; } 由于USBee DX提供的API函數(shù)允許的最小采樣速率為1 MB/s,最小采樣長度為65 536. 當信號頻率低時,要測量到幾個周期的信號,要增大采樣時間,則采樣長度太長,用printf方式和LabVIEW通過執(zhí)行系統(tǒng)命令模塊調(diào)用,來傳遞數(shù)據(jù)的時間太長,程序運行速度很慢. 對于低頻信號,C可執(zhí)行程序按最低采樣速率1 MB/s采樣,盡管采樣長度會到數(shù)倍或幾十倍最小采樣長度,由于采樣速率高耗時還可以接受. 在數(shù)據(jù)傳遞時增大步長,即數(shù)據(jù)間隔,虛擬地調(diào)整采樣速率,可以減少數(shù)據(jù)傳遞量,縮短數(shù)據(jù)傳遞時間. 在LabVIEW程序中相應調(diào)大繪圖點的時間間隔,以保持繪圖和采樣的總時長一致. 2LabVIEW程序 LabVIEW程序外層為兩級平鋪式順序結構,第一級是打開與C可執(zhí)行程序交換數(shù)據(jù)的文本文件,并初始化運行參量;第二級中嵌入一個While循環(huán),其中又嵌入兩級平鋪式順序結構,這個平鋪式順序結構的第一級為虛擬示波器主程序,第二級則向文本文件寫入采樣速率和采樣長度等參量. 虛擬示波器主程序如圖1所示,其中t_Scale條件語句框根據(jù)示波器掃描時基,設定USBee DX的采樣速率、采樣長度、數(shù)據(jù)傳遞長度和傳遞間隔,與通道選擇和觸發(fā)控制參量組成8個字符串的隊列寫入文本文件LabVIEW.txt中,C可執(zhí)行程序讀該文件取得這些參量. 改變掃描時基也就是改變繪圖模塊橫向標尺的時間長度,而繪圖窗體長度不變,則要改變繪圖模塊的Δt,即繪圖點之間的間隔. 若選擇固定的基本標尺時間長度,掃描時基增大,Δt的值相應減小. 例如標尺長度T,分度10格,則時基為0.1T/div,若采樣速率為SR,1個標尺長度時間里采樣點數(shù)為TSR,數(shù)據(jù)點時間間隔等于1/SR,取Δt=1/SR,在標尺長度內(nèi)可繪完全部采樣點. 若增加采樣點數(shù)為2TSR,數(shù)據(jù)點時間間隔仍為1/SR,而標尺長度變?yōu)?T,時基為0.2T/div,標尺長度增大1倍,保持繪圖窗體不變,要縮小繪圖點之間的間隔Δt,取Δt=1/2SR,仍然可以在1個標尺長度T內(nèi)繪完全部采樣點,繪圖窗體不變,總時長還是2T,時基還是0.2T/div. 若數(shù)據(jù)傳遞間隔Δτ大于采樣間隔1/SR,則傳遞的數(shù)據(jù)點數(shù)為2TSR/Δτ,則繪圖間隔要調(diào)整為Δt=Δτ/2SR,則保持繪圖窗體不變. 也可以選擇繪圖窗體的時間長度隨掃描時基增大,則繪圖模塊的Δt也要隨之增大,相應的游標位置也要隨之變化. 由于觸發(fā)控制模塊Trigger在篩選滿足觸發(fā)條件的數(shù)據(jù)點時,會篩除數(shù)據(jù)隊列前面不滿足觸發(fā)條件的部分數(shù)據(jù),實際傳遞數(shù)據(jù)的時間長度要大于繪圖數(shù)據(jù)的時間長度,選擇采樣的時間長度是繪圖的時間長度的2倍. 圖1 虛擬示波器主程序 經(jīng)1個For 循環(huán)語句框,將C可執(zhí)行程序傳遞的16進制字符串重新分割成8個字符1組,即4 Bytes 1組的數(shù)據(jù)隊列,其中低16位為16個數(shù)字通道的信號,高16位為2個模擬通道信號,這其中低8位為1號模擬通道信號,高8位為2號模擬通道信號. 用字符截取模塊和字符數(shù)據(jù)轉換模塊重新組織數(shù)據(jù)隊列,再經(jīng)拆分數(shù)字模塊,從數(shù)據(jù)隊列中拆分出數(shù)字通道信號和2個AD模入通道信號. 再按采樣的電壓分辨率換算成電壓值后,經(jīng)過Trigger模塊后進行增益控制和垂直位移控制. 最后用捆綁模塊將數(shù)據(jù)隊列和時基數(shù)據(jù)捆綁成信號簇送波形圖模塊顯示信號波形. 數(shù)據(jù)隊列變換成動態(tài)數(shù)據(jù)送單頻測量模塊和幅值電平測量模塊,測量顯示信號的頻率和峰-峰值. 按照USBee DX使用手冊[8]介紹的數(shù)字和模擬信號采集函數(shù)StartCapture編寫USBee DX采集卡采樣觸發(fā)控制參量,生成的C可執(zhí)行程序沒有觸發(fā)控制功能. 觸發(fā)控制由LabVIEW程序實現(xiàn),虛擬示波器主程序中觸發(fā)控制模塊Trigger,虛擬示波器觸發(fā)同步功能,改編自LabVIEW資源庫中數(shù)字虛擬示波器示例,將其中的觸發(fā)同步程序創(chuàng)建成新的IV子模塊,取名“Trigger”模塊,該模塊可以選擇觸發(fā)源、觸發(fā)電平和觸發(fā)極性. 主程序框左側中下部分的程序用于控制4個分別綁定在信號曲線上的游標,通過控制和讀取波形圖模塊的游標屬性,決定游標是否可見,以及顯示游標之間的差值. 虛擬示波器前面板見圖2,時基和增益調(diào)節(jié)分度均按傳統(tǒng)示波器分度值設置,手動調(diào)節(jié)縮放. 起用波形圖模塊的游標功能,還可以拖動游標線測量信號的電壓差和時間差. 主程序包含自動測量2個通道信號的峰-峰值和頻率的功能,在前面板上自動顯示信號的峰-峰值和頻率. 圖2 程序運行前面板 在Windows XP SP3系統(tǒng)下,Tualatin Celeron 1.2 GHz CPU,Geforce4 MX 440 顯卡,768 MB SDROM 內(nèi)存的老舊計算機可以充當一臺雙蹤示波器用,采樣率最大可達到6 MB/s;若選擇單蹤顯示,采樣率最大可達到12 MB/s. 最高測量到頻率約600 kHz或1.2 MHz的信號,這時波形略微有些失真. 從C可執(zhí)行程序向LabVIEW程序傳遞數(shù)據(jù)的速率大約50 kB/s. 信號頻率低到幾十Hz,信號刷新速度也還可以接受. 當時基為1 s/div擋,信號波形刷新時間約24 s,要測量幾Hz的信號,波形刷新過慢. 虛擬的示波器適合在幾十Hz到幾百kHz使用. 3結束語 USBee DX數(shù)據(jù)采集器的價格比市面上的一些USB接口或PCI接口的AD卡要低,而采樣速率要高得多. 雖然,該AD卡提供的API函數(shù)不支持LabVIEW的庫函數(shù)節(jié)點調(diào)用,不便于結合LabVIEW強大的信號處理分析功能. 通過LabVIEW調(diào)用可執(zhí)行程序功能,可以實現(xiàn)USBee DX采樣數(shù)據(jù)與LabVIEW程序對接,發(fā)揮USBee DX數(shù)據(jù)采集器的價格低、采樣速率高、LabVIEW信號處理分析功能強的優(yōu)勢. 盡管該AD口只有8位的采樣分辨率,輸入范圍-10~10 V,電壓分辨率僅有約78 mV, 配上10∶1的測量筆,對幾V到幾十V的電壓信號,這個電壓分辨率已經(jīng)夠用. 對于信號幅度為幾V的調(diào)相信號,如外腔調(diào)制激光二極管自混合干涉信號,可以進一步設計成傅里葉分量提取、解調(diào)和信息分析的虛擬儀器,解調(diào)出來的位移信號可達到與12位AD卡相同的位移分辨率. 參考文獻: [1]胡險峰. 用微機觀測交流磁滯回線[J]. 物理實驗,1997,17(1):19-20,18. [2]冷國華. 電腦示波器[J]. 物理實驗,2004,24(3):28-30. [3]戴新宇,王群,閆長春. 基于虛擬示波器動態(tài)判別溶液濃度[J]. 物理實驗,2004,24(6):44-46. [4]胡險峰,朱世國. 激光二極管反饋干涉的實驗觀測[J]. 物理實驗,2006,26(3):3-7,15. [5]余觀夏,王軍,阮錫根. 基于聲卡和LabVIEW測量金屬的動態(tài)楊氏模量[J]. 物理實驗,2007,27(8):6-9. [6]陳東生,熊慧萍,王瑩. 以虛擬儀器為平臺的聲學實驗[J]. 物理實驗,2008,28(2):26-29. [7]陳映純,吳先球. 基于虛擬儀器的楊氏模量實驗中共振頻率的測量[J]. 物理實驗,2012,32(5):40-41,45. [8]CWAV. USBee DX Test Pod User’s Manual [DB/OL]. 2008. www.usbee.com. [責任編輯:尹冬梅] 收稿日期:2016-02-22;修改日期:2016-03-04 作者簡介:胡險峰(1962-),男,江西玉山人,四川大學物理科學與技術學院副教授,碩士,主要從事基礎物理實驗教學. 中圖分類號:TM935.37 文獻標識碼:A 文章編號:1005-4642(2016)07-0012-05 Virtual oscilloscope based on USBee DX data sampling and LabVIEW programming HU Xian-feng (Physics College, Sichuan University, Chengdu 610064, China) Abstract:A programming method of USBee DX data acquisition with LabVIEW software was introduced. LabVIEW program called a C executable program by the System Exec.vi, to realize the exchange of control and sample data between USBee DX and LabVIEW. A double trace oscilloscope was virtualized. Key words:data acquisition; virtual oscilloscope; LabVIEW; USBee DX