Acquire Data from Two Devices at Different Rates

This example shows how to acquire data from two different DAQ devices running at different sampling rates. The example uses two National Instruments CompactDAQ analog input modules (9201 and 9211) which have different acquisition rate limits. The 9211 module is used for temperature measurements and acquires at a slower rate (10 Hz) than the 9201 module, which is used to measure voltage (100 Hz). Since all channels in a data acquisition object must acquire at the same rate, to acquire from two modules at different rates you need to use two data acquisition objects. To make both DAQ devices start simultaneously, you can use a hardware digital triggering configuration.

Hardware Setup

  • CompactDAQ chassis NI cDAQ 9178 ('cDAQ1')

  • NI cDAQ 9211 module with thermocouple measurement type ('cDAQ1Mod1')

  • NI cDAQ 9201 module with voltage measurement type ('cDAQ1Mod2')

  • Thermocouple probe (type K)

  • Analog voltage signal generated by a function generator instrument

Configure Data Acquisition Objects and Channels

Create two data acquisition objects, each with one analog input channel from a 9211 module or 9201 module. The data acquisition objects acquire data at rates of 10 Hz and 100 Hz, respectively.

% Specify a common acquisition duration for both devices, in seconds
daqDuration = 3;

% Create and configure DataAcquisition object and channels for cDAQ 9211 module
d1 = daq('ni');
addinput(d1, 'cDAQ1Mod1', 'ai0', 'Thermocouple');
d1.Channels(1).ThermocoupleType = 'K';
d1.Rate = 10;
Warning: The Rate property was reduced to 14.2857 due to changes in the channel
configuration. 
% Create and configure DataAcquisition object and channels for cDAQ 9201 module
d2 = daq('ni');
addinput(d2, 'cDAQ1Mod2', 'ai0', 'Voltage');
d2.Rate = 100;

Configure Trigger Connections

To synchronize the acquisition start you can use hardware triggering and a master/slave approach. One of the data acquisition objects (master) is started manually and triggers the acquisition start of the other data acquisition object (slave).

Note: If you have a CompactDAQ chassis model (such as NI 9174) which does not have PFI triggering terminals, you can use an additional digital I/O module (such as NI 9402) to provide the PFI terminals for the trigger connections.

% Configure the master data acquisition object to export a triggering
% signal on the PFI0 terminal of cDAQ1 chassis
addtrigger(d1, 'Digital', 'StartTrigger', 'cDAQ1/PFI0', 'External');

% Configure the slave data acquisition object to start acquisition when an
% external triggering signal is received at PFI0 terminal of cDAQ1 chassis
addtrigger(d2, 'Digital', 'StartTrigger', 'External', 'cDAQ1/PFI0');

Start Acquisition and Wait Until Complete

The slave data acquisition object must start first and be ready for an external trigger before the master data acquisition object starts.

start(d2, 'Duration', daqDuration)
while ~d2.WaitingForDigitalTrigger
    pause(0.1)
end
start(d1, 'Duration', daqDuration)

% Wait until data acquisition is complete
while d1.Running || d2.Running
    pause(1)
end
Background operation has started.
Background operation will stop after 3 s.
To read acquired scans, use read.
Background operation has started.
Background operation will stop after 3 s.
To read acquired scans, use read.

Save Data as Timetable

For each data acquisition object, the acquired measurement data and timestamps were stored in memory. Read all acquired data from memory in the default timetable format.

data1 = read(d1, 'all');
data2 = read(d2, 'all');

Plot Acquired Data

Since the acquired data from the two devices have different scales and units, create a chart with two y-axes.

figure
yyaxis left
plot(data1.Time, data1.Variables, '-x')
ylabel('Temperature (deg. C)')
ylim([0 50])
yyaxis right
plot(data2.Time, data2.Variables, '-o')
ylabel('Voltage (V)')
xlabel('Time (s)')

Clean Up

Clear the data acquisition objects to disconnect from hardware.

clear d1 d2