增加/改变Matlab-Arduino analogRead()采样率

时间:2013-07-20 13:52:39

标签: matlab time arduino sampling rate

我一直使用ArduinoIO-Matlab接口从Matlab控制Arduino。我目前的设置是我有3个EMG肌肉传感器(来自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); 

如果还有其他我需要澄清的内容,请告诉我。 谢谢:D enter code here

2 个答案:

答案 0 :(得分:1)

您需要修改arduino c ++代码(.pde文件)。 在此代码中,您应该根据需要对信号进行采样(例如1000),然后使用serial.writeln()方法将采样数据传输到matlab。

这将为您提供~3KHz的采样率(取决于很多因素)......

答案 1 :(得分:0)

以下内容很可能解释了您所看到的结果以及为什么您需要做出像穆罕默德的回答所暗示的那样的事情。虽然他的回答暗示了这个原因,但没有明确说明其他人可以避开“陷阱”。

我无法访问确定检查此答案所需的基础代码和系统。这个答案基于&#34;典型方法&#34;并且有一定的机会成为纯粹的poppycock [tm],但观察和标准方法之间的确切匹配表明这就是正在发生的事情。如果这是正确的,那么由具有必要系统的人进行的深入研究将证明这是否正确。

当一次发送数据时,您会产生每个样本的开销,这显着超过了传输原始数据所需的时间。

你说传输3000个样本需要25秒 每个样品的时间= 25/3000 =每个样品8.333毫秒。

假设9600波特数据传输速率 默认通信速度可达9600波特。这可以被检查,但结果表明这可能是正确的,并且做出略微不同的假设提供了同样好的解释。

串行通常使用N81格式= 1个起始位,8个数据位,每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位二进制字发送 更可能是=或 - 16位作为4 x ASCII字符或
发送 - 24位作为6 x ASCII字符发送。

在没有适当深度研究的情况下,使用6个ASCII字和9600波特的CR + LF可以很好地拟合使用Occam可能认为这是最佳起点的典型参数。无论总需求是8或4还是2个字节,您观察到的数据速率和标准波特率之间的偶然完全匹配表明这提供了您所看到的基本原因。

查看代码将快速显示使用的波特率,数据长度和打包。