从Tektronix示波器中收集10,000多个数据点?

时间:2012-12-17 20:26:16

标签: matlab oscilloscope

我正在构建一个MATLAB GUI,用于从Tektronix DPO4104示波器(MATLAB驱动程序here)进行数据采集。

我正在使用tmtool并使用我的GUI代码,并且发现驱动程序只能收集10,000个数据点,无论示波器是否设置为显示超过10k点。我找到了this post on in CCSM,但它并没有非常有用。 (如果您愿意阅读它,我是那里的最后一篇文章。)我正在使用DPO4104驱动程序,而本文则讨论了DPO4100驱动程序的使用,我相信。

据我所知,步骤如下:

  1. 编辑驱动程序的readwaveform函数以说明当前的recordLength - 在我的情况下,可以说是100,000点。
  2. 将驱动程序的MaxNumberPoint手动编辑为10,000到100,000。 (在我的情况下,默认数字是0 ..我将其更改为100,000)。
  3. 手动修改EndingPoint。我也将它设置为100,000。
  4. 在创建设备对象之前,set(interfaceObj, 'InputBufferLength', 2.5*recordLength),即确保输入缓冲区可以容纳超过100,000个点。建议至少使用预期缓冲区的两倍。我之所以使用2.5只是因为。
  5. 构建设备对象和波形对象,connect()readwaveform。利润。
  6. 我仍无法通过tmtool或通过我的GUI收集超过10,000点积分。任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:2)

我找到了泰克工程师;他基本上告诉我只是直接使用SCPI命令并跳过驱动程序。虽然很烦人,但这可能是最简单的解决方案。

答案 1 :(得分:1)

您是否有可能一次收集10,000个数据点,然后将它们保存在某处,收集下一个10,000,将它们附加到保存的点,重复?

这是一种解决方法,当然。

答案 2 :(得分:1)

我明白了!我认为。花几周的时间退后一步,刷新真的很有帮助。这是我做的:

1)编辑驱动程序的init函数以配置更大的缓冲区大小。完成init代码:

function init(obj)
% This method is called after the object is created.
% OBJ is the device object.
% End of function definition - DO NOT EDIT

% Extract the interface object.
interface = get(obj, 'Interface');

fclose(interface);

% Configure the buffer size to allow for waveform transfer.
set(interface, 'InputBufferSize', 12e6);
set(interface, 'OutputBufferSize', 12e6); % Originally is set to 50,000

我最初尝试将缓冲区大小设置为22e6(我想得到1000万点),但我得到了内存不足的错误。据推测,缓冲区应该比预期的高出一倍,加上标题空间。我可能不需要200万点的“标题”,但是呃。

2)编辑驱动程序的readwaveform()以首先查询用户可设置的点数应该是什么。然后,将SCPI命令写入范围,以确保要传输的数据点数等于用户所需的点数。以下代码段将在readwaveform中执行此操作:

try 
    % Specify source
    fprintf(interface,['DATA:SOURCE ' trueSource]);

    %----------BEGIN CODE TO HANDLE MORE THAN 10k POINTS----------
    recordLength = query(interface, 'HORizontal:RECordlength?');
    fprintf(interface, 'DATA:START 1');
    fprintf(interface, 'DATA:STOP %d', str2num(recordLength));
    %----------END CODE TO HANDLE MORE THAN 10k POINTS----------

    % Issue the curve transfer command.
    fprintf(interface, 'CURVE?');

    raw = binblockread(interface, 'int16');

    % Tektronix scopes send and extra terminator after the binblock.
    fread(interface, 1);

3)在用户代码中,设置SCPI命令以将记录大小更改为基础接口对象:

% interfaceObj is a VISA object.
fprintf(interfaceObj, 'HORizontal:RECordlength 5000000');

你有它。希望这可以帮助那些试图解决这个问题的人。

答案 3 :(得分:0)

这是个坏主意。开始收集10,000点。当你达到5000点时,再次开始收集数据(你可能需要在一个新线程中运行它)。继续前进,直到您需要的所有数据都存储在20个数据结构中。然后,通过排列数据点将结构组合成一个结构。这可能比直接调用SCPI命令更有用,并且可能有一些我没有想到的令人讨厌的警告。但正如我所说,这是一个坏主意......