2013-07-20 679 views
2

我一直在使用ArduinoIO-Matlab接口从Matlab控制Arduino。我目前的设置是我有3个EMG肌肉传感器(来自Advancer Technologies)通过模拟引脚1,2和3连接到Arduino。Arduino连接到Matlab。我试图从这三个引脚同时收集数据,并将它们存储在1000x3的矩阵中。我的问题是Matlab从模拟引脚采样的速率。从3个引脚同时收集1000个读数大约需要25秒。我知道arduino本身的采样率较高。以下是我的代码。我如何改变这个以在10秒内获得大约1000个样本的采样率?增加/改变Matlab-Arduino analogRead()采样率

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

回答

1

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

这会给你〜3kHz的采样率(取决于很多因素)......

+0

嗨穆罕默德。你能澄清一点吗?我需要在“adiosrv.pde”arduino代码的确切位置和方式中设置费率。我正在查看adiosrv.pde,但无法理解或找到我必须进行修改的位置。 –

+0

我使用简单的IO方案(adiosrv.pde)。在代码中使用“case 30”(starts @ 217)执行模拟读取。而不是从arduino请求输入,读取一个输入并使用串行写入将它发送到Matlab,我做了以下操作: for(int i = 0; i <1000; ++ i) Serial.println(analogRead(pin) ); 您还需要修改matlab代码中的analogRead方法: for i = 1:1000 signal(i)= fscanf(a.ser,“%d”); end 更好的采样方法是对整个信号进行采样,然后通过串行将其发送回Matlab,但实际上这对我来说并没有解决(我所满意的是......) – Muhammad

+0

好的。 Btw抱歉,迟到的回应。我的考试已经结束,所以我无法尝试。如果(val> 96 && val <113),则adiosrv.pde中的情况30具有 {pin = val-97; agv = analogRead(pin); \t Serial.println(agv); } s = -1; 休息; 我应该追加哪部分内容?此外,这仅适用于需要获取固定大小数据的情况。为了实时连续数据采集的目的,应该做什么? –

0

下很可能说明了你所看到的结果,为什么你需要做的东西像什么穆罕默德的答案提示。虽然这个原因是由他的回答暗示的,但没有说明其他人可以避开这个“陷阱”。

我无法访问所需的底层代码和系统以确定地检查此答案。这个答案是建立在“典型方法”的基础上的,并且具有纯粹的poppycock [tm]的机会,但观察方法和标准方法之间的确切吻合表明这是正在发生的事情。如果这是正确的,那么对于具有必要系统的人进行一点点钻研就会证明这一点。

当数据每次发送一个数据样本时,每次样本开销会大大超过传输原始数据所花费的时间。

你说需要25秒才能传送3000个样本。
每个样品的时间= 25/3000 =每个样品8.333ms。

假设一个9600波特数据传输速率。
默认的通信速度可能是9600波特。这可以检查,但结果表明这可能是正确的,稍作不同的假设提供了同样好的解释。串行通常使用N81格式= 1个起始位,8个数据位,每8位字节1个停止位。
所以1位取9600分之1小号
和10位取9600分之10= 1.042毫秒
和采样时间的/字节时间
= 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个ASCII字符发送16位或
- 以6个ASCII字符发送24位。

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

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