Cara meningkatkan kecepatan tulis kartu SD di Arduino

12

Saya membuat sistem data-logger yang mencatat data dalam kartu SD dengan kecepatan tinggi sekitar 20000-30000 byte per detik. Tetapi perpustakaan SD di Arduino saat ini menulis data sekitar 4500-5000 byte per detik yang terlalu lambat.

Saya telah membaca hack ini untuk meningkatkan kecepatan menulis , tetapi saya bertanya-tanya apakah pendekatan yang lebih langsung mungkin dilakukan, mungkin dengan menyesuaikan pengaturan SPIS .

Ashish Ranjan
sumber
1
Anda dapat mencoba perpustakaan SdFat - ini jauh lebih efisien daripada perpustakaan SD default.
Majenko
Anda mungkin juga ingin memastikan kartu SD Anda memiliki kualitas yang baik, meskipun 5000 byte tampaknya terlalu rendah untuk semua jenis kartu SD.
Len

Jawaban:

11

BAIK. Jadi, saya mencoba lib SDFat. Pustaka ini jelas lebih baik daripada pustaka SD default yang datang dengan adruino. Tapi itu bukan bagaimana saya memecahkan masalah data-rate rendah saya.

Saya mengikuti instruksi dari penulis perpustakaan SDFat dari posting ini .

Menurut fat16lib , untuk meningkatkan kecepatan data kita perlu menggunakan flush () dengan bijak. Kami ingin menulis () data dalam setiap siklus, tetapi kami hanya perlu menyiram () sekali setiap 100 siklus atau lebih tergantung pada berapa banyak data yang ditulis dalam setiap siklus. Juga, pastikan untuk menyimpan bendera di SD.open () sebagai 'O_WRITE | O_CREAT 'bukan' FILE_WRITE '.

Ini tentu saja meningkatkan kecepatan dengan faktor yang hebat. Tetapi saya membutuhkan lebih banyak!

Menyimpan data dalam biner ( lihat blog ini ) semakin meningkatkan kinerjanya.

Kecepatan saya saat ini sekitar 100-120 KBps (itu kilo byte) dengan kartu SD kelas 4!

Akhirnya, saya ingin mengucapkan terima kasih atas bantuan Anda.

Ashish Ranjan
sumber
4

Banyak faktor yang akan memutuskan apakah Anda dapat mencapai kecepatan yang diinginkan ini. Hanya beberapa di antaranya.


1. Perangkat Lunak Anda

The SdFat Perpustakaan lebih cepat dari SD Perpustakaan standar Arduino IDE. Ini juga memiliki fungsi kompatibilitas yang mudah digunakan dengan Perpustakaan SD standar. Cobalah.

2. Perangkat Keras Anda

Anda harus menggunakan Kartu SD kelas tinggi. Seperti yang mungkin Anda ketahui, Kartu SD diurutkan ke dalam kelas kinerja. Kebanyakan orang di internet merekomendasikan Kartu SD SanDisk.

William Roy
sumber
Saya akan mencoba ini dalam beberapa hari dan memberi tahu Anda hasilnya. Terima kasih.
Ashish Ranjan
4

Hindari jabat tangan mendapatkan penyangga!

Gunakan SD.write (buf, size);

Hai semuanya, saya bekerja di sebuah proyek dengan masalah yang sama. Saya mengikuti langkah Anda yang sama dan mendapatkan angka yang persis sama. Saya baru saja memperbaikinya. Masalahnya adalah jabat tangan saat Anda memanggil SD.write().

Sebagai gantinya:

//for each loop, it is going to make a handshake
while(<yourCondition>){
    SD.write(<yourValue>);
}

Melakukan:

char buf[length];
while(yourCondition){
    buf[index] = yourValue;
}
SD.write(buf,index);//only one handshake

Dalam proyek saya yang pertama saya mendapat 4100 byte, dan yang kedua menggunakan buffer dengan 128 (buf [128]) saya mendapat 145408 byte di proyek saya. Cukup baik.

Pinipa
sumber
1
Saya tidak tahu apa yang Anda maksud dengan jabat tangan, karena AFAIK SD menggunakan buffer (512 kB) secara internal. Tapi saya juga mengamati bahwa menulis byte individu dengan File.write sangat lambat dan kompiler tampaknya tidak dapat mengoptimalkannya (setelah semua itu hanya menyalin satu byte ke buffer internal dan memeriksa apakah buffer penuh dan transmisi SPI harus Mulailah). Menggunakan buffer saya sendiri di luar dan File.write (buffer, size) membawa peningkatan kinerja yang ekstrem juga dalam aplikasi saya.
oliver,