gpt4 book ai didi

python - 使用 NIDAQmx 触发输出任务

转载 作者:行者123 更新时间:2023-12-01 01:25:47 25 4
gpt4 key购买 nike

我在 NIDAQ usb6002 上执行我认为应该是非常简单的任务时遇到了困难:我在模拟输入 channel 上测量低频正弦波,当它过零时我想点亮 LED 1 秒。我正在尝试使用 nidaqmx Python API,但无法通过文档解决我的一些基本问题。 https://nidaqmx-python.readthedocs.io/en/latest/

如果任何人都可以提供有关代码或我的设置的基本逻辑的任何想法,那将非常有帮助。

这是我到目前为止所尝试过的。我从一些导入和 channel 的定义开始:

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

我不知道为什么这里不支持模拟输入 channel 。本文档的第 245 页听起来应该是:https://media.readthedocs.org/pdf/nidaqmx-python/latest/nidaqmx-python.pdf

我确信代码还存在其他问题。例如,示例时钟操作似乎比我上面写的要复杂得多,但我无法找到任何解释它在这种情况下如何工作的内容。

预先感谢您的帮助!

最佳答案

对于 NI,它是“RTFM”

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

  1. NI-DAQmx Help (对于编程部分)
  2. device specification (对于设备部分)

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

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

对于此设备,您唯一的选择是软件触发,因为 PFI 线路是数字触发,并且其触发电平指定为 0.8 V 到 2.3 V 之间。

更改您的 Python 程序以检测模拟输入流中的过零,并在出现过零时调用 stop()然后start()关于 AO 任务​​。

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

6002 AO Specification

clip from 6002 specifications showing the analog output subsystem capabilities

关于python - 使用 NIDAQmx 触发输出任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53356449/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com