ARDUINO Скорость записи данных на SD карту

Crane

✩✩✩✩✩✩✩
20 Фев 2021
2
0
Всем привет!
Хотелось бы проконсультироваться у знающих людей.
Устройство состоит из 3-х модулей: ардуино нано, модуль АЦП на ads1115, модуль SD карты. Написал простенький скетч, который который сравнивает сигнал между 2-мя каналами ads1115, а результат записывает на SD карту. Запись на SD карту производится корректно, однако столкнулся с одной особенностью. Скорость записи ограничена 24-25 Гц (одновременно выводил millis()). Библиотеку для работы АЦПшкой использовал стандартную - "Adafruit_ADS1X15". В файлах "Adafruit_ADS1015.h" и "Adafruit_ADS1015.cpp" сказано, что стандартная скорость выдачи данных - 1600 SPS (можно накрутить до 3300 SPS).
Подскажите, пожалуйста, в чем может быть ограничение? Есть ли возможность увеличить скорость выдачи данных?
 

IamNikolay

★★★✩✩✩✩
15 Янв 2020
820
175
сначала определите где именно происходит задержка в чтении с ацп или в самой записи на карту.
 

bort707

★★★★★★✩
21 Сен 2020
3,064
912
Есть ли возможность увеличить скорость выдачи данных?
код покажете? Кто знает, что у вас там еще в программе наворочено?
может вы одновременно с чтением данных еще фильм на экране крутите в фоновом режиме :)
 

Crane

✩✩✩✩✩✩✩
20 Фев 2021
2
0
код покажете? Кто знает, что у вас там еще в программе наворочено?
может вы одновременно с чтением данных еще фильм на экране крутите в фоновом режиме :)
C++:
#include <SPI.h>
#include <SD.h>
const int chipSelect = 10;
String FileName = "data99.txt";

#include <Wire.h>
#include <Adafruit_ADS1015.h>

 
Adafruit_ADS1115 ads(0x4A);
Adafruit_ADS1115 ads_2ch(0x4B);
void setup(void)
{
  Serial.begin(9600);
 
   if (!SD.begin(chipSelect)) {
  
    while (1);
  }
   ads.setGain(GAIN_TWO);       
 
  ads_2ch.setGain(GAIN_SIXTEEN);

 
  ads.begin();
  ads_2ch.begin();
 
  File dataFile = SD.open(FileName, FILE_WRITE);
  dataFile.println("Milliseconds DTP_VV SGB");
  dataFile.close();
}

void loop(void)
{
  int16_t results1 = 0;
  int16_t results2 = 0;
  String dataString = "";
 
  double multiplier_1ch = 0.0625;
  double multiplier_2ch = 0.0078125;
 
  results1 = ads.readADC_Differential_0_1(); 
  results2 = ads_2ch.readADC_Differential_0_1();
  dataString += String(millis()); dataString += String(" ");
  dataString += String(double(results1) * multiplier_1ch, 8);dataString += String(" ");
  dataString += String(double(results2) * multiplier_2ch, 8);
  File dataFile = SD.open(FileName, FILE_WRITE);
 
  if (dataFile) {
    dataFile.println(dataString);
    dataFile.close();   
  }     
  Serial.print(results1 * multiplier_1ch, 5);Serial.print(" ");Serial.println(results2 * multiplier_2ch, 8);

}
Монитор порта для отслеживания показаний при наладке.
 

bort707

★★★★★★✩
21 Сен 2020
3,064
912
Монитор порта для отслеживания показаний при наладке.
вот уже интересно.
Вы в монитор выводите два значения с 5-ью и 8-ью цифрами после запятой. То есть в сумме как минимум 20 символов.
При скорости порта 9600 одно это, грубо, требует 20мс - то есть уже ограничивает скорость вашей программы менее чем 50 Гц
А ведь это мы еще не посчитали собственно измерение и запись на карту :)
 

IamNikolay

★★★✩✩✩✩
15 Янв 2020
820
175
оставьте в loop только это и узнаете скорость записи
C++:
String dataString = String(millis());
File dataFile = SD.open(FileName, FILE_WRITE);
 
  if (dataFile) {
    dataFile.println(dataString);
    dataFile.close();   
 }