Запуск выходной задачи с NIDAQmx - PullRequest
0 голосов
/ 18 ноября 2018

У меня проблемы с выполнением, как мне кажется, довольно простой задачи на NIDAQ usb6002: у меня низкочастотная синусоида, которую я измеряю на аналоговом входном канале, и когда она пересекает ноль, мне бы хотелось зажечь светодиод на 1 секунду. Я пытаюсь использовать API-интерфейс Python nidaqmx, но не смог разобраться с некоторыми из моих основных вопросов с помощью документации. https://nidaqmx -python.readthedocs.io / ен / последний /

Если кто-то может высказать какие-либо мысли о коде или основной логике моей установки, это было бы чрезвычайно полезно.

Вот что я пробовал до сих пор. Я начну с импорта и определения моих каналов:

import matplotlib.pyplot as plt
from math import *
import nidaqmx
from nidaqmx import *
from nidaqmx.constants import *
import time

V_PIN = "Dev1/ai6"
LED_PIN = "Dev1/ao0"

Я понимаю, как задачи и вещи работают в целом. Я могу без проблем читать и отображать сигнал с заданной частотой дискретизации и количеством выборок, используя методы task.ai_channels. Но вот мое лучшее предположение о том, как выполнить «обнаружение нуля и запуск триггера»:

writeLED = nidaqmx.Task('LED')
writeLED.ao_channels.add_ao_voltage_chan(LED_PIN)
writeLED.timing.cfg_samp_clk_timing(1)
writeLED.triggers.start_trigger.cfg_anlg_edge_start_trig(V_PIN,trigger_level = 0)
writeLED.write([5], auto_start=True)

Это дает мне ошибку ниже в строке cfg_anlg_edge

DaqError: Requested value is not a supported value for this property. The property value may be invalid because it conflicts with another property.
Property: DAQmx_StartTrig_Type
Requested Value: DAQmx_Val_AnlgEdge
Possible Values: DAQmx_Val_DigEdge, DAQmx_Val_None

Я не знаю, почему канал аналогового ввода здесь не поддерживается. Страница 245 этого документа звучит так, как должно быть: https://media.readthedocs.org/pdf/nidaqmx-python/latest/nidaqmx-python.pdf

Уверен, есть и другие проблемы с кодом. Например, кажется, что примеры манипуляции с часами немного сложнее, чем то, что я написал выше, но я не смог найти ничего, что объясняло бы, как это будет работать в этой ситуации.

Заранее спасибо за любую помощь!

Ответы [ 2 ]

0 голосов
/ 09 мая 2019

Программный запуск не в режиме реального времени, у вас будет недетерминированная задержка, прежде чем светодиод включится. Это зависит от вашей программы, интерфейсов, задержек USB, производительности ПК ...

В противном случае вы можете использовать компаратор (например, lm393) для запуска цифрового входа (PFI0 или PFI1).

Хотя это всего лишь светодиод, вероятно, это не критично, если задержка изменяется в течение миллисекунд.

0 голосов
/ 19 ноября 2018

С NI это "RTFMs"

При программировании устройств NI обычно требуются два руководства.

  1. Справка NI-DAQmx (для программирования )
  2. спецификация устройства (для устройства part)

Вам нужны оба, потому что API NI-DAQmx поддерживает каждое DAQ устройство, которое NI производит, но не каждое устройство имеет одинаковые возможности. «Возможности» включают в себя не только количество каналов каждого вида, но также подсистемы хронирования и , запускающие , а также внутреннюю маршрутизацию сигналов. Приложение DAQmx, работающее с одним устройством, не гарантированно будет работать с другим, поскольку приложение может использовать API таким способом, которым второе устройство не может поддерживать.

Наконец, в области документации, любое данное устройство NI DAQ обычно принадлежит к семейству связанных устройств, и эти семейства также имеют руководство под названием Руководство пользователя . Эти руководства пользователя служат мостом между API и спецификацией устройства, помогая понять, как устройство реагирует на команды. Для 6002 это семейство «недорогих DAQ USB-устройств» .

Аналоговый триггер для аналогового выхода на NI 6002

Ваше определение верно, что

writeLED.triggers.start_trigger.cfg_anlg_edge_start_trig(V_PIN,trigger_level = 0)

возможно возможно, просто , а не для USB 6002. Эта строка запрашивает подсистему аналогового вывода использовать аналоговый граничный триггер, но подсистема аналогового вывода для 6002 имеет только эти триггерные возможности:

  • программное обеспечение
  • PFI 0
  • PFI 1

Для этого устройства единственным вариантом является software триггер, поскольку линии PFI являются цифровыми триггерами, а их уровень запуска указан в диапазоне от 0,8 В до 2,3 В.

Измените вашу программу на Python так, чтобы она обнаруживала пересечение нуля из потока аналогового ввода, и, когда это произойдет, заставьте ее вызвать stop(), а затем start() в AO задача.

Причиной последовательности остановки-запуска является повторное срабатывание : вы хотите зажечь светодиод для каждый пересечения нуля, но задание не может быть перезапущено, если только он был либо остановлен (API или выполнением его задачи), либо настроен для повторного запуска. Поскольку 6002 принадлежит к недорогому семейству, эта аппаратная функция недоступна, поэтому вы должны использовать API, чтобы остановить задачу AO или дождаться завершения генерации AO, прежде чем перезапустить импульс для светодиода

6002 АО Спецификация

clip from 6002 specifications showing the analog output subsystem capabilities

...