2

我一直在使用 ArduinoIO-Matlab 接口从 Matlab 控制 Arduino。我目前的设置是我有 3 个 EMG 肌肉传感器(来自 Advancer Technologies)在模拟引脚 1,2 和 3 处连接到 Arduino。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

4

2 回答 2

1

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

这会给你一个~3KHz的采样率(取决于很多因素)......

于 2013-07-20T22:20:58.320 回答
0

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

我无权访问确定检查此答案所需的底层代码和系统。这个答案基于“典型方法”,并且有一定的机会成为纯粹的罂粟花 [tm],但观察和标准方法之间的精确匹配表明这就是正在发生的事情。手头有必要系统的人只需稍加研究即可证明这是否正确。

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

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

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

串行通信通常使用 N81 格式 = 每 8 位字节 1 个起始位、8 个数据位、1 个停止位。
所以 1 位需要 1/9600 秒
,10 位需要 10/9600 = 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 位二进制字发送。
更有可能 =
- 16 位作为 4 x ASCII 字符
发送或 - 24 位作为 6 x ASCII 字符发送。

在没有适当深入研究的情况下,使用 6 个 ASCII 字和 9600 波特的 CR + LF 提供了使用典型参数的良好拟合,奥卡姆可能认为这是最好的起点。无论总要求是 8 字节还是 4 字节还是 2 字节,您观察到的数据速率和标准波特率之间有些偶然的精确匹配表明这为您所看到的内容提供了基本原因。

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

于 2015-04-10T07:15:42.447 回答