You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python+NI-DAQmx为NI 9207配置采样率并实现连续采样?

解决NI 9207搭配cDAQ-9171使用Convert Clock的连续采样配置问题

错误原因

NI 9207是逐通道扫描型ADC,其内部的ai/ConvertClock是用于单通道转换的时钟,硬件不支持将其直接作为SampleClock的源——这是你遇到错误码-89136的核心原因。而你之前使用的NI 9229是同步采样型设备,所有通道同时采样,时钟逻辑与扫描型设备完全不同。

正确配置逻辑

对于扫描型AI设备:

  • Convert Clock:控制单个通道的转换速率,NI 9207最大支持1MS/s
  • Sample Clock(扫描时钟):控制一轮所有通道完成采样的速率,计算公式为:扫描速率 = Convert Clock速率 / 通道数
  • 连续采集需要同时配置这两个时钟,并设置合理的缓冲区大小。

代码实现

替换你原有的cfg_samp_clk_timing调用,按以下步骤配置:

import nidaqmx
from nidaqmx.constants import AcquisitionType, Edge

# 初始化任务(假设self.task已创建)
# 先添加16个AI通道
for chan_idx in range(16):
    self.task.ai_channels.add_ai_voltage_chan(f"{self.daqName}/ai{chan_idx}")

# 1. 配置Convert Clock(单通道转换时钟)
# 这里设置为1MS/s(NI 9207最大值),16通道下扫描速率为1e6/16=62500 S/s
self.task.timing.cfg_conv_clk_timing(
    rate=1000000,
    source=f"/{self.daqName}/ai/ConvertClock",
    active_edge=Edge.RISING
)

# 2. 配置Sample Clock(扫描时钟,即总采样率)
sample_rate = 62500  # 对应16通道的扫描速率
self.task.timing.cfg_samp_clk_timing(
    rate=sample_rate,
    sample_mode=AcquisitionType.CONTINUOUS,
    samps_per_chan=self.numberOfSamples
)

# 可选:注册缓冲区满回调(适配tkinter实时更新)
def on_buffer_filled(task_handle, event_type, num_samples, callback_data):
    # 读取缓冲区数据
    data = self.task.read(number_of_samples_per_channel=num_samples)
    # 在这里处理数据,比如更新tkinter界面
    return 0

self.task.register_every_n_samples_acquired_into_buffer_event(
    self.numberOfSamples, on_buffer_filled
)

# 启动任务
self.task.start()

关键注意事项

  • 若需要调整总采样率,需同步修改Convert Clock速率和Sample Clock速率,保持Sample Clock速率 = Convert Clock速率 / 通道数的关系
  • NI 9207的Convert Clock速率范围为10S/s到1MS/s,需确保计算后的扫描速率在硬件支持范围内
  • 缓冲区大小samps_per_chan建议设置为采样率的0.5-1倍,避免数据溢出或频繁读取

内容的提问来源于stack exchange,提问作者Chazzo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 08:42:51