【发布时间】:2021-06-18 21:58:04
【问题描述】:
我正在尝试获取我使用 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 循环,但它不起作用。
非常感谢您的帮助。
【问题讨论】:
-
您以 1000Hz 的频率进行采样,并且只要缓冲区中有 1000 个样本,就会调用您的回调函数,因此很自然地会以(大约)1 秒的间隔调用它。一般来说,如果你想以fCallback的频率调用回调函数,你需要将可用样本数设置为
fSampling/fCallback。因此,例如,如果要以 10Hz(每 0.1s)的频率进行绘图,则必须将样本数设置为1000/10 = 100。 -
此外,您在每次调用回调函数时都会创建新的
animatedlines,这正是animatedlines 应该帮助您防止这样做的。在开始采样之前创建animatedlines,然后只要有新数据可用,就只给他们addpoints。 -
但是我需要绘图来显示至少 10 秒的数据,并且我需要能够访问我记录的所有数据,而不仅仅是最后 10 秒。关于
addpoints函数,它不起作用,因为我从NI得到的数据不是double -
1) 总采样持续时间(您的 10 秒)与
ScansAvailableFcnCount属性无关。正如我上面所说,这只告诉程序多久调用一次回调函数,所以这就是你需要改变的。 2)read()返回double,所以没有问题。 3) 即使没有,您也可以随时将变量转换为其他类型。 -
哦!好的,我已经解决了。现在我无法弄清楚为什么我的代码根本不起作用。我不知道我是否可以像使用 arduino 一样做,但这就是我目前所拥有的。你能看看吗?非常感谢你的帮助顺便说一句
标签: matlab real-time-data nidaqmx