python - 使用 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
我确信代码也存在其他问题。例如,采样时钟的操作似乎比我上面写的要复杂得多,但我找不到任何解释它在这种情况下如何工作的东西。
提前感谢您的帮助!
解决方案
对于 NI,它是“RTFM”
对 NI 设备进行编程时,通常需要两本手册。
- NI-DAQmx 帮助(用于编程部分)
- 设备规格(用于设备部分)
您需要两者,因为 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 规格
推荐阅读
- mongodb - 真正缓慢的 MongoDB 查询背后的原因可能是什么?
- javascript - 打字时增加输入高度
- c++ - const 引用传递的参数的可变左值引用
- android - Android Studio:清单合并失败并出现多个错误
- amazon-web-services - 我无法读取环境变量(Go 中的 aws-lambda)
- linux - 什么是 rtnetlink(linux os),netlink 和 rtnetlink 有什么区别?
- angular - 我在我的 ASP.NET MVC & Entity Framework 项目中输入日期为“10/09/2019”,但在数据库中它保存为“1.1.0001 00:00:00”
- javascript - 循环的文件预览适用于一个项目,两个或多个文件重复上一个文件
- php - 如果有特定的 get 参数,则重定向到新地址
- java - 如何将两个不同的字符串日期转换为单个日期格式