Comment augmenter la vitesse d'écriture de la carte SD en arduino


12

Je crée un système d'enregistrement de données qui enregistre les données sur la carte SD à une vitesse élevée d'environ 20000-30000 octets par seconde. Mais la bibliothèque SD en arduino écrit actuellement des données à environ 4500-5000 octets par seconde, ce qui est trop lent.

J'ai lu ce hack pour améliorer la vitesse d'écriture , mais je me demande si une approche plus directe est possible, peut-être en ajustant les SPISettings .


1
Vous pourriez essayer la bibliothèque SdFat - elle est beaucoup plus efficace que la bibliothèque SD par défaut.
Majenko

Vous pouvez également vous assurer que votre carte SD est de bonne qualité, bien que 5000 octets semblent trop faibles pour tout type de carte SD.
Len

Réponses:


11

D'ACCORD. J'ai donc essayé la bibliothèque SDFat. Cette bibliothèque est certainement meilleure que la bibliothèque SD par défaut fournie avec adruino. Mais ce n'est pas ainsi que j'ai résolu mon problème de faible débit.

J'ai suivi les instructions de l'auteur de la bibliothèque SDFat de ce post .

Selon fat16lib , pour augmenter le débit de données, nous devons utiliser judicieusement flush (). Nous voudrions écrire () les données dans chaque cycle, mais nous n'avons besoin de flush () qu'une fois tous les 100 cycles environ en fonction de la quantité de données écrites dans chaque cycle. Veillez également à conserver l'indicateur dans SD.open () sous la forme «O_WRITE | O_CREAT 'au lieu de' FILE_WRITE '.

Cela a certainement augmenté la vitesse d'un grand facteur. Mais j'avais besoin de plus!

Le stockage des données en binaire ( consultez ce blog ) a encore amélioré les performances.

Ma vitesse actuelle est d'environ 100-120 Kbps (c'est-à-dire kilo-octets) avec une carte SD de classe 4!

Enfin, je tiens à vous remercier pour votre aide.


4

De nombreux facteurs décideront si vous pouvez atteindre cette vitesse souhaitée. Seulement certains d'entre eux.


1. Votre logiciel

La bibliothèque SdFat est plus rapide que la bibliothèque SD standard de l'IDE Arduino. Il a également une fonction de compatibilité facile à utiliser avec la bibliothèque SD standard. Essaye le.

2. Votre matériel

Vous devez utiliser une carte SD de haute qualité. Comme vous le savez peut-être, les cartes SD sont triées en classes de performances. La plupart des internautes recommandent une carte SD SanDisk.


Je vais essayer cela dans quelques jours et vous faire connaître les résultats. Merci.
Ashish Ranjan

4

Évitez que la poignée de main obtienne un tampon!

Utilisez SD.write (buf, size);

Bonjour à tous, je travaille sur un projet avec le même problème. Je suivais les mêmes étapes que vous et obtenais exactement les mêmes numéros. Je viens de le réparer. Le problème est la poignée de main lorsque vous appelez le SD.write().

Au lieu:

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

Faire:

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

Dans mon projet, le premier, j'ai eu 4100 octets, et le second utilisant un tampon avec 128 (buf [128]), j'ai eu 145408 octets dans mon projet. Assez bien.


1
Je ne sais pas ce que vous entendez par poignée de main, car AFAIK SD utilise un tampon (512 Ko) de toute façon en interne. Mais j'ai également observé que l'écriture d'octets individuels avec File.write est extrêmement lente et le compilateur ne semble pas être en mesure de l'optimiser (après tout, il suffit de copier un octet dans le tampon interne et de vérifier si le tampon est plein et la transmission SPI devrait début). L'utilisation de mon propre tampon à l'extérieur et de File.write (tampon, taille) a également permis d'améliorer considérablement les performances de mon application.
olivier
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.