使用 NIDAQmx 触发输出任务
Triggering an output task with 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 方法毫无困难地读取和绘制给定采样率和样本数量的信号。但这是我对如何执行 "detect zero and trigger output":
的最佳猜测
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
我确定代码也存在其他问题。例如,样本时钟操作似乎比我上面写的要复杂得多,但我无法找到任何解释它在这种情况下如何工作的内容。
在此先感谢您的帮助!
对于 NI,它是 "RTFMs"
对 NI 设备进行编程时,通常需要 两本 手册。
- NI-DAQmx Help(对于编程部分)
- device specification(对于 设备 部分)
你需要两者,因为 NI-DAQmx API 支持 NI 制造的每个 DAQ 设备,但并非每个设备都具有相同的功能。 "Capabilities" 不仅包括每种通道的数量,还包括 定时 和 触发 子系统以及内部信号路由。 DAQmx 应用程序在一个设备上 运行 不能保证在另一个设备上 运行,因为该应用程序可能会以第二个设备不支持的方式使用 API。
最后,在文档方面,任何给定的 NI DAQ 设备通常都属于相关设备系列,这些系列也有一本名为用户指南[的手册] =65=]。这些用户指南充当 API 和设备规范之间的桥梁,帮助您了解设备如何响应命令。对于 6002,系列是 "Low-Cost DAQ USB Device"。
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 程序以检测来自模拟输入流的过零,当它检测到时,使其在 AO 任务上调用 stop()
and then start()
。
停止-启动顺序的原因是retriggering:您想点亮 LED 每个 过零,但任务无法重新启动,除非它有已停止(由 API 或完成其任务)或配置为重新触发。由于 6002 属于低成本系列,此硬件功能不可用,因此您必须使用 API 停止 AO 任务或等待 AO 生成完成后再重新启动 LED 的脉冲
6002 AO Specification
软件触发不是 real-time,在 LED 点亮之前会有 non-deterministic 延迟。这取决于您的程序、接口、USB 延迟、PC 性能...
否则,您可以使用比较器(如 lm393)来触发数字输入(PFI0 或 PFI1)。
虽然它只是一个LED,但如果延迟在毫秒内变化,它可能并不重要。
我在 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 方法毫无困难地读取和绘制给定采样率和样本数量的信号。但这是我对如何执行 "detect zero and trigger output":
的最佳猜测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
我确定代码也存在其他问题。例如,样本时钟操作似乎比我上面写的要复杂得多,但我无法找到任何解释它在这种情况下如何工作的内容。
在此先感谢您的帮助!
对于 NI,它是 "RTFMs"
对 NI 设备进行编程时,通常需要 两本 手册。
- NI-DAQmx Help(对于编程部分)
- device specification(对于 设备 部分)
你需要两者,因为 NI-DAQmx API 支持 NI 制造的每个 DAQ 设备,但并非每个设备都具有相同的功能。 "Capabilities" 不仅包括每种通道的数量,还包括 定时 和 触发 子系统以及内部信号路由。 DAQmx 应用程序在一个设备上 运行 不能保证在另一个设备上 运行,因为该应用程序可能会以第二个设备不支持的方式使用 API。
最后,在文档方面,任何给定的 NI DAQ 设备通常都属于相关设备系列,这些系列也有一本名为用户指南[的手册] =65=]。这些用户指南充当 API 和设备规范之间的桥梁,帮助您了解设备如何响应命令。对于 6002,系列是 "Low-Cost DAQ USB Device"。
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 程序以检测来自模拟输入流的过零,当它检测到时,使其在 AO 任务上调用 stop()
and then start()
。
停止-启动顺序的原因是retriggering:您想点亮 LED 每个 过零,但任务无法重新启动,除非它有已停止(由 API 或完成其任务)或配置为重新触发。由于 6002 属于低成本系列,此硬件功能不可用,因此您必须使用 API 停止 AO 任务或等待 AO 生成完成后再重新启动 LED 的脉冲
6002 AO Specification
软件触发不是 real-time,在 LED 点亮之前会有 non-deterministic 延迟。这取决于您的程序、接口、USB 延迟、PC 性能...
否则,您可以使用比较器(如 lm393)来触发数字输入(PFI0 或 PFI1)。
虽然它只是一个LED,但如果延迟在毫秒内变化,它可能并不重要。