胡险峰
(四川大学 物理科学与技术学院,四川 成都 610064)
基于USBee DX数据采样和LabVIEW编程的虚拟示波器
胡险峰
(四川大学 物理科学与技术学院,四川 成都 610064)
摘要:介绍了用LabVIEW软件对USBee DX数据采集器编程的方法,LabVIEW通过执行系统命令模块调用C可执行程序,实现USBee DX的控制和采集数据与LabVIEW程序间传递,实现用计算机模拟虚拟双踪示波器.
关键词:数据采集;虚拟示波器;LabVIEW;USBee DX
利用数据采集卡或声卡,编制程序在微机上模拟示波器[1-7],可用于各种物理实验. 廉价的数据采集卡或声卡,由于数据采集速度较低,虚拟的示波器带宽小,不能满足信号频率较高的场合. USBee DX数据采集器使用USB接口,采样速率可达24 MB/s,价格便宜,有多个数字模入和模出通道,主要用于虚拟逻辑分析器;还有2个独立的8位AD模入通道可用于虚拟示波器. 用USBee DX数据采集器使用手册[8]介绍的API函数编写LabVIEW库函数节点调用不成功,则利用USBee DX数据采集器安装程序提供的工具创建器的C原程序,修改创建两通道AD变换可执行程序,通过LabVIEW执行系统命令模块调用该可执行程序,将USBee DX采集到的数据通过执行系统命令模块的标准输出传递到LabVIEW程序中. 用For循环、字符截取模块和字符数据转换模块重新组织数据队列,再从数据队列中拆分出数字通道信号和2个AD模入通道信号. 利用LabVIEW编程进行后续的信号处理做成虚拟示波器.
1两通道AD变换可执行程序
USBee DX数据采集器安装程序提供的工具创建器的C原程序[8],包含初始化功能、基本I/O功能、逻辑分析器及示波器和信号发生器等几个程序段,删除其中基本I/O功能和信号发生器等几段,保留初始化功能和逻辑分析器及示波器两段. USBee DX的采样速率随应用程序的运行环境需要做相应调整,不然采样速率过高采样会失败,需要自动回调过高的采样速率. 添加采样速率自动调整,以及与LabVIEW程序通过读写文本文件交换采样通道、采样速率、采样长度、数据传递长度、数据传递间隔和3个触发控制数据的程序段,编译后生成可执行程序供LabVIEW通过执行系统命令模块调用. 修改后的原程序如下,其中斜体部分为添加或修改的语句.
#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函数允许的最小采样速率为1 MB/s,最小采样长度为65 536. 当信号频率低时,要测量到几个周期的信号,要增大采样时间,则采样长度太长,用printf方式和LabVIEW通过执行系统命令模块调用,来传递数据的时间太长,程序运行速度很慢. 对于低频信号,C可执行程序按最低采样速率1 MB/s采样,尽管采样长度会到数倍或几十倍最小采样长度,由于采样速率高耗时还可以接受. 在数据传递时增大步长,即数据间隔,虚拟地调整采样速率,可以减少数据传递量,缩短数据传递时间. 在LabVIEW程序中相应调大绘图点的时间间隔,以保持绘图和采样的总时长一致. 2LabVIEW程序 LabVIEW程序外层为两级平铺式顺序结构,第一级是打开与C可执行程序交换数据的文本文件,并初始化运行参量;第二级中嵌入一个While循环,其中又嵌入两级平铺式顺序结构,这个平铺式顺序结构的第一级为虚拟示波器主程序,第二级则向文本文件写入采样速率和采样长度等参量. 虚拟示波器主程序如图1所示,其中t_Scale条件语句框根据示波器扫描时基,设定USBee DX的采样速率、采样长度、数据传递长度和传递间隔,与通道选择和触发控制参量组成8个字符串的队列写入文本文件LabVIEW.txt中,C可执行程序读该文件取得这些参量. 改变扫描时基也就是改变绘图模块横向标尺的时间长度,而绘图窗体长度不变,则要改变绘图模块的Δt,即绘图点之间的间隔. 若选择固定的基本标尺时间长度,扫描时基增大,Δt的值相应减小. 例如标尺长度T,分度10格,则时基为0.1T/div,若采样速率为SR,1个标尺长度时间里采样点数为TSR,数据点时间间隔等于1/SR,取Δt=1/SR,在标尺长度内可绘完全部采样点. 若增加采样点数为2TSR,数据点时间间隔仍为1/SR,而标尺长度变为2T,时基为0.2T/div,标尺长度增大1倍,保持绘图窗体不变,要缩小绘图点之间的间隔Δt,取Δt=1/2SR,仍然可以在1个标尺长度T内绘完全部采样点,绘图窗体不变,总时长还是2T,时基还是0.2T/div. 若数据传递间隔Δτ大于采样间隔1/SR,则传递的数据点数为2TSR/Δτ,则绘图间隔要调整为Δt=Δτ/2SR,则保持绘图窗体不变. 也可以选择绘图窗体的时间长度随扫描时基增大,则绘图模块的Δt也要随之增大,相应的游标位置也要随之变化. 由于触发控制模块Trigger在筛选满足触发条件的数据点时,会筛除数据队列前面不满足触发条件的部分数据,实际传递数据的时间长度要大于绘图数据的时间长度,选择采样的时间长度是绘图的时间长度的2倍. 图1 虚拟示波器主程序 经1个For 循环语句框,将C可执行程序传递的16进制字符串重新分割成8个字符1组,即4 Bytes 1组的数据队列,其中低16位为16个数字通道的信号,高16位为2个模拟通道信号,这其中低8位为1号模拟通道信号,高8位为2号模拟通道信号. 用字符截取模块和字符数据转换模块重新组织数据队列,再经拆分数字模块,从数据队列中拆分出数字通道信号和2个AD模入通道信号. 再按采样的电压分辨率换算成电压值后,经过Trigger模块后进行增益控制和垂直位移控制. 最后用捆绑模块将数据队列和时基数据捆绑成信号簇送波形图模块显示信号波形. 数据队列变换成动态数据送单频测量模块和幅值电平测量模块,测量显示信号的频率和峰-峰值. 按照USBee DX使用手册[8]介绍的数字和模拟信号采集函数StartCapture编写USBee DX采集卡采样触发控制参量,生成的C可执行程序没有触发控制功能. 触发控制由LabVIEW程序实现,虚拟示波器主程序中触发控制模块Trigger,虚拟示波器触发同步功能,改编自LabVIEW资源库中数字虚拟示波器示例,将其中的触发同步程序创建成新的IV子模块,取名“Trigger”模块,该模块可以选择触发源、触发电平和触发极性. 主程序框左侧中下部分的程序用于控制4个分别绑定在信号曲线上的游标,通过控制和读取波形图模块的游标属性,决定游标是否可见,以及显示游标之间的差值. 虚拟示波器前面板见图2,时基和增益调节分度均按传统示波器分度值设置,手动调节缩放. 起用波形图模块的游标功能,还可以拖动游标线测量信号的电压差和时间差. 主程序包含自动测量2个通道信号的峰-峰值和频率的功能,在前面板上自动显示信号的峰-峰值和频率. 图2 程序运行前面板 在Windows XP SP3系统下,Tualatin Celeron 1.2 GHz CPU,Geforce4 MX 440 显卡,768 MB SDROM 内存的老旧计算机可以充当一台双踪示波器用,采样率最大可达到6 MB/s;若选择单踪显示,采样率最大可达到12 MB/s. 最高测量到频率约600 kHz或1.2 MHz的信号,这时波形略微有些失真. 从C可执行程序向LabVIEW程序传递数据的速率大约50 kB/s. 信号频率低到几十Hz,信号刷新速度也还可以接受. 当时基为1 s/div挡,信号波形刷新时间约24 s,要测量几Hz的信号,波形刷新过慢. 虚拟的示波器适合在几十Hz到几百kHz使用. 3结束语 USBee DX数据采集器的价格比市面上的一些USB接口或PCI接口的AD卡要低,而采样速率要高得多. 虽然,该AD卡提供的API函数不支持LabVIEW的库函数节点调用,不便于结合LabVIEW强大的信号处理分析功能. 通过LabVIEW调用可执行程序功能,可以实现USBee DX采样数据与LabVIEW程序对接,发挥USBee DX数据采集器的价格低、采样速率高、LabVIEW信号处理分析功能强的优势. 尽管该AD口只有8位的采样分辨率,输入范围-10~10 V,电压分辨率仅有约78 mV, 配上10∶1的测量笔,对几V到几十V的电压信号,这个电压分辨率已经够用. 对于信号幅度为几V的调相信号,如外腔调制激光二极管自混合干涉信号,可以进一步设计成傅里叶分量提取、解调和信息分析的虚拟仪器,解调出来的位移信号可达到与12位AD卡相同的位移分辨率. 参考文献: [1]胡险峰. 用微机观测交流磁滞回线[J]. 物理实验,1997,17(1):19-20,18. [2]冷国华. 电脑示波器[J]. 物理实验,2004,24(3):28-30. [3]戴新宇,王群,闫长春. 基于虚拟示波器动态判别溶液浓度[J]. 物理实验,2004,24(6):44-46. [4]胡险峰,朱世国. 激光二极管反馈干涉的实验观测[J]. 物理实验,2006,26(3):3-7,15. [5]余观夏,王军,阮锡根. 基于声卡和LabVIEW测量金属的动态杨氏模量[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