Matlab 中的实时 NI-DAQ 数据图

问题描述 投票:0回答:3

我正在尝试获取使用 NI USB-6008 采集的实时数据图。我尝试用arduino做同样的事情,并得到了一个完全符合我想要的图(参见这里https://i.stack.imgur.com/08kzU.jpg),并且x轴会实时移动,但我无法定义采样率。通过 NI,我能够定义我想要的采样率,但我无法以连续、实时的方式显示数据,我一次只能看到 1 秒,而且我需要能够访问所有数据因为我想测量实时脑电图而获得的数据。我是一个新的 matlab 用户,所以请不要考虑以前的知识。

这是我到目前为止得到的代码:

clear
close all

dq = daq("ni");
ch1 = addinput(dq, "Dev1", "ai0", "Voltage");
dq.Rate = 1000;
dq.ScansAvailableFcn = @(src,evt) plotDataAvailable(src, evt);
dq.ScansAvailableFcnCount = 100;
start(dq, "Duration", seconds(5))

while dq.Running
    pause(0.5);
end

time = 0;
data = 0;
n = ceil(dq.Rate/10);

%Set up Plot
figure(1)
plotGraph = plot(time,data); 
title('DAQ data log','FontSize',15);
xlabel ('Elapsed Time (s)','FontSize',10); ylabel('Voltage (V)','FontSize',10);
h = animatedline;
ax = gca;
ax.YGrid = 'on';
ax.XGrid = 'on';
h = animatedline;
function plotDataAvailable(src, ~)
    while ishandle(plotGraph) % Loop when Plot is Active will run until plot is closed
        data = read(dq,n);
        t =  datetime('now');
        % Add points to animation
        addpoints(h,datenum(t),data)
        % Update axes
        ax.XLim = datenum([t-seconds(15) t]);
        datetick('x','keeplimits')
        drawnow
    end
end

这是我之前的arduino代码,它向我展示了我需要的图(采样率错误):

clear
clc

%User Defined Properties 
a = arduino('com4','uno');              % Define the Arduino Communication port
plotTitle = 'Arduino Data Log';         % Plot title

%Define Function Variables
time = 0;
data = 0;

%Set up Plot
figure(1)
plotGraph = plot(time,data,'-r' ); 
title(plotTitle,'FontSize',15);
xlabel ('Elapsed Time (s)','FontSize',10); ylabel('Voltage (V)','FontSize',10);
h = animatedline;
ax = gca;
ax.YGrid = 'on';
ax.XGrid = 'on';
ax.YLim = [0 5];            % Sets y-min and y-max
while ishandle(plotGraph) % Loop when Plot is Active will run until plot is closed
        startIteration = tic;
        voltagem = readVoltage(a,'A0')
        t =  datetime('now');
        % Add points to animation
        addpoints(h,datenum(t),voltagem)
        % Update axes
        ax.XLim = datenum([t-seconds(15) t]);
        datetick('x','keeplimits')
        drawnow
end

我尝试在我的 NI 数据上使用这个 while 循环,但它不起作用。

我非常感谢您的帮助。

matlab real-time-data nidaqmx
3个回答
0
投票

您的操作顺序错误。您的代码目前正在执行的操作是:

  1. 初始化数据采集
  2. 从硬件读取数据,同时尝试将数据添加到不存在的行
  3. 初始化动画线条。

此外,在您的

addpoints
调用中,您尝试绘制 t(标量)和 data(数组)。

你应该做的是:

clear
close all

% Set up the plot
figure(1)
title('DAQ data log','FontSize',15);
xlabel ('Elapsed Time (s)','FontSize',10)
ylabel('Voltage (V)','FontSize',10);
h = animatedline;
ax = gca;
ax.YGrid = 'on';
ax.XGrid = 'on';

% Set up the data acquisition
dq = daq("ni");
ch1 = addinput(dq, "Dev1", "ai0", "Voltage");
dq.Rate = 1000;
dq.ScansAvailableFcn = {@plotDataAvailable, h, ax}; % pass also the handle to the line and to the axes
dq.ScansAvailableFcnCount = 100;

% Now you start the data acquisition
start(dq, "Duration", seconds(5))


function plotDataAvailable(src, evt, h, ax)
    data = read(dq, n);
    % maybe your time array should look something like this?
    t = datetime(now) - seconds((length(data)-1:-1:0)./src.Rate);

    % Add points to animated line
    addpoints(h, datenum(t), data)

    % Update axes
    % ax.XLim = datenum([t-seconds(15) t]); % this line is useless, why would you have a 15s window when your data acquisition is only 5s long?
    datetick('x','keeplimits')
    drawnow

end

我目前无法尝试此操作,因此它可能无法正常工作。


0
投票

所以我想我终于明白了,因为我得到了我想要的情节,x 轴实时移动。但是,我仍然收到错误消息“无法识别的表变量名称'Dev1_ai0'”事件,尽管我检查了这是我想要的行的名称。无论如何,这就是我的代码现在的样子。

clear
close all

time = 0;
data = 0;

% Set up the plot
figure(1)
plotGraph = plot(time,data,'-r' ); 
title('DAQ data log','FontSize',15);
xlabel ('Elapsed Time (s)','FontSize',10)
ylabel('Voltage (V)','FontSize',10);
h = animatedline;
ax = gca;
ax.YGrid = 'on';
ax.XGrid = 'on';

% Set up the data acquisition
dq = daq("ni");
ch1 = addinput(dq, "Dev1", "ai0", "Voltage");
dq.Rate = 1000;

% Start the data acquisition
start(dq, "Duration", seconds(10))
n = ceil(dq.Rate/10);


while ishandle(plotGraph)
    data = read(dq, n);
    voltage = data.Dev1_ai0;
    
    t = datetime('now');
    
    for i = 1:100
    % Add points to animated line
        if isvalid(h)
        addpoints(h, datenum(t), voltage(i))
        end
    end

    % Update axes
    ax.XLim = datenum([t-seconds(15) t]);
    datetick('x','keeplimits')
    drawnow

end

disp('Plot Closed')

0
投票

“这个博客的与众不同之处在于它能够让各个级别的读者都能理解复杂的主题。无论您是经验丰富的专业人士还是新手,您都可以在这里找到有价值的内容。”请访问 https://www.proact-ims.com/ 探索尖端服务和产品,或致电 +91 80 3542 9949 联系我们以获得协作和创新机会。利用 Proact 的专业知识提升您的项目。

© www.soinside.com 2019 - 2024. All rights reserved.