示波器型号:北京普源的RIGOL MSO4034
首先连接示波器:
连接线与示波器相连的端口如上图USB DEVICE所示,是一个比较奇怪的方形接口。连接线的另一端是标准的USB typeA接口,可以直接插在电脑上,当示波器和电脑连接时,电脑会提示安装驱动。
该型号示波器端口是业界通用的标准驱动VISA设计,可以使用SCPI命令控制。
首先下载NI的Ultra Sigma软件,安装,启动。下载链接:https://pan.baidu.com/s/1K8u5ZoB2D31aix76tGqZcg
提取码:ngr7
如果和示波器的连接正常,就如下图显示:
可以打印当前示波器屏幕。右键型号,操作,打印,步骤如下图所示:
打印出来的是个bmp图片,存在电脑的硬盘中。
在打印步骤的菜单中,选择复制地址“Copy address”,可以把仪器的地址复制到剪切板中,例如我的示波器地址为:USB0::0x1AB1::0x04B1::DS4C193400320::INSTR
用matlab编写程序,通过发送SCPI命令控制示波器,具体的编程手册可以在普源官网找到,这里就简单的读取数据并做个FFT吧。
clear all
%创建设备。第一个参数为销售商参数,可以为agilent、NI或tek,第二个参数为资源描述符。创建后需要设置设备的属性,本例中设置输入缓存的长度为2048。
mso4000 = visa( 'NI','USB0::0x1AB1::0x04B1::DS4C193400320::INSTR' );
mso4000.InputBufferSize = 2048;
%打开设备。
fopen( mso4000 );
%请求数据。
% fprintf(mso4000, ':WAVeform:POINts?');%查询采样总点数
% [data1,len1]= fread( mso4000, 2048 );%返回的是1400的ascii码
fprintf(mso4000, ':WAVeform:DATA?');
[data,len]= fread( mso4000, 2048 );
fprintf(mso4000, ':WAVeform:XINCrement?');%查询时间刻度
[taudata,~]= fread( mso4000, 2048 );
tau=str2double(char(taudata)');%字节转换成数字
fprintf(mso4000, ':WAVeform:YINCrement?');%查询电压刻度
[Vscaledata,~]= fread( mso4000, 2048 );
Vscale=str2double(char(Vscaledata)');%字节转换成数字
fprintf(mso4000, ':WAVeform:YREFerence?');%查询电压参考线位置
[Vrefdata,~]= fread( mso4000, 2048 );
Vref=str2double(char(Vrefdata)');%字节转换成数字
fprintf(mso4000, ':WAVeform:YORigin?');%查询电压偏移
[Vbiasdata,~]= fread( mso4000, 2048 );
Vbias=str2double(char(Vbiasdata)');%字节转换成数字
%关闭设备。
fclose( mso4000 );
delete(mso4000);
clear mso4000;
%数据处理。读取的波形数据含有TMC头,对于MSO4000/DS4000/DS6000其长度为11个字节,其中前2个字节分别为TMC头标志符#和宽度描述符9,接着的9个字节为数据长度,然后是波形数据,最后一个字节为结束符0x0A。所以,读取的有效波形数据点为12到倒数第2个点。
wave = data(12:len-1);
wave = wave';
wave=wave-Vref-Vbias;%减去参考线的位置再减去偏移
wave=wave.*Vscale;%幅度乘以电压刻度
wavelen=length(wave);
t=0:tau:(wavelen-1)*tau;
subplot(211);
plot( t,wave );
title("示波器上的数据")
xlabel("时刻/s")
ylabel("电压/v")
grid on
fs=1/tau;%采样速率
f=(0:wavelen-1)*fs/wavelen; %真实频率
X=abs(fft(wave));
subplot(212);
plot(f(1:wavelen/2),X(1:wavelen/2)*2/wavelen);%单边频谱
xlabel("f/Hz")
ylabel("幅度")
xlim([-fs/20,fs/2])%显示出0频
grid on
代码第三行的visa函数的第二个参数应该用自己的示波器地址。
这是运行后的结果:
可以看出,拿示波器实现了频谱仪的效果。方波是1kHz的,频谱图显示信号包含直流、1kHz频率及其高次谐波,与实际情况吻合。
如果有警告:
警告: The EOI line was asserted before SIZE values were available.
‘visa’ unable to read all requested data. For more information on possible reasons, see VISA Read
Warnings.
不用担心,这是因为我们请求了2048字节的数据,但是返回的数据没那么长导致的。