2017-04-05 3 views
0

私は特定のイベント中にデータを記録しなければならないArduino(ATMega328p)プロトタイプで作業してきました。 LSM6DS33センサは、104Hzのサンプルレートで6つの値(それぞれ2バイト)を生成するために使用されます。このデータは、500〜20000msの期間記録する必要があります。ロギング中にSDカードによる書き込み遅延が発生しないようにするにはどうすればよいですか?

私のコードでは、Timer1を使用して1/104秒ごとに割り込みを生成します。この割り込みが発生すると、データがセンサーから読み取られ、較正され、SDカードに書き込まれます。通常、これは問題ではありません。センサからのデータの読み取りは〜3350us、キャリブレーション〜5us、書き込み〜550usが必要です。つまり、合計サイクルは約4000us、9615usは使用可能です。

電力を節約するために、私は3.3Vに電圧を下げたいと思います。 atmelのデータシートによると、これはクロック周波数を8MHzに下げる必要があることも意味します。すべてが2倍遅くなると仮定すると、〜8000us < 9615usなので測定サイクルはまだ可能です。

しかし、いくつかのテスト(まだ5V @ 16MHz)が行われた後、書き込みサイクルには〜550usではなく1880usがかかります。私はSDカード(RawWriteの例)を書き、テストするためにライブラリSdFatを使用しています。

スタート生の書き込み100000のKBは
目標レート:100 KB /秒
目標時間:100秒
分ブロックの書き込み時間:1244のミクロス
最大ブロックIカードをテストしたとき、次の結果がでてきました時間を書く:12324のミクロス
平均ブロック書き込み時間:1247のミクロス見られるように

を、書くための平均時間はかなり一貫しているが、時には10倍平均のピーク期間が発生します!図書館の作者によれば、これは、SDカードがx回の書き込みサイクルの間にいくらかの消去サイクルを必要とするからである。これにより、書き込み遅延(src:post#18&#22)が発生します。しかし、この遅延は、計量サイクルが10672usになるため、利用可能な9615usブラケットからサイクルに必要な時間を押し上げます。

私が記述しようとしていますデータは、最初のsprintfを使用して文字列に入れられる:

char buf[20] = ""; 
sprintf(buf,"%li\t%li\t%li\t%li\t%li\t%li",rawData[0],rawData[1],rawData[2],rawData[3],rawData[4],rawData[5]); 
myLog.println(buf); 

これは、txtファイルにデータを書き込みます。しかし、私のスピードレートでは21 * 104 = 2184B/sで十分です。 RawWriteサンプルの速度を6 KB/sに下げると、SDカードは書き込み遅延が長くなることなく書き込みが行われます。しかし、データが少なくても、私のコードにはまだそれらがあります。

私の質問は次のとおりです。この遅延が発生しないようにするにはどうすればいいですか?それができない場合、どうすれば回避できますか?間隔が常に同じではないため(10-15回の書き込みごとに)、遅延が発生する理由を正確に理解しておくと役立ちます。

いくつかの追加情報:
スケッチでは現在、変数付きで69%のRAM(2kB)が使用されています。同じフォーラムで提案されているように、2つの512バイトバッファを作成することはできません。
最初は2つの文字列を使用しました。それらを1つにマージしても、書き込み速度には何の意味も影響しませんでした。

+1

消去遅延は、SDカード固有のものです。一杯になると、さらに長い遅延が予想されます。また、細胞が老化すると、書き込みに時間がかかります。あなたの質問は広すぎます(私たちはコンサルティングサイトではありません)が、バッファリングは助けになるかもしれませんが、あなたのRAMが最先端にあると言うように、おそらくArduino(少なくともATmegaベース)はあなたのプロジェクトに適したプラットフォームではありません。最後に、Arduinoは**ではありません** C.タグをスパムしないでください。 – Olaf

+0

パフォーマンスが重要な場合、なぜ値を文字列に変換してテキストを書き込んでいますか?それはより多くのスペースと時間がかかります。 –

+0

@AndrewHenle:このような小さなプラットフォームで 'printf'などを使うのは悪い考えですが、大きな問題ではないようです。 SDカードの積み重ねを避けることはできません。 – Olaf

答えて

0

私が代わりに「.CSV」ファイルまたは.txt」ファイルのバイナリファイルに書いた場合、私は遅延を回避する方法を知りませんが、私はより安定し、より高速な書き込み時間を体験。

次のリンクは、バイナリ構造体としてデータをSDカードに書き込むためのきめ細かなスクリプトを提供します。彼の例にはいくつかの小さなタイプミスがありますが、簡単に修正できます。 https://hackingmajenkoblog.wordpress.com/2016/03/25/fast-efficient-data-storage-on-an-arduino/

これは時間の変動には役立ちませんが、書き込み時間を最小限に抑えて時間の問題を解決できない可能性があります。

関連する問題