我一直使用ArduinoIO-Matlab接口从Matlab控制Arduino。我目前的设置是,我有3个肌电肌肉传感器(来自Advancer Technologies)连接到Arduino的模拟引脚1、2和3。Arduino连接到Matlab。我试图同时从这三个引脚收集数据,并将它们存储在一个1000x3大小的矩阵中。我的问题是Matlab从模拟引脚采样的速率。从3个引脚同时采集1000个读数大约需要25秒。我知道arduino本身的采样速度更高。下面是我的代码。我如何改变它,以在10秒内获得大约1000个样本的采样率?
ar = arduino('COM3');
ax = zeros(1000,3);
for ai = 1:1000
ax(ai,:) = [ar.analogRead(1) ar.analogRead(2) ar.analogRead(3)];
end
delete(ar);
这是上述代码(配置文件查看器)所用的时间:
time calls line
< 0.01 1 3 ax = zeros(1000,3);
4
< 0.01 1 5 for ai = 1:1000
25.07 1000 6 ax(ai,:) = [ar.analogRead(1) ar.analogRead(2) ar.analogRead(3)];
1000 7 end
8
1.24 1 9 delete(ar);
如果我还有什么需要澄清的,请告诉我。谢谢:Denter code here
发布于 2013-07-21 06:20:58
您需要修改arduino c++代码(.pde文件)。在这段代码中,您应该按照自己的喜好对信号进行采样(例如,1000),然后使用serial.writeln()方法将采样的数据传输到matlab。
这将给你一个~3 3KHz的采样率(取决于许多因素)…
发布于 2015-04-10 15:15:42
下面很可能解释了你所看到的结果,以及为什么你需要做一些像穆罕默德的答案所建议的事情。虽然他的回答暗示了这一原因,但并没有详细说明,以便其他人可以避免“陷阱”。
我无法访问所需的底层代码和系统来确定地检查这个答案。这个答案是基于“典型的方法”,有一定的可能性纯粹是胡说八道的tm,但观察和标准方法之间的精确契合表明这就是正在发生的事情。手中有必要的系统的人只需稍微钻研一下,就能证明这是否正确。
当数据每次发送一个数据样本时,每个样本产生的开销远远超过仅传输原始数据所需的时间。
你说传输3000个样品需要25秒。
每个样本的时间=25/3,000=每个样本8.333毫秒。
假设数据传输率为9600波特。
默认的通信速度可能只有9600波特。这是可以检查的,但结果表明这可能是正确的,并且做出稍微不同的假设提供了同样好的解释。
串行通信通常使用N81格式=每8位字节1个起始位、8个数据位、1个停止位。
因此,1位需要1/9600秒
10位占用10/9600 = 1.042 mS
和采样时间/字节时间
= 8.333 / 1.042 = 7.997字次。
事实上,如果您不进行舍入或截断计算,即
25 / 3000 x 9600/10 = 8.000....。也就是说,您的传输每个样本恰好需要8 x 9600个波特字。
同样,这恰好是4 x 4800波特或2 x 2400波特传输时间。
我没有检查过所使用的格式,但可以想象一下,为了使用PC监视器程序,基本串行例程可以使用
2 x数据字节+ CR + LF =4字节。
假设16位变量作为2 x 8位二进制字发送。
更有可能=
作为4 x ASCII字符发送的
在没有适当深入研究的情况下,使用6个ASCII字和9600波特率的CR + LF提供了使用典型参数的良好拟合,Occam可能认为这是最好的起点。无论总需求是8字节、4字节还是2字节,您观察到的数据速率和标准波特率之间的偶然精确匹配表明,这提供了您所看到的基本原因。
查看代码将快速显示使用的波特率、数据长度和封装。
https://stackoverflow.com/questions/17762948
复制相似问题