So erhöhen Sie die Schreibgeschwindigkeit der SD-Karte in Arduino

12

Ich erstelle ein Datenloggersystem, das Daten auf einer SD-Karte mit einer hohen Geschwindigkeit von etwa 20000 bis 30000 Bytes pro Sekunde aufzeichnet. Aber die SD-Bibliothek in Arduino schreibt derzeit Daten mit etwa 4500-5000 Bytes pro Sekunde, was zu langsam ist.

Ich habe diesen Hack gelesen , um die Schreibgeschwindigkeit zu verbessern , aber ich frage mich, ob ein direkterer Ansatz möglich ist, möglicherweise durch Anpassen der SPISettings .

Ashish Ranjan
quelle
1
Probieren Sie die SdFat- Bibliothek aus - sie ist viel effizienter als die Standard-SD-Bibliothek.
Majenko
Vielleicht möchten Sie auch sicherstellen, dass Ihre SD-Karte von guter Qualität ist, obwohl 5000 Byte für jede Art von SD-Karte zu niedrig erscheinen.
Len

Antworten:

11

IN ORDNUNG. Also habe ich die SDFat lib ausprobiert. Diese Bibliothek ist definitiv besser als die Standard-SD-Bibliothek, die mit Adruino geliefert wird. Aber so habe ich mein Problem der niedrigen Datenrate nicht gelöst.

Ich bin den Anweisungen des Autors der SDFat-Bibliothek in diesem Beitrag gefolgt .

Laut fat16lib müssen wir flush () mit Bedacht einsetzen , um die Datenrate zu erhöhen. Wir möchten die Daten in jedem Zyklus schreiben (), müssen sie jedoch nur etwa alle 100 Zyklen löschen (), je nachdem, wie viele Daten in jedem Zyklus geschrieben werden. Stellen Sie außerdem sicher, dass das Flag in SD.open () als 'O_WRITE | O_CREAT 'anstelle von' FILE_WRITE '.

Dies erhöhte die Geschwindigkeit um einen großen Faktor. Aber ich brauchte mehr!

Das Speichern der Daten im Binärformat ( siehe Blog ) hat die Leistung noch weiter verbessert.

Meine aktuelle Geschwindigkeit beträgt ungefähr 100-120 KBit / s (das sind Kilobytes) mit einer SD-Karte der Klasse 4!

Zum Schluss möchte ich euch für eure Hilfe danken.

Ashish Ranjan
quelle
4

Viele Faktoren würden entscheiden, ob Sie diese gewünschte Geschwindigkeit erreichen können. Nur einige davon.


1. Ihre Software

Die SdFat- Bibliothek ist schneller als die Standard-SD-Bibliothek der Arduino IDE. Es hat auch eine einfach zu verwendende Kompatibilitätsfunktion mit der Standard-SD-Bibliothek. Versuch es.

2. Ihre Hardware

Sie sollten eine hochwertige SD-Karte verwenden. Wie Sie vielleicht wissen, werden SD-Karten in Leistungsklassen eingeteilt. Die meisten Internetnutzer empfehlen eine SanDisk SD-Karte.

William Roy
quelle
Ich werde es in ein paar Tagen versuchen und Ihnen die Ergebnisse mitteilen. Vielen Dank.
Ashish Ranjan
4

Vermeiden Sie, dass der Handshake einen Puffer bekommt!

Verwenden Sie SD.write (Buf, Größe);

Hallo allerseits, ich arbeite in einem Projekt mit demselben Thema. Ich bin denselben Schritten wie Sie gefolgt und habe genau dieselben Zahlen erhalten. Ich habe es gerade behoben. Das Problem ist der Handschlag beim Anrufen der SD.write().

Stattdessen:

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

Tun:

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

In meinem Projekt habe ich als erstes 4100 Bytes und als zweites mit einem Puffer mit 128 (buf [128]) 145408 Bytes in meinem Projekt. Gut genug.

Pinipa
quelle
1
Ich weiß nicht, was Sie mit Handshake meinen, da AFAIK SD intern sowieso einen (512 kB) Puffer verwendet. Aber ich habe auch festgestellt, dass das Schreiben einzelner Bytes mit File.write extrem langsam ist und der Compiler es anscheinend nicht optimieren kann (schließlich wird nur ein Byte in den internen Puffer kopiert und geprüft, ob der Puffer voll ist und die SPI-Übertragung erfolgen sollte Start). Die Verwendung meines eigenen Puffers außerhalb von File.write (Buffer, Size) führte auch in meiner Anwendung zu einer extremen Leistungsverbesserung.
Oliver