Skip to content

Commit

Permalink
Get AI working in dotNETwrapper
Browse files Browse the repository at this point in the history
  • Loading branch information
raacampbell committed Feb 2, 2023
1 parent 2d105cb commit 57865b4
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 10 deletions.
29 changes: 26 additions & 3 deletions zapit/+zapit/+hardware/+DAQ/@dotNETwrapper/dotNETwrapper.m
Expand Up @@ -31,6 +31,7 @@

properties
hAOtaskWriter % Class for writing data to AO lines
hAIreader % Class for reading from AI lines
end


Expand Down Expand Up @@ -143,7 +144,8 @@ function stopAndDeleteAITask(obj)
if isempty(obj.hAI) || ~isvalid(obj.hAI)
return
end
obj.hAI.stop; % Calls DAQmxStopTask
obj.hAI.Stop; % Calls DAQmxStopTask
obj.hAI.Dispose;
delete(obj.hAI);
end % stopAndDeleteAITask

Expand All @@ -159,6 +161,8 @@ function connectUnclockedAI(obj, chan, verbose)
% chan - which channel to connect. Must be supplied as an integer.
% verbose - [optional, false by default]. Reports to screen what it is doing if true

import NationalInstruments.DAQmx.*

if nargin<3
verbose = false;
end
Expand All @@ -172,11 +176,18 @@ function connectUnclockedAI(obj, chan, verbose)

taskName = 'unclockedai';
obj.hAI = NationalInstruments.DAQmx.Task(taskName);
chan = [obj.device_ID,'/',num2str(chan)];
chan = [obj.device_ID,'/ai',num2str(chan)];

obj.hAI.AOChannels.CreateVoltageChannel(chan, taskName, ...
obj.hAI.AIChannels.CreateVoltageChannel(chan, taskName, ...
AITerminalConfiguration.Differential, ...
-obj.AOrange, obj.AOrange, AIVoltageUnits.Volts);

obj.hAI.Control(TaskAction.Verify)

obj.hAIreader = AnalogSingleChannelReader(obj.hAI.Stream);



end % connectUnclockedAI

function connectUnclockedAO(obj, verbose)
Expand All @@ -190,6 +201,7 @@ function connectUnclockedAO(obj, verbose)
%
% Inputs
% verbose - [optional, false by default]. Reports to screen what it is doing if true

import NationalInstruments.DAQmx.*

if nargin<2
Expand Down Expand Up @@ -344,6 +356,17 @@ function writeAnalogData(obj,waveforms)
end % writeAnalogData


function data = readAnalogData(obj)
% Read analog data from the DAQ
%
% function zapit.DAQ.vidriowrapper.readAnalogData
%
% Purpose
% Thin wrapper to read analog data.
data = obj.hAIreader.ReadSingleSample;
end % readAnalogData


function nSamples = numSamplesInBuffer(obj)
% Return the number of samples in the buffer
%
Expand Down
12 changes: 12 additions & 0 deletions zapit/+zapit/+hardware/+DAQ/@vidriowrapper/vidriowrapper.m
Expand Up @@ -295,6 +295,18 @@ function writeAnalogData(obj,waveforms)
end % writeAnalogData


function data = readAnalogData(obj)
% Read analog data from the DAQ
%
% function zapit.DAQ.vidriowrapper.readAnalogData
%
% Purpose
% Thin wrapper to read analog data.

data = obj.DAQ.hAI.readAnalogData();
end % readAnalogData


function nSamples = numSamplesInBuffer(obj)
% Return the number of samples in the buffer
%
Expand Down
18 changes: 11 additions & 7 deletions zapit/+zapit/@pointer/generateLaserCalibrationCurve.m
Expand Up @@ -50,29 +50,33 @@ function generateLaserCalibrationCurve(obj,minMax)


% Generate vectors for testing
valsToTest = minMax(1):0.1:minMax(2);
valsToTest = minMax(1):0.025:minMax(2);
sensorVals = zeros(size(valsToTest));

% Run
if ~obj.simulated
nValsToMeasure = 8; % Obtain this many values and take a average this many values
nValsToMeasure = 4; % Obtain this many values and take a average this many values
else
nValsToMeasure = 1;
end

for ii = 1:length(valsToTest)
obj.DAQ.setLaserPowerControlVoltage(valsToTest(ii))
if mod(ii,10)==0
fprintf('%d/%d\n',ii,length(valsToTest))
end
obj.setLaserPowerControlVoltage(valsToTest(ii))

tmp = zeros(1,nValsToMeasure);
for jj=1:nValsToMeasure
tmp(jj) = obj.DAQ.hAI.readAnalogData();
tmp(jj) = obj.DAQ.readAnalogData();
pause(0.025)
end

sensorVals(ii) = mean(tmp);
end

% Tidy up
obj.DAQ.setLaserPowerControlVoltage(0)
obj.setLaserPowerControlVoltage(0)

%%
% Fit a third order polynomial: photodiode voltage as a function of control voltage
Expand All @@ -93,10 +97,10 @@ function generateLaserCalibrationCurve(obj,minMax)

%%
% plot the data
fig = zapit.utils.focusNamedFig('lasercalibrate');
zapit.utils.focusNamedFig('lasercalibrate');
clf
plot(laserFit.sensorOnControl,valsToTest,sensorVals)
ylim([0,12])
ylim([0,max(sensorVals)*1.1])
grid on
xlabel('Laser Control Value [V]')
ylabel('Photodiode Signal [V]')
Expand Down

0 comments on commit 57865b4

Please sign in to comment.