Multifunction DAQ

Showing results for 
Search instead for 
Did you mean: 

Enhancing NI USB 6009 Output Frequency for Stepper Motor Control



I'm currently working on a project involving the control of a stepper motor via the NI USB 6009 data acquisition device. My goal is to drive the stepper motor using either digital or analog outputs, requiring a pulse frequency in the range of 100 Hz to 1000 Hz for optimal control. I've been implementing the control logic using Python to generate the necessary pulses.

However, I've encountered a limitation where the maximum output frequency I've been able to achieve is only around 500 Hz (even if I set to 2000Hz or above), which is insufficient for the desired performance of my stepper motor. This frequency limit is posing a significant challenge to achieving smooth and precise motor control. I have tried both analog output and digital output. None of them reach the frequency


I'm reaching out to see if anyone has faced a similar issue or has suggestions on how to improve the output frequency using the NI USB 6009 with Python. Any advice on alternative approaches, configuration settings, or optimization techniques that could help bypass this frequency limitation would be greatly appreciated.

Thank you in advance for your insights and help.



import nidaqmx
from nidaqmx.constants import LineGrouping
import time
import threading

def simulate_pwm_on_analog_output(frequency_hz, duty_cycle, channel, high_voltage, duration_sec):
    period_sec = 1.0 / frequency_hz
    high_time = period_sec * duty_cycle
    low_time = period_sec - high_time
    with nidaqmx.Task() as task:
        # Ensure the high_voltage parameter does not exceed the channel's maximum voltage
        task.ao_channels.add_ao_voltage_chan(channel, min_val=0, max_val=5)  # Adjust max_val based on your device specifications
        end_time = time.time() + duration_sec
        while time.time() < end_time:
            # Write the high voltage for the high part of the cycle
            # Write 0V for the low part of the cycle

if __name__ == "__main__":
    # Configuration
    frequency_hz = 1000  # Target frequency
    duty_cycle = 0.5  # 50% duty
    channel = "Dev1/ao0"  # Use an analog output channel
    high_voltage = 5  # High voltage level for the PWM signal, adjusted not to exceed device limits
    duration_sec = 100  # Duration to run the PWM simulation
    pwm_thread = threading.Thread(target=simulate_pwm_on_analog_output, args=(frequency_hz, duty_cycle, channel, high_voltage, duration_sec))



0 Kudos
Message 1 of 2

You are using software-timed analog output. Python is an interpreter language and performs 10 times slower than LabVIEW or C programming. 

If you want to send PWM of 1kHz, here are a few different options:

  1. Use LabVIEW, C or C# that performs faster.
  2. Use hardware-timed analog output task (nidaqmx-python/examples/
  3. Use counter output (nidaqmx-python/examples/
Control Lead | Intelline Inc
Message 2 of 2