如何用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/sSample 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
相关产品推荐
相关产品推荐

