-
Notifications
You must be signed in to change notification settings - Fork 13
/
DO_retriggerable.m
102 lines (86 loc) · 3.88 KB
/
DO_retriggerable.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
function DO_retriggerable
% Example showing TTL output, repeatedly triggered by an external TTL signal using the Vidrio dabs.ni.daqmx wrapper
%
% function vidrio.mixed.DO_retriggerable
%
% Purpose
% Shows how to repeatedly trigger a TTL signal with adjustable delay and duration
% using an incoming TTL signal. This can be used to synchronize devices on multiple
% devices, or on timescales that cannot be achieved by software (microsecond domain)
%
%
% IMPORTANT NOTE
% Retriggerable tasks only work with X-Series DAQ boards such as
% PCIe-6321 or USB-6343. This task uses a counter and only a few counters
% are available per board (typically four for more recent NI DAQ devices).
%
%
% Demonstrated steps:
% 1. Create a task.
% 2. Create an counter channel for TTL output.
% 3. Define external trigger source.
% 4. Call the Start function and wait for triggers.
% 5. Clear the task
% 6. Display an error if any.
%
%
% Monitoring the output
% If you lack an oscilloscope you may physically connect the counter output to
% an analog input and monitor this using the NI MAX test panel. You likely will need
% to select RSE: http://www.ni.com/white-paper/3344/en/
%
%
% Peter Rupprecht - Basel, 2017
%
% Also see:
% vidrio.CO.singlePulse - setting up a single pulse with a counter
% vidrio.mixed.AO_retriggerable
%Define a cleanup function
tidyUp = onCleanup(@cleanUpFunction);
%% Parameters for the acquisition (device and channels)
devName = 'beam'; % the name of the DAQ device as shown in MAX
taskName = 'retrigDO'; % A string that will provide a label for the task
counterID=0; % The ID of the counter to use
triggerChannel = 'PFI0'; % A string defining the PFI channel on which triggers come
% Task configuration
frequency = 3; % Hz
dutyCycle = 0.25;
try
% * Create a DAQmx task
% More details at: "help dabs.ni.daqmx.Task"
% C equivalent - DAQmxCreateTask
% http://zone.ni.com/reference/en-XX/help/370471AE-01/daqmxcfunc/daqmxcreatetask/
hTask = dabs.ni.daqmx.Task(taskName);
% * Set up a channel to generate digital pulses and define the pulse properties
% More details at: "help dabs.ni.daqmx.Task.createCOPulseChanFreq"
% C equivalent - DAQmxCreateCOPulseChanFreq
% http://zone.ni.com/reference/en-XX/help/370471AE-01/daqmxcfunc/daqmxcreatecopulsechanfreq/
hTask.createCOPulseChanFreq(devName, counterID, [], frequency, dutyCycle);
% hTask.channels(1).set('pulseTerm','PFI4'); % Pulses come out of the default channel unless you change this
fprintf('Pulses will come out of %s\n', get(hTask.channels,'pulseTerm'))
% * Define the channel on which we listen for triggers and set task as retriggerable
hTask.cfgDigEdgeStartTrig(triggerChannel,'DAQmx_Val_Rising');
hTask.set('startTrigRetriggerable',1);
% Start the task and wait until it is complete. Task starts and
% will wait for triggers until it is stopped
hTask.start();
fprintf('Waiting for triggers (ctrl-c to stop) ...\n')
while 1
pause(0.5)
end
catch ME
daqDemosHelpers.errorDisplay(ME)
return
end %try/catch
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
function cleanUpFunction
%This runs when the function ends
if exist('hTask','var')
fprintf('Cleaning up DAQ task\n');
hTask.stop; % Calls DAQmxStopTask
delete(hTask); % The destructor (dabs.ni.daqmx.Task.delete) calls DAQmxClearTask
else
fprintf('No task variable present for clean up\n')
end
end %close cleanUpFunction
end %DO_retriggerable