背景
我需要一个在“Arduino 兼容”chipKit UNO32 板上运行的数据记录应用程序,并带有连接的传感器。数据应记录到“Arduino Wireless SD shield”上的 SD 卡中。传感器通过 I2C 连接。
我的问题是,当我使用 Arduino SD 库时,写入速度很慢:每次 print() 操作需要 25 毫秒,这给了我最多 40 赫兹的频率,这与我传感器的 100-800 赫兹数据速率相比是可笑的。
我的错误解决方案
幸运的是,传感器配备了可存储 32 个传感器值的片上 FIFO。这意味着我可以毫无问题地达到至少 200Hz,因为填充 FIFO 的时间远大于写入卡的时间。但我仍然很想达到至少 400Hz,所以我想我应该有以下设置:
- 告诉传感器将数据放入 FIFO
- 当 FIFO 快满时,传感器会触发中断(传感器会这样做,并且有效,我可以捕获中断)
- 当 Arduino 接收到中断时,它会轮询传感器的数据(通过 I2C)并将数据存储在 SRAM 的缓冲区中。
- 当 SRAM 缓冲区已满时,将其内容写入 SD 卡。
不幸的是,这似乎不起作用,因为处理 I2C 的 Arduino Wire 库使用中断,并且不能从中断处理程序中调用。我试过了,它冻结了微控制器。
我的问题
似乎还有其他不依赖中断的 Arduino I2C 库。我应该尝试这条路线吗?
还是我的思维方式(在 ISR 中获取大量数据)从一开始就不好?我应该采取另一种方法吗?