Работа Due с шилдом SD
- Войдите на сайт для отправки комментариев
Втр, 31/01/2017 - 15:37
Добрый день. Встал в ступор так как мой уровень программиста ниже easy) Затея следующая каждые 100 микросекунд опрашивать аналоговые входа(1000 точек), расчет среднего значений и их отправка на сд карту. Проблема в том что на карту пишется мало данных и не понимаю как это поправить. Принимаются все возможные замечания, буду благодарен. Код прилагаю:
#include <DueTimer.h>
#include <SPI.h>
#include <SD.h>
File myFile;
long Uism_U = 0;
long Usqrt=0;
long long SUMMA_U = 0;
volatile long Usrednee=0;
long Uism_V = 0;
long Vsqrt=0;
long long SUMMA_V = 0;
volatile long Vsrednee=0;
long Uism_W = 0;
long Wsqrt=0;
long long SUMMA_W = 0;
volatile long Wsrednee=0;
long Iism_U = 0;// PIN A2
long IUsqrt=0;
long long SUMMA_IU = 0;
volatile long IUsrednee=0;
long Iism_V = 0;
long IVsqrt=0;
long long SUMMA_IV = 0;
volatile long IVsrednee=0;
long Iism_W = 0;
long IWsqrt=0;
long long SUMMA_IW = 0;
volatile long IWsrednee=0;
int i = 0;
void firstHandler(){
i=i+1;
if ( i<1000){
Iism_W=ADC->ADC_CDR[7];//A0
Iism_W= sq(Iism_W);
SUMMA_IW=SUMMA_IW+Iism_W;
Iism_V=ADC->ADC_CDR[6];//A1
Iism_V= sq(Iism_V);
SUMMA_IV=SUMMA_IV+Iism_V;
Iism_U=ADC->ADC_CDR[5];//A2
Iism_U= sq(Iism_U);
SUMMA_IU=SUMMA_IU+Iism_U;
Uism_W=ADC->ADC_CDR[4];//A3
Uism_W= sq(Uism_W);
SUMMA_W=SUMMA_W+Uism_W;
Uism_V=ADC->ADC_CDR[3];//A4
Uism_V= sq(Uism_V);
SUMMA_V=SUMMA_V+Uism_V;
Uism_U=ADC->ADC_CDR[2];//A5
Uism_U= sq(Uism_U);
SUMMA_U=SUMMA_U+Uism_U;
}
if (i>=1000){
Usqrt = sqrt(SUMMA_U);
Usrednee=Usqrt*0.001;
Vsqrt = sqrt(SUMMA_V);
Vsrednee=Vsqrt*0.001;
Wsqrt = sqrt(SUMMA_W);
Wsrednee=Wsqrt*0.001;
IUsqrt = sqrt(SUMMA_IU);
IUsrednee=IUsqrt*0.001;
IVsqrt = sqrt(SUMMA_IV);
IVsrednee=IVsqrt*0.001;
IWsqrt = sqrt(SUMMA_IW);
IWsrednee=IWsqrt*0.001;
i=0;
SUMMA_U=0;
SUMMA_V=0;
SUMMA_W=0;
SUMMA_IU=0;
SUMMA_IV=0;
SUMMA_IW=0;
sdcard();
}
}
void setup() {
Timer3.attachInterrupt(firstHandler);
Timer3.start(100);
ADC->ADC_MR |= 0x80;
ADC->ADC_CHER=0xFC;
ADC->ADC_CR=2;
Serial.begin(250000);
while (!Serial) {
;
}
Serial.print("Initializing SD card...");
if (!SD.begin(4)) {
Serial.println("initialization failed!");
return;
}
Serial.println("initialization done.");
}
void loop() {
}
void sdcard() {
myFile = SD.open("data4.csv", FILE_WRITE);
myFile.print(Usrednee);
myFile.print(";");
myFile.print(Vsrednee);
myFile.print(";");
myFile.print(Wsrednee);
myFile.print(";");
myFile.print(IUsrednee);
myFile.print(";");
myFile.print(IVsrednee);
myFile.print(";");
myFile.println(IWsrednee);
myFile.close();
}
Не знаю как в DUE но в UNO (nano) время чтения аналогового сигнала составляет именно 100 микросекунд )))
Мне подсказали делать это так:
Останется выделить в функцию , зацепить на прерывание
void loop() { for (int j=1; j <= 16; j++) { Data_max471=analogRead(Pin_max471); static unsigned long G; G+=Data_max471-(G>>8); Data_max471=G>>8; Serial.print(Data_max471); Serial.print("-"); } Serial.println("-*-"); delay(300); }Обсуждалось здесь
В вашем коде вынести определение функции void sdcard() перед setup а то не скомпилируется
#include <DueTimer.h> #include <SPI.h> #include <SD.h> File myFile; long Uism_U = 0; long Usqrt=0; long long SUMMA_U = 0; volatile long Usrednee=0; long Uism_V = 0; long Vsqrt=0; long long SUMMA_V = 0; volatile long Vsrednee=0; long Uism_W = 0; long Wsqrt=0; long long SUMMA_W = 0; volatile long Wsrednee=0; long Iism_U = 0;// PIN A2 long IUsqrt=0; long long SUMMA_IU = 0; volatile long IUsrednee=0; long Iism_V = 0; long IVsqrt=0; long long SUMMA_IV = 0; volatile long IVsrednee=0; long Iism_W = 0; long IWsqrt=0; long long SUMMA_IW = 0; volatile long IWsrednee=0; int i = 0; void firstHandler(){ i=i+1; if ( i<1000){ Iism_W=ADC->ADC_CDR[7];//A0 Iism_W= sq(Iism_W); SUMMA_IW=SUMMA_IW+Iism_W; Iism_V=ADC->ADC_CDR[6];//A1 Iism_V= sq(Iism_V); SUMMA_IV=SUMMA_IV+Iism_V; Iism_U=ADC->ADC_CDR[5];//A2 Iism_U= sq(Iism_U); SUMMA_IU=SUMMA_IU+Iism_U; Uism_W=ADC->ADC_CDR[4];//A3 Uism_W= sq(Uism_W); SUMMA_W=SUMMA_W+Uism_W; Uism_V=ADC->ADC_CDR[3];//A4 Uism_V= sq(Uism_V); SUMMA_V=SUMMA_V+Uism_V; Uism_U=ADC->ADC_CDR[2];//A5 Uism_U= sq(Uism_U); SUMMA_U=SUMMA_U+Uism_U; } if (i>=1000){ Usqrt = sqrt(SUMMA_U); Usrednee=Usqrt*0.001; Vsqrt = sqrt(SUMMA_V); Vsrednee=Vsqrt*0.001; Wsqrt = sqrt(SUMMA_W); Wsrednee=Wsqrt*0.001; IUsqrt = sqrt(SUMMA_IU); IUsrednee=IUsqrt*0.001; IVsqrt = sqrt(SUMMA_IV); IVsrednee=IVsqrt*0.001; IWsqrt = sqrt(SUMMA_IW); IWsrednee=IWsqrt*0.001; i=0; SUMMA_U=0; SUMMA_V=0; SUMMA_W=0; SUMMA_IU=0; SUMMA_IV=0; SUMMA_IW=0; sdcard(); } } void setup() { Timer3.attachInterrupt(firstHandler); Timer3.start(100); ADC->ADC_MR |= 0x80; ADC->ADC_CHER=0xFC; ADC->ADC_CR=2; Serial.begin(250000); while (!Serial) { ; } Serial.print("Initializing SD card..."); if (!SD.begin(4)) { Serial.println("initialization failed!"); return; } Serial.println("initialization done."); } void loop() { } void sdcard() { myFile = SD.open("data4.csv", FILE_WRITE); myFile.print(Usrednee); myFile.print(";"); myFile.print(Vsrednee); myFile.print(";"); myFile.print(Wsrednee); myFile.print(";"); myFile.print(IUsrednee); myFile.print(";"); myFile.print(IVsrednee); myFile.print(";"); myFile.println(IWsrednee); myFile.close(); }Остальную кучу ошибок видимы даже мне, начинающему, думаю сейчас Вам поправят...
Код компилируется только когда функции void sdcard() в данном месте.При компиляции ошибок нет.
С чтением аналоговых входов проблем нет. Проблема с записью на карту. По моим расчета должно произойти не менее 10000 записей в секунду, по факту их чуть более 1000. Не понимаю в чем дело(((
С чтением аналоговых входов проблем нет. Проблема с записью на карту. По моим расчета должно произойти не менее 10000 записей в секунду, по факту их чуть более 1000. Не понимаю в чем дело(((
При записи во флэш запись осуществляется при шестикратной передаче специальной последовательности а уж затем нужный адрес и данные, то есть, замедление минимум в шесть раз
А у вас задача убить SD?
Убивать я никого не собирался)) Не совсем понимаю что вы имете ввиду, могли бы вы более доступно объяснить выше сказанное.Спасибо.
Убивать я никого не собирался)) Не совсем понимаю что вы имете ввиду, могли бы вы более доступно объяснить выше сказанное.Спасибо.
Ограничение на количество циклов записи для устройства после которого оно становится неисправным