Запуск задачи вывода с помощью NIDAQmx

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

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

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

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

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

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


person kb4444    schedule 17.11.2018    source источник


Ответы (2)


С NI это "RTFM"

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

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

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

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

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

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

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

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

  • программное обеспечение
  • ПФИ 0
  • ПФИ 1

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

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

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

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

вырез из спецификаций 6002, показывающий возможности подсистемы аналогового вывода

person Joe Friedrichsen    schedule 19.11.2018

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

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

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

person Rémi Baudoux    schedule 09.05.2019