147 lines
4.9 KiB
Matlab
147 lines
4.9 KiB
Matlab
classdef OptLaserN7714A < handle
|
|
% Minimal controller for Keysight N7714A tunable laser over VISA-LAN
|
|
% Methods: getLaserInfo, setPower, setWavelength
|
|
%
|
|
% Examples:
|
|
% L = OptLaserN7714A('TCPIP::192.168.0.50::INSTR');
|
|
% L.setWavelength(1550); % nm
|
|
% L.setPower(-3.0, true); % dBm, also turns output ON
|
|
% info = L.getLaserInfo();
|
|
|
|
properties (Access=private)
|
|
v % visadev handle
|
|
resource char % VISA resource string, e.g. 'TCPIP::...::INSTR'
|
|
end
|
|
|
|
methods
|
|
function obj = OptLaserN7714A(resource)
|
|
arguments
|
|
resource (1,:) char
|
|
end
|
|
obj.resource = resource;
|
|
|
|
% Robust connect with small retry loop
|
|
maxRetries = 3; pauseTime = 1.0; lastErr = [];
|
|
for k = 1:maxRetries
|
|
try
|
|
obj.v = visadev(obj.resource);
|
|
% Identify instrument (SCPI *IDN?)
|
|
writeline(obj.v, '*IDN?'); % SCPI common, identification
|
|
idn = strtrim(readline(obj.v)); %#ok<NASGU>
|
|
break
|
|
catch ME
|
|
lastErr = ME;
|
|
pause(pauseTime);
|
|
end
|
|
end
|
|
if isempty(obj.v) || ~isvalid(obj.v)
|
|
error('OptLaserN7714A:ConnectFailed', ...
|
|
'Could not connect to %s. Last error: %s', obj.resource, lastErr.message);
|
|
end
|
|
|
|
% Set power unit to dBm for SOURce tree to be explicit (optional)
|
|
% [:SOUR]:POWer:UNIT dBm (laser power unit)
|
|
% Ref: SOURce:POWer:UNIT. :contentReference[oaicite:0]{index=0}
|
|
try
|
|
writeline(obj.v, 'SOUR:POW:UNIT DBM');
|
|
catch
|
|
% non-fatal
|
|
end
|
|
end
|
|
|
|
function delete(obj)
|
|
if ~isempty(obj.v) && isvalid(obj.v); delete(obj.v); end
|
|
end
|
|
|
|
function setPower(obj, power_dBm, outputOn, channel)
|
|
arguments
|
|
obj
|
|
power_dBm (1,1) double
|
|
outputOn (1,1) logical = true
|
|
channel (1,1) double {mustBeMember(channel,0:4)} = 1
|
|
end
|
|
|
|
v = obj.v;
|
|
cmd = sprintf('SOUR%d:POW:LEV:IMM:AMPL %g DBM', channel, power_dBm);
|
|
writeline(v, cmd);
|
|
|
|
if outputOn
|
|
writeline(v, sprintf('SOUR%d:POW:STAT 1', channel)); %SOUR1:POW:STAT 0
|
|
else
|
|
writeline(v, sprintf('SOUR%d:POW:STAT 0', channel));
|
|
end
|
|
|
|
writeline(v, '*OPC?');
|
|
a=readline(v);
|
|
end
|
|
|
|
function setWavelength(obj, wavelength_nm, channel)
|
|
arguments
|
|
obj
|
|
wavelength_nm (1,1) double {mustBePositive}
|
|
channel (1,1) double {mustBeMember(channel,0:4)} = 1
|
|
end
|
|
v = obj.v;
|
|
cmd = sprintf('SOUR%d:WAV %gNM', channel, wavelength_nm);
|
|
writeline(v, cmd);
|
|
writeline(v, '*OPC?'); readline(v);
|
|
end
|
|
|
|
function setDither(obj, enable, port)
|
|
% Enable or disable laser frequency dither (stabilization).
|
|
% enable = false → no dither (FIX), true → stabilization (STAB).
|
|
% port = 1..4 (default 1).
|
|
if nargin < 3
|
|
port = 1;
|
|
end
|
|
|
|
v = obj.v;
|
|
if enable
|
|
writeline(v, sprintf('SOUR%d:CONTrol:FCDither ON', port)); %[:SOURce[n]][:CHANnel[m]]:CONTrol:FCDither
|
|
else
|
|
writeline(v, sprintf('SOUR%d:CONTrol:FCDither OFF', port));
|
|
end
|
|
|
|
% optional confirmation
|
|
writeline(v, sprintf('SOUR%d:CONTrol:FCDither?', port));
|
|
modeStr = strtrim(readline(v));
|
|
fprintf('Port %d dither mode set to %s\n', port, modeStr);
|
|
end
|
|
|
|
|
|
|
|
function info = getLaserInfo(obj, port)
|
|
% Returns struct with IDN, output state, wavelength (nm), power (dBm)
|
|
% port = 1..4 (for N7714A with 4 outputs). Default = 1.
|
|
if nargin < 2
|
|
port = 1;
|
|
end
|
|
|
|
v = obj.v;
|
|
|
|
% *IDN?
|
|
writeline(v, '*IDN?');
|
|
idn = strtrim(readline(v));
|
|
|
|
% Output state: :SOURn:POW:STAT?
|
|
writeline(v, sprintf('SOUR%d:POW:STAT?', port));
|
|
out_state = str2double(readline(v)) ~= 0;
|
|
|
|
% Wavelength query (returns meters → convert to nm)
|
|
writeline(v, sprintf('SOUR%d:WAV?', port));
|
|
wav_m = str2double(readline(v));
|
|
wav_nm = wav_m * 1e9;
|
|
|
|
% Power (set level) query (dBm)
|
|
writeline(v, sprintf('SOUR%d:POW:LEV:IMM:AMPL?', port));
|
|
p_dBm = str2double(readline(v));
|
|
|
|
info = struct('idn', idn, ...
|
|
'output_on', out_state, ...
|
|
'wavelength_nm', wav_nm, ...
|
|
'power_dBm', p_dBm);
|
|
end
|
|
|
|
end
|
|
end
|