国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于USBee DX數(shù)據(jù)采樣和LabVIEW編程的虛擬示波器

2016-08-04 01:52胡險峰
物理實驗 2016年7期
關鍵詞:數(shù)據(jù)采集

胡險峰

(四川大學 物理科學與技術學院,四川 成都 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

猜你喜歡
數(shù)據(jù)采集
Web網(wǎng)絡大數(shù)據(jù)分類系統(tǒng)的設計與改進
CAN總線通信技術在電梯監(jiān)控系統(tǒng)中的應用
基于大型嵌入式系統(tǒng)的污水檢測系統(tǒng)設計
基于AVR單片機的SPI接口設計與實現(xiàn)
CS5463在植栽用電子鎮(zhèn)流器老化監(jiān)控系統(tǒng)中的應用
大數(shù)據(jù)時代高校數(shù)據(jù)管理的思考
基于廣播模式的數(shù)據(jù)實時采集與處理系統(tǒng)
通用Web表單數(shù)據(jù)采集系統(tǒng)的設計與實現(xiàn)
基于開源系統(tǒng)的綜合業(yè)務數(shù)據(jù)采集系統(tǒng)的開發(fā)研究
大數(shù)據(jù)時代的管理會計
辽源市| 怀远县| 许昌县| 南安市| 金平| 岳阳市| 出国| 合山市| 辽阳市| 苗栗市| 伊川县| 太保市| 喀喇沁旗| 吉水县| 华容县| 澄迈县| 咸宁市| 长垣县| 凌海市| 修水县| 巴彦淖尔市| 沾益县| 荔波县| 团风县| 军事| 鱼台县| 巩留县| 宜丰县| 昭苏县| 平湖市| 宜章县| 韩城市| 江阴市| 沂南县| 永昌县| 望江县| 涟源市| 宁远县| 虞城县| 黎川县| 太仆寺旗|