NI DAQmx — Входной канал триггера для считывания N выборок с использованием внешнего аналогового триггерного входа (python)

#python #labview #nidaqmx

Вопрос:

У меня возникли проблемы с использованием Python и библиотеки nidaqmx для правильного запуска канала аналогового ввода для считывания N значений. У меня есть два аналоговых входных канала, ai0 и ai1. Канал ai0-это триггерный канал, который считывает 9 В до тех пор, пока цепь не будет подключена и напряжение не достигнет 3 В. В этот момент я хочу прочитать N образцов из канала ai1. Я хочу повторить этот процесс в течение 1 минуты. Я использую NI USB-6361 daq.

Мой код приведен ниже, и проблема в том, что мой код не ожидает выполнения задачи чтения до тех пор, пока триггер не будет удовлетворен. Триггер настроен правильно, потому что, если я удалю задачу ai1, программа прочитает N выборок из канала ai0, как только напряжение упадет. Тем не менее, я хочу прочитать сигнал от ai1, но использовать ai0 в качестве триггера. Надеюсь, это имеет смысл, и спасибо за вашу помощь.

 import nidaqmx

num_samples = 1000;
s_freq = 1e3;
tend = num_samples/s_freq;

#read from DAQ
def readdaq():
    task = nidaqmx.Task()
    task.ai_channels.add_ai_voltage_chan("Dev1/ai0",max_val=10, min_val=0)
    task.triggers.reference_trigger.cfg_anlg_edge_ref_trig("Dev1/ai0", pretrigger_samples = 10, trigger_slope=nidaqmx.constants.Slope.FALLING, trigger_level = 5)
    task.stop()
    task.close()
    
    task = nidaqmx.Task()
    task.ai_channels.add_ai_voltage_chan("Dev1/ai1",max_val=10, min_val=0)
    task.timing.cfg_samp_clk_timing(s_freq, sample_mode=nidaqmx.constants.AcquisitionType.FINITE, samps_per_chan=num_samples)
    task.start()
    value = task.read(number_of_samples_per_channel=num_samples)
    task.stop()
    task.close()
return value
 

Ответ №1:

Я думаю, проблема в том, что вы устанавливаете триггер не на ai1 канал, а на ai0 канал. Попробуй это:

 def readdaq():
    task = nidaqmx.Task()
    task.ai_channels.add_ai_voltage_chan("Dev1/ai1",max_val=10, min_val=0)
    task.triggers.reference_trigger.cfg_anlg_edge_ref_trig("Dev1/ai0", pretrigger_samples = 10, trigger_slope=nidaqmx.constants.Slope.FALLING, trigger_level = 5)
    task.timing.cfg_samp_clk_timing(s_freq, sample_mode=nidaqmx.constants.AcquisitionType.FINITE, samps_per_chan=num_samples)
    task.start()
    value = task.read(number_of_samples_per_channel=num_samples)
    task.stop()
    task.close()
return value
 

Таким образом , задача создается только для канала ai1 , и она устанавливает триггер на основе ai0 канала.