1

バックグラウンド

接続されたセンサーを備えた「Arduino互換」chipKit UNO32ボードで実行されるデータロギングアプリケーションが必要です。データは、「Arduino ワイヤレス SD シールド」にある SD カードに記録する必要があります。センサーは I2C 経由で接続されます。

私の問題は、Arduino SD ライブラリを使用すると書き込みが遅くなることです。print() 操作ごとに 25 ミリ秒で、センサーの 100 ~ 800 Hz のデータ レートと比較して笑える最大 40 Hz になります。

私の間違った解決策

幸いなことに、センサーには、32 個のセンサー値を保存できるオンチップ FIFO が両方とも装備されています。これは、FIFO がいっぱいになる時間はカードに書き込む時間よりもはるかに長いため、問題なく少なくとも 200Hz に到達できることを意味します。それでも、少なくとも 400Hz に到達したいので、次のように設定することにしました。

  1. データを FIFO に入れるようにセンサーに指示する
  2. FIFO がほぼ満杯になると、センサーが割り込みをトリガーします (センサーがこれを行い、動作し、割り込みをキャッチできます)。
  3. Arduino が割り込みを受信すると、(I2C 経由で) センサーのデータをポーリングし、データを SRAM のバッファーに格納します。
  4. SRAM バッファがいっぱいになったら、その内容を SD カードに書き込みます。

残念ながら、I2C を処理する Arduino Wire ライブラリは割り込みを使用し、割り込みハンドラ内から呼び出すことができないため、これは機能しないようです。試してみましたが、マイクロコントローラーがフリーズします。

私の質問

割り込みに依存しないArduino用のI2Cライブラリは他にもあるようです。そのルートを試してみるべきですか?

それとも、私の考え方 (ISR で大量のデータを取得する) が最初から悪いのでしょうか? 私が取るべき別のアプローチはありますか?

4

1 に答える 1

0

割り込みを使用してフラグを設定し、ISR を終了するだけです。ISR から直接呼び出すのではなく、メイン ループから I2C を呼び出します。

boolean fifoFull = false;

void fifoISR() {
    fifoFull = true;
}

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