Main Content

Generate Pulse Width Modulated Signals Using NI Devices

This example shows how to generate a pulse width modulated signal to drive a stepper motor.

Create a Counter Output Channel

Use daq to create a DataAcquisition. Use addoutput to add a counter output channel with PulseGeneration measurement type, and addinput to add an analog input channel to monitor the pulse generated by the counter output channel. For this example, use CompactDAQ chassis NI c9178 and module NI 9402 with ID cDAQ1Mod5 for the pulse generation and NI 9205 with ID cDAQ1Mod1 for the voltage input.

dq = daq("ni");
addinput(dq,"cDAQ1Mod1", "ai0", "Voltage");
ctr = addoutput(dq,"cDAQ1Mod5", "ctr0", "PulseGeneration");
dq.Channels
ans = 

    Index    Type      Device       Channel    Measurement Type           Range                 Name      
    _____    ____    ___________    _______    _________________    __________________    ________________

      1      "ai"    "cDAQ1Mod1"    "ai0"      "Voltage (Diff)"     "-10 to +10 Volts"    "cDAQ1Mod1_ai0" 
      2      "co"    "cDAQ1Mod5"    "ctr0"     "PulseGeneration"    "n/a"                 "cDAQ1Mod5_ctr0"

Determine the Terminal of the Counter Output Channel

To connect the output signal to the correct terminal, examine the Terminal property of the counter channel. The terminal is determined by the hardware.

ctr.Terminal
ans =

    'PFI0'

Clocked Counter Output

Use counter output channel 0 to generate a fixed pulse width modulated signal on terminal PFI0. Trigger the motor after 0.5 seconds, with a 75% duty cycle.

ctr.Frequency = 10;
ctr.InitialDelay = 0.5;
ctr.DutyCycle = 0.75;

% Starting in foreground returns data for input channels only. 
% The data variable will contain one column of data.
start(dq, "Duration", seconds(1));

while dq.Running
    pause(0.1);
end

data = read(dq, seconds(1));
plot(data.Time, data.Variables);