Работа Due с шилдом SD

cerceli
Offline
Зарегистрирован: 19.08.2016

Добрый день. Встал в ступор так как мой уровень программиста ниже 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();
 }
 
ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Не знаю как в 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();
 }

 

Остальную кучу ошибок видимы даже мне, начинающему, думаю сейчас Вам поправят...

 

cerceli
Offline
Зарегистрирован: 19.08.2016

Код компилируется только когда функции void sdcard() в данном месте.При компиляции ошибок нет.

cerceli
Offline
Зарегистрирован: 19.08.2016

С чтением аналоговых входов проблем нет. Проблема с записью на карту. По моим расчета должно произойти не менее 10000 записей в секунду, по факту их чуть более 1000. Не понимаю в чем дело((( 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

cerceli пишет:

С чтением аналоговых входов проблем нет. Проблема с записью на карту. По моим расчета должно произойти не менее 10000 записей в секунду, по факту их чуть более 1000. Не понимаю в чем дело((( 

При записи во флэш запись осуществляется при шестикратной передаче специальной последовательности а уж затем нужный адрес и данные, то есть, замедление минимум в шесть раз

А у вас задача убить SD?

cerceli
Offline
Зарегистрирован: 19.08.2016

Убивать я никого не собирался)) Не совсем понимаю что вы имете ввиду, могли бы вы более доступно объяснить выше сказанное.Спасибо.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

cerceli пишет:

Убивать я никого не собирался)) Не совсем понимаю что вы имете ввиду, могли бы вы более доступно объяснить выше сказанное.Спасибо.

Ограничение на количество циклов записи для устройства после которого оно становится неисправным