280 lines
10 KiB
Matlab
280 lines
10 KiB
Matlab
classdef ScopeKeysight
|
|
%NAME Summary of this class goes here
|
|
% Detailed explanation goes here
|
|
|
|
properties(Access=public)
|
|
model scope_model
|
|
fadc scope_fadc
|
|
channel
|
|
autoScale
|
|
extRef
|
|
interpolate
|
|
recordLen
|
|
IPaddress
|
|
end
|
|
|
|
methods (Access=public)
|
|
|
|
function obj = ScopeKeysight(options)
|
|
%NAME Construct an instance of this class
|
|
% Detailed explanation goes here
|
|
|
|
arguments
|
|
options.model scope_model = scope_model.DSAZ634A;
|
|
options.fadc scope_fadc = scope_fadc.GSa_160;
|
|
options.channel logical = [0,0,0,0];
|
|
options.autoScale logical = 0;
|
|
options.extRef logical = 1;
|
|
options.interpolate logical = 0;
|
|
options.recordLen double = 1000000;
|
|
options.IPaddress
|
|
end
|
|
|
|
%
|
|
fn = fieldnames(options);
|
|
for n = 1:numel(fn)
|
|
try
|
|
obj.(fn{n}) = options.(fn{n});
|
|
end
|
|
end
|
|
|
|
switch obj.model
|
|
case scope_model.DSAZ634A
|
|
|
|
case scope_model.UXR1102A
|
|
|
|
end
|
|
|
|
|
|
end
|
|
|
|
function recordedSignals = read(obj,options)
|
|
|
|
arguments
|
|
obj
|
|
options.channel logical = obj.channel
|
|
end
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%
|
|
%%% CONNECT TO SCOPE %%%
|
|
%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
if isempty(obj.IPaddress)
|
|
switch obj.model
|
|
case scope_model.DSAZ634A
|
|
v=visadev('TCPIP0::keysight.tf.uni-kiel.de::inst0::INSTR');% TCPIP0::127.0.0.1::inst0::INSTR
|
|
case scope_model.UXR1102A
|
|
v=visadev('TCPIP0::testscope.tf.uni-kiel.de::inst0::INSTR');% TCPIP0::127.0.0.1::inst0::INSTR
|
|
case scope_model.UXR1104A
|
|
v=visadev('TCPIP0::134.245.243.223::inst0::INSTR');
|
|
end
|
|
else
|
|
try
|
|
ressourceName=['TCPIP0::',char(obj.IPaddress),'::inst0::INSTR'];
|
|
v=visadev(ressourceName);
|
|
catch
|
|
error(['Could not connect to instrument using VISA. Check VISA ressourcename -> ', ressourceName]);
|
|
end
|
|
end
|
|
|
|
disp(['Connected to Instrument: ',char(v.Vendor),' ',char(v.Model),' SerNo:',char(v.SerialNumber)]);
|
|
|
|
% Check if Scope is ready to go
|
|
opdone = 0;
|
|
acqdone = 0;
|
|
procdone = 0;
|
|
while ~opdone || ~acqdone || ~procdone
|
|
opdone = sscanf(obj.writeReceiveCheck(v,'*opc?'), '%f');
|
|
acqdone = sscanf(obj.writeReceiveCheck(v,'ader?'), '%f');
|
|
procdone = sscanf(obj.writeReceiveCheck(v,'pder?'), '%f');
|
|
pause(0.005);
|
|
end
|
|
armed = sscanf(obj.writeReceiveCheck(v,'aer?'), '%f');
|
|
scope_state = strtrim(obj.writeReceiveCheck(v,'RSTate?'));
|
|
|
|
% Set sample rate / activate real edge
|
|
if obj.fadc == scope_fadc.GSa_160
|
|
obj.writeNcheck(v,':ACQuire:REDGe 1');
|
|
if length(obj.channel)>1
|
|
if obj.channel(2) == 1
|
|
error("CH 2 is invalid for Real Edge configuration. ONLY use channel 1 and 3 as shown on scope! Simply use [1,0,1,0] as channel config to record 1 and 3.")
|
|
end
|
|
elseif length(obj.channel)>3
|
|
if obj.channel(2) == 1 || obj.channel(4) == 1
|
|
error("CH 2 is invalid for Real Edge configuration. ONLY use channel 1 and 3 as shown on scope! Simply use [1,0,1,0] as channel config to record 1 and 3.")
|
|
end
|
|
end
|
|
else
|
|
obj.writeNcheck(v,':ACQuire:REDGe 0');
|
|
obj.writeNcheck(v,':ACQuire:SRATe %u',double(obj.fadc).*1e9);
|
|
end
|
|
|
|
%
|
|
for n = find(obj.channel == 1)
|
|
obj.writeNcheck(v,sprintf(':CHANnel%u:DISPlay ON',n));% display captured data trace
|
|
end
|
|
|
|
if obj.autoScale
|
|
obj.writeNcheck(v,':AUTOscale');
|
|
for n = 1:4
|
|
range = str2double(obj.writeReceiveCheck(v,sprintf(':CHANnel%u:RANGe?',n)));
|
|
obj.writeNcheck(v,sprintf(':CHANnel%u:RANGe %.3f',n,range/1.2));
|
|
end
|
|
else
|
|
obj.writeNcheck(v,':SINGLE');
|
|
end
|
|
|
|
if obj.extRef
|
|
switch obj.model
|
|
case scope_model.DSAZ634A
|
|
obj.writeNcheck(v,':TIMebase:REFClock HFR');
|
|
case scope_model.UXR1102A || scope_model.UXR1104A
|
|
obj.writeNcheck(v,':TIMebase:REFClock 1');
|
|
end
|
|
|
|
REFclock = strtrim(obj.writeReceiveCheck(v,':TIMebase:REFClock?'));
|
|
|
|
if ~strcmp(REFclock,'HFR')
|
|
obj.writeNcheck(v,':TIMebase:REFClock ON');
|
|
REFclock = strtrim(obj.writeReceiveCheck(v,':TIMebase:REFClock?'));
|
|
assert(~(strcmp(REFclock,'OFF') || strcmp(REFclock,'0')),'No Refclock found: Using internal')
|
|
end
|
|
|
|
else
|
|
obj.writeNcheck(v,':TIMebase:REFClock 0');
|
|
end
|
|
|
|
if obj.interpolate
|
|
obj.writeNcheck(v,'ACQ:INTerpolate INT16');
|
|
obj.writeNcheck(v,sprintf(':ACQuire:POINts %u',obj.recordLen+100));
|
|
else
|
|
obj.writeNcheck(v,sprintf(':ACQuire:POINts %u',obj.recordLen+100));
|
|
obj.writeNcheck(v,'ACQ:INTerpolate OFF');
|
|
end
|
|
|
|
obj.writeNcheck(v,':SYSTem:HEADer OFF'); % turn off system headers
|
|
obj.writeNcheck(v,':WAVEFORM:FORMAT WORD');% set the data format type to WORD
|
|
obj.writeNcheck(v,':WAVEFORM:BYTeorder LSBFirst');% Setup transfer of LSB first
|
|
obj.writeNcheck(v,':WAVEFORM:STReaming off');% Turn off waveform streaming
|
|
|
|
for n = find(obj.channel == 1)
|
|
obj.writeNcheck(v,sprintf(':CHANnel%u:DISPlay ON',n));% display captured data trace
|
|
end
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
%%% Acquire Data from Scope %%%
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
obj.writeNcheck(v,':DIGitize');
|
|
|
|
recordedSignals = cell(size(obj.channel));
|
|
for n = find(obj.channel == 1)
|
|
recordedSignals{n} = obj.readChannel(v,n);
|
|
recordedSignals{n} = recordedSignals{n}(1:obj.recordLen);
|
|
obj.writeNcheck(v,sprintf(':CHANnel%u:DISPlay ON',n));
|
|
end
|
|
|
|
for n = find(obj.channel == 0)
|
|
recordedSignals{n} = [];
|
|
end
|
|
|
|
obj.writeNcheck(v,sprintf(':%s',scope_state));
|
|
obj.writeNcheck(v,'*OPC?');
|
|
|
|
end
|
|
|
|
end
|
|
|
|
methods (Access=private)
|
|
|
|
function captured_signal = readChannel(obj, v, aCH)
|
|
|
|
Format = 'word';
|
|
if strcmpi(Format,'word')
|
|
nBytes = 2;
|
|
blockReadType = 'int16';
|
|
elseif strcmpi(Format,'byte')
|
|
nBytes = 1;
|
|
blockReadType = 'int8';
|
|
else
|
|
error('Param.Format not recognized');
|
|
end
|
|
|
|
maxBlockSize = pow2(20);
|
|
|
|
obj.writeNcheck(v,sprintf(':WAVeform:SOURce CHANnel%u',aCH)); % read x origin:WAVeform:SOURce
|
|
|
|
xOrg = str2double(obj.writeReceiveCheck(v,':wav:xor?'));% read x origin
|
|
|
|
xInc = str2double(obj.writeReceiveCheck(v,':wav:xinc?'));% read x increment => 1/fadc
|
|
|
|
xRef = str2double(obj.writeReceiveCheck(v,':wav:xref?'));
|
|
|
|
yOrg = str2double(obj.writeReceiveCheck(v,':wav:yor?'));% read y origin
|
|
|
|
yInc = str2double(obj.writeReceiveCheck(v,':wav:yInc?'));% read y increment
|
|
|
|
yRef = str2double(obj.writeReceiveCheck(v,':wav:yref?'));
|
|
|
|
points = str2double(obj.writeReceiveCheck(v,':wav:points?'));
|
|
|
|
% timerperiod = max(10,1e-6*points*nBytes);
|
|
% set(v,'TimerPeriod',timerperiod);
|
|
|
|
timeout = min([max(10,1e-6*points*nBytes) 1000]);
|
|
set(v,'Timeout',timeout);
|
|
|
|
blockSize = min(pow2(ceil(log2(points))),maxBlockSize);
|
|
set(v,'InputBufferSize',nBytes*blockSize);
|
|
|
|
blockCount = int8(ceil(max(1,points/blockSize)));
|
|
|
|
for block = 0:blockCount - 1
|
|
|
|
startPoint = double(block) * blockSize + 1;
|
|
endPoint = min((double(block + 1)) * blockSize,points);
|
|
pointsRead = endPoint - startPoint + 1;
|
|
|
|
obj.writeNcheck(v, sprintf(':wav:data? %d,%d', startPoint, pointsRead));
|
|
|
|
%Wfm.data(startPoint:endPoint,1) = binblockread(v,blockReadType); %old Matlab
|
|
data(startPoint:endPoint,1) = readbinblock(v,blockReadType);
|
|
|
|
Junk = fread(v,1,'schar'); %#ok Read out end of file character.
|
|
|
|
end
|
|
|
|
%scale the signal back to volt
|
|
captured_signal = data*yInc+yOrg;
|
|
|
|
end
|
|
|
|
function writeNcheck(~,visaobj,command)
|
|
% 1) send command to intstument
|
|
% 2) check if everything is okay
|
|
|
|
writeline(visaobj,char(command));
|
|
|
|
% writeline(visaobj,':syst:err?');
|
|
% err_aw=readline(visaobj);
|
|
% assert(strfind(err_aw,"No error"),['AWG System Error? after command: ', char(command)])
|
|
|
|
end
|
|
|
|
function [aw]=writeReceiveCheck(~,visaobj,command)
|
|
% 1) send command to intstument
|
|
% 2) receive answer from instrument
|
|
% 3) check i f everything is okay
|
|
|
|
writeline(visaobj,char(command));
|
|
aw = readline(visaobj);
|
|
|
|
% writeline(visaobj,':syst:err?');
|
|
% err_aw=readline(visaobj);
|
|
% assert(strfind(err_aw,"No error"),['AWG System Error? after command: ', char(command)])
|
|
|
|
end
|
|
|
|
end
|
|
end
|