Некоторые из моих данных занимают больше времени, чем другие

Мне нужно взять Adafger Feather M0 Adafruit и заставить его регистрировать данные 8 датчиков со скоростью 100 выборок в секунду. Проблема в том, что для записи некоторых данных в текстовый файл требуется больше времени. Разрыв между каждой выборкой составляет 10 мс (или около того), но внезапно (около 30 с, i = 2700 и 37 с, i = 3150, после его запуска) для получения данных требуется 30-50 мс, а затем возвращается до 10 мс. Это не хорошо для приложения, потому что мы пытаемся сравнить некоторые методы сбора данных такого рода, и эта проблема может помешать синхронизации. Мне нужно знать, почему это происходит, и как это решить.

#include <BlockDriver.h>
#include <FreeStack.h>
#include <MinimumSerial.h>
#include <SdFat.h>
#include <SdFatConfig.h>
#include <SysCall.h>

#include <SPI.h>
//#include <SD.h>

SdFat sd;

const int chipSelect = 4;
const int cardDetect = 7;
const int ledPin = 3;
String fileName = "DATA.TXT";
bool alreadyBegan = false;

int sensorPin[] = {A0,A1,A2,A3,A4,A5,0,A7};
uint8_t sensorVal[] = {0,0,0,0,0,0,0,0};
const int sensorNo = 8;

boolean interrupt = false;
boolean displayed = false;
int i = 0;
unsigned long loopCount = 0;
unsigned long beforeTime = 0;
unsigned long afterTime = 0;
unsigned long t1 = 0;
unsigned long t2 = 0;
unsigned long dif = 0;
int sampleSize = 6000;

File dataFile;

void setup(void)
{
  pinMode(ledPin, OUTPUT);
  pinMode(cardDetect, INPUT_PULLUP);
  for (int k = 0; k < sensorNo; k++) {
    pinMode(sensorPin[k], INPUT);
  }
  Serial.begin(9600);
  while(!Serial){
    delay(1000);
  }
  Serial.println("");Serial.println("INITIALIZING.....");
  iniCard();
  Serial.println("");Serial.println("INITIALIZED!!!");
  Serial.println("");Serial.println("========================");
  Serial.println("");Serial.print("File Name: ");Serial.println(fileName);
  Serial.println("");Serial.println("========================");
  delay(2000);
}

void loop(void)
{
    loopCount++;
    t2 = micros();
    dif = t2-t1;
    if (dif >= 9999){
      if (i==0){
        dataFile = sd.open(fileName, FILE_WRITE);
        beforeTime = micros();
        digitalWrite(ledPin, HIGH);
      }
      else if (i == sampleSize){
        afterTime = micros();
        digitalWrite(ledPin, LOW);
      }
      t1 = t2;
      if (i < sampleSize){
        String dataString = "";
        dataString += micros();
        dataString += ",";
        for (int j = 0; j < sensorNo; j++) {
          sensorVal[j] = analogRead(sensorPin[j]);
          dataString += String(sensorVal[j]);
          if (j < sensorNo-1) {
            dataString += ",";
          }
        }
        Serial.println(dataString);
        dataFile.println(dataString);
        i++;
      }
      else{
        digitalWrite(ledPin, LOW);
        if (!displayed){
          dataFile.close();
          displayed = true;
          Serial.println("");Serial.println("========================");
          Serial.print("Frames: ");Serial.println(i);
          Serial.print("Loops: ");Serial.println(loopCount);
          Serial.print("Start Time: ");Serial.println(beforeTime);
          Serial.print("End Time: ");Serial.println(afterTime);
          float period = (afterTime - beforeTime)/i;
          Serial.print("Period: ");Serial.println(period);
          float freq = 1000000 / period;
          Serial.print("Freq: ");Serial.println(freq);
        }
      }
    }
    else{
    }
}

void erro() {
  digitalWrite(ledPin, LOW);
  delay(250);
  digitalWrite(ledPin, HIGH);
  delay(250);
}

void iniCard() {
  digitalWrite(ledPin, HIGH);

  // see if the card is present and can be initialized:
  while (!digitalRead(cardDetect)) {
    erro();
  }

  // Card seems to exist.  begin() returns failure
  // even if it worked if it's not the first call.
  if (!sd.begin(chipSelect) && !alreadyBegan) { // begin uses half-speed...
    iniCard();  // Possible infinite retry loop is as valid as anything
  }
  else {
    alreadyBegan = true;
  }

  // card initialized:
  delay(2000);
  digitalWrite(ledPin, LOW);
}

0 ответов

Другие вопросы по тегам