Здравствуйте. Стоит задача непрерывной записи аналоговых сигналов с 6 портов ардуино на sd карту, для изучения синусойды питающего напряжения частотой 50 Гц. Необходима максимальная скорость. Для увеличения скорости функции AnalogRead() было установлено ядро GyverCore, скорость измерения с 6 портов и записи на sd карту одного прохода около 1300мкс ( писалась строка "582348;63;60;60;62;63;67;" сначала текущие микросекунды потом 6 показаний с портов, разделитель ";" ), после записи каждых 18 - 19 строк происходит пауза около 7900мкс и через каждые 150 строк пауза около 37000 мкс. При переносе кода на STM32 BluePill увеличилась скорость записи строки до 370мкс, пауза 7800мкс стала через 12 строк (увеличилось количество символов строке "205372;1956;2165;2065;2015;2308;2141;") и пауза через каждые 100 строк около 36000 мкс.
Предполагаю что паузы возникают при переполнении буфера и записи блока 512кб на sd карту. Файл с данными прикрепил. Как сделать чтоб обойти паузы? И от чего возникают такие большие паузы в 37 мс? Увеличение скорости можно и добиться записью данных байтими а не символами (для отладки так удобнее, открыл посмотрел что записалось, без преобразований из байтов встроку)
C:
// Измерение скорости записи данных с аналоговы портов в течении 10 секунд
#include <SPI.h>
#include <SD.h>
File myFile;
unsigned long T;
const int analogInputPin0 = PA0;
const int analogInputPin1 = PA1;
const int analogInputPin2 = PA2;
const int analogInputPin3 = PA3;
const int analogInputPin4 = PB0;
const int analogInputPin5 = PB1;
void setup() {
pinMode(PC13, OUTPUT); // пин светодиода для индикации завершения записи
pinMode(analogInputPin0, INPUT_ANALOG);
pinMode(analogInputPin1, INPUT_ANALOG);
pinMode(analogInputPin2, INPUT_ANALOG);
pinMode(analogInputPin3, INPUT_ANALOG);
pinMode(analogInputPin4, INPUT_ANALOG);
pinMode(analogInputPin5, INPUT_ANALOG);
if (!SD.begin(4)) {
while (1);
}
T = millis();
}
void loop() {
digitalWrite(PC13, HIGH); // Выключаем светодиод
File dataFile = SD.open("test.txt", O_CREAT | O_WRITE); // FILE_WRITE не повлия ло на скорость записи
if (dataFile) {
while ((T + 10000) > millis()) {
dataFile.print(String(micros()));
dataFile.print(";");
dataFile.print(analogRead(analogInputPin0));
dataFile.print(";");
dataFile.print(analogRead(analogInputPin1));
dataFile.print(";");
dataFile.print(analogRead(analogInputPin2));
dataFile.print(";");
dataFile.print(analogRead(analogInputPin3));
dataFile.print(";");
dataFile.print(analogRead(analogInputPin4));
dataFile.print(";");
dataFile.print(analogRead(analogInputPin5));
dataFile.println(";");
}
dataFile.flush(); // сохранение данных из флеша на SD
dataFile.close();
}
delay(1000);
digitalWrite(PC13, LOW); // Включаем светодиод
delay(1000);
}
Вложения
-
524.5 KB Просмотры: 0