8

我正在构建一个 MATLAB GUI 来从 Tektronix DPO4104 示波器(此处为 MATLAB 驱动程序)收集数据。

我正在玩弄tmtool我的 GUI 代码,发现驱动程序只能收集 ​​10,000 个数据点,无论示波器是否设置为显示超过 10k 点。我在 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. 利润。

我仍然无法tmtool通过我的 GUI 或通过我的 GUI 收集超过 10,000 点。任何帮助,将不胜感激。

4

4 回答 4

2

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

于 2012-12-21T17:54:37.767 回答
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');

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

于 2013-01-09T18:26:33.353 回答
1

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

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

于 2012-12-21T16:09:07.867 回答
0

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

于 2012-12-24T01:24:42.583 回答