Некоторые из моих данных занимают больше времени, чем другие
Мне нужно взять 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);
}