我正在编写一个输出到控制设备的DAQ的代码。我想让它每1秒发出一次信号。根据我的处理程序的性能,代码有时需要更长或更短的时间。有没有办法改善这段代码? 经过的时间是1.000877秒。 经过的时间是0.992847秒。 经过的时间是0.996886秒。
for i= 1:100
tic
pause(.99)
toc
end
答案 0 :(得分:3)
已知使用pause
是相当不精确的(大约10毫秒)。最近版本的Matlab已将tic toc
优化为低开销且尽可能精确(参见here)。
使用以下代码,您可以使用tic toc
比暂停更精确:
ntimes = 100;
times = zeros(ntimes,1);
time_dur = 0.99;
for i= 1:ntimes
outer = tic;
while toc(outer) < time_dur
end
times(i) = toc(outer);
end
mean(times)
std(times)
以下是50次测量的结果:mean = 0.9900
std = 1.0503e-5
,比使用暂停要精确得多。
暂停使用原始代码进行50次测量,我得到:mean = 0.9981
std = 0.0037
。
答案 1 :(得分:1)
这是shimizu答案的改进版本。主要问题是最小的时钟漂移。每次迭代都会获取时间戳,然后重置计时器。时钟随着这两个命令的执行时间而漂移。
辅助次要改进结合pause
和tic-toc技术来降低cpu负载。
ntimes = 100;
times = zeros(ntimes,1);
time_dur = 0.99;
t = tic;
for ix= 1:ntimes
pause((time_dur*ix-toc(t)-0.1))
while toc(t) < time_dur*ix
end
times(ix) = toc(t);
end
mean(diff(times))
std(diff(times))
答案 2 :(得分:0)
如果您希望DAQ每秒更新一次,请使用带有FIFO缓冲区和时钟的DAQ,并配置为每秒从FIFO中读取一次值。
即使您的MATLAB任务迭代间隔一秒钟运行,与DAQ通信的延迟不一致也会影响您的时间。