2

我最近刚刚开始使用 MATLAB 从数据采集板上采集数据,并且需要一个函数来连续采集数据(即直到我 ctrl^C 退出该函数)。为此,我在 32 位 Windows 操作系统上使用数据采集工具箱。

根据 matlab 帮助中的文档和本网站上的一些答案,我发现在向输入句柄添加通道后,我应该:

  1. 将我的“SamplesPerTrigger”设置为 Inf
  2. 将“TimerPeriod”设置为某个值以触发“TimerFcn”
  3. 将“TimerFcn”设置为一些子函数回调,它将数据附加到持久变量

这是正确的方法吗?

我的代码如下:

  function acquire_arena_test(samprate,daq_device ,device_ID ,channels, saveroot)
        setup.SampleRate = samprate;
        setup.DAQdevice = {daq_device, device_ID};
        setup.AIChannels = channels;            
        setup.SaveRoot = {saveroot};


        ai = analoginput(setup.DAQdevice{1},setup.DAQdevice{2});
        addchannel(ai,[setup.AIChannels]);
        set(ai,'SamplesPerTrigger',Inf);
        set(ai,'TimerPeriod',0.5);
        set(ai,'TimerFcn',{@AcquireData,ai});

        start(ai);

        while(strcmpi(get(ai,'Running'),'On'))
            pause(1)
        end

        stop(ai);
        time = datestr(now,30);
        save([saveroot time], 'data');
        delete(ai);
        clear ai;


        function AcquireData(hObject, ~)
            persistent totalData;
            data = getdata(hObject);
            if isempty(totalData)
                totalData =data;
            else
                totalData = [totalData; data];
            end

初始模拟输入肯定工作正常。我尝试了许多将 AcquireData 回调提供给“TimerFcn”的排列方式。我收到的错误是

`??? 错误使用 ==> acquire_arena_test>AcquireData 输入参数太多。

警告: TimerFcn 回调被禁用。要启用回调,请设置 TimerFcn 属性。`

提前感谢您的帮助。

4

2 回答 2

1

我认为您用于设置 TimerFcn 的语法是错误的。你写

set(ai,'TimerFcn',{@AcquireData,ai});

但这意味着您的函数 AcquireData 将使用树参数调用:AcquireData(ai, event, ai)如此处所述,这当然会触发错误消息,因为您的AcquireData函数只接受两个参数。只需将您的代码更改为

set(ai,'TimerFcn',@AcquireData);

它应该可以工作;ai 对象作为第一个参数自动传递(请参阅上面的 MATLAB 文档链接)。

于 2011-08-31T18:29:20.313 回答
1

很抱歉回答我自己的问题,但我想通了。毕竟不需要触发器。使用国家仪器板(或声卡,事实证明),您只需将 LoggingMode 更改为“磁盘”并指定一个文件来保存 .daq(数据采集工具箱)文件以使用 LogFileName 保存。如果要使用板上的内存,请将模式更改为磁盘和内存。有用的文件:

http://www.mathworks.com/help/toolbox/daq/f12-16658.html

下面的脚本在暂停期间获取数据,只要您希望它是..

daqreset;
clear all;
ai = analoginput('nidaq','Dev1');
chans = addchannel(ai,0:6);
set(ai,'SamplesPerTrigger',Inf);
set(ai,'SampleRate',1000)
set(ai,'LogToDiskMode','Overwrite')
set(ai,'LogFileName','log.daq')
set(ai,'LoggingMode', 'disk') 

start(ai)

pause()
stop(ai)

data = daqread('log.daq');
delete(ai);

请注意,您仍然需要将“SamplesPerTrigger”设置为 Inf 才能正常工作。也感谢乔纳斯的帮助。

于 2011-08-31T21:32:49.633 回答