首页 > 解决方案 > 使用 NIDAQmx 触发输出任务

问题描述

我无法在 NIDAQ usb6002 上执行我认为应该是一项非常简单的任务:我有一个低频正弦波,我正在模拟输入通道上测量,当它越过零时,我想点亮一个LED 1 秒。我正在尝试使用 nidaqmx Python API,但无法通过文档解决我的一些基本问题。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

我确信代码也存在其他问题。例如,采样时钟的操作似乎比我上面写的要复杂得多,但我找不到任何解释它在这种情况下如何工作的东西。

提前感谢您的帮助!

标签: pythonnidaqmxdaq-mx

解决方案


对于 NI,它是“RTFM”

对 NI 设备进行编程时,通常需要本手册。

  1. NI-DAQmx 帮助(用于编程部分)
  2. 设备规格(用于设备部分

您需要两者,因为 NI-DAQmx API 支持NI 制造的所有DAQ 设备,但并非每个设备都具有相同的功能。“能力”不仅包括每种通道的数量,还包括定时触发子系统以及内部信号路由。与一台设备一起运行的 DAQmx 应用程序不能保证与另一台设备一起运行,因为该应用程序可能以第二台设备无法支持的方式使用 API。

最后,在文档方面,任何给定的 NI DAQ 设备通常都属于相关设备系列,并且这些系列有一本名为User Guide的手册。这些用户指南充当 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 V 和 2.3 V 之间。

更改您的 Python 程序以从模拟输入流中检测过零,当它检测到时,使其调用stop(),然后start()执行 AO 任务​​。

停止-启动序列的原因是重新触发:您希望在每个过零时点亮 LED,但除非任务已停止(通过 API 或通过完成其任务)或配置为重新触发,否则无法重新启动任务。由于 6002 属于低成本系列,因此该硬件功能不可用,因此您必须使用 API 停止 AO 任务​​或等待 AO 生成完成后再重新启动 LED 脉冲

6002 AO 规格

来自 6002 规范的剪辑,显示了模拟输出子系统的功能


推荐阅读