1

背景

我需要一个在“Arduino 兼容”chipKit UNO32 板上运行的数据记录应用程序,并带有连接的传感器。数据应记录到“Arduino Wireless SD shield”上的 SD 卡中。传感器通过 I2C 连接。

我的问题是,当我使用 Arduino SD 库时,写入速度很慢:每次 print() 操作需要 25 毫秒,这给了我最多 40 赫兹的频率,这与我传感器的 100-800 赫兹数据速率相比是可笑的。

我的错误解决方案

幸运的是,传感器配备了可存储 32 个传感器值的片上 FIFO。这意味着我可以毫无问题地达到至少 200Hz,因为填充 FIFO 的时间远大于写入卡的时间。但我仍然很想达到至少 400Hz,所以我想我应该有以下设置:

  1. 告诉传感器将数据放入 FIFO
  2. 当 FIFO 快满时,传感器会触发中断(传感器会这样做,并且有效,我可以捕获中断)
  3. 当 Arduino 接收到中断时,它会轮询传感器的数据(通过 I2C)并将数据存储在 SRAM 的缓冲区中。
  4. 当 SRAM 缓冲区已满时,将其内容写入 SD 卡。

不幸的是,这似乎不起作用,因为处理 I2C 的 Arduino Wire 库使用中断,并且不能从中断处理程序中调用。我试过了,它冻结了微控制器。

我的问题

似乎还有其他不依赖中断的 Arduino I2C 库。我应该尝试这条路线吗?

还是我的思维方式(在 ISR 中获取大量数据)从一开始就不好?我应该采取另一种方法吗?

4

1 回答 1

0

只需使用中断设置标志并完成 ISR。从主循环执行调用 I2C 而不是直接从 ISR 调用。

boolean fifoFull = false;

void fifoISR() {
    fifoFull = true;
}

void loop() {
    if(fifoFull) {
        // Do I2C
        fifoFull = false;
    }
}
于 2012-10-25T08:28:02.390 回答