Main Content

Acquire Digital Data Using a Counter Output Channel as External Clock

This example shows how to use a device counter output channel to generate pulses to use as an external clock for acquiring digital data.

Sharing counter pulses as an external clock

In this example, you generate a clock in one DataAcquisition using a counter output channel and export the clock to another DataAcquisition that acquires digital data. The counter output and the digital subsystem can be on the same device or on different devices. If using multiple devices not in the same chassis, you must wire a physical connection between the counter output of one device to the digital clock input of the other.


Importing an external clock does not automatically set the scan rate of your DataAcquisition. Manually set the DataAcquisition Rate property value to match the expected external clock frequency.

Generate a Clock Using a Counter Output Channel

Create a clocked DataAcquisition with a counter output channel that continuously generates frequency pulses in the background. You can use this channel as an external clock for a clocked digital acquisition.

Define the clock frequency to be used for synchronizing the scan rate of your counter output as well as the rate of your digital acquisition.

clockFreq = 100;

Create a DataAcquisition object and add a counter output channel for PulseGeneration measurement type.

daqClk = daq("ni");
ch1 = addoutput(daqClk,"Dev1","ctr0","PulseGeneration");


Make sure the counter channel you add is not being used in a different DataAcquisition, otherwise a terminal conflict error occurs.

Save the counter output terminal ID to a variable so you can use it later to specify the external clock that synchronizes your digital clocked operations.

clkTerminal = ch1.Terminal;

Set the frequency of your counter channel to the clock frequency.

ch1.Frequency = clockFreq;

Use Counter Clock to Acquire Clocked Digital Data

Create a DataAcquisition for digital input and import the external clock from the clock DataAcquisition.

Create a DataAcquisition and add a digital input line from port 0 line 2 on Dev1.

daqDgt = daq("ni");


Not all devices support clocked digital I/O operations with hardware timing. For these devices you can use software timed operations with single scan calls to read and write.

Devices that support clocked digital I/O operations might not support them on all ports. Check your device specifications.


PFI terminal resources might be shared. Check your device routing in the NI MAX app.

Set the DataAcquisition scan rate to the same value as the rate of the counter output channel.

daqDgt.Rate = clockFreq;

Import the clock from your clock DataAcquisition to synchronize your acquisition.


Start the counter output channel to run continuously in the background.


Pulse generation begins immediately on the counter output. It does not need data.

Acquire and plot digital input data.

dataIn = read(daqDgt,seconds(1),"OutputFormat","Matrix");

Stop the clock DataAcquisition.


Related Topics