Muestrar datos en 1mseg y enviarlos por SPI

Hola, quisiera saber si con Arduino Uno o Mega se puede tomar datos de un sensor cada 1mseg y enviarlos a una tarjeta de memoria vía SPI?

Estoy intentando utilizar el timer2 pero creo que pone muy lenta la comunicación SPI pero quisiera saber si hay alguna otra forma de hacerlo.

Gracias de antemano.

Acá adjunto el código

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

File archivo; // objeto tipo archivo
float current, voltage; //vriable flotante para el sensor
  const int cs =10;
EnergyMonitor emon1;

void setup() {
  Serial.begin(9600);

  emon1.voltage(A1, 244.26, 1.7);  // Voltage: input pin, calibration, phase_shift
  emon1.current(A0, 2.13); 

  pinMode(cs,OUTPUT); 
  Serial.println("Inicializando tarjeta...");
  if(!SD.begin(cs)) {
    Serial.println("Fallo en inicialización"); //si no está la SD insertada
  }
  else{ 
    Serial.println("Inicialización correcta");
  }

  SREG = (SREG & 0b01111111); //Desabilitar interrupciones
 TIMSK2 = TIMSK2|0b00000001; //Habilita la interrupcion por desbordamiento
 TCCR2B = 0b00000010; //Configura preescala 
 SREG = (SREG & 0b01111111) | 0b10000000;

}

void loop() {
  

}

ISR(TIMER2_OVF_vect){
   emon1.calcVI(24, 10);         // Calculate all. No.of half wavelengths (crossings), time-out. Calcula todo. Número de medias longitudes de onda (cruces), tiempo de espera
  float current = emon1.Irms;
  float voltage = emon1.Vrms;
  float FP = emon1.powerFactor;
  Serial.println(current);
  Serial.println(voltage);

  archivo = SD.open("Datos2.txt", FILE_WRITE);
  if (archivo) {
    float current2 = float (current);
    float voltage2 = float (voltage);
    archivo.print(voltage2);
    archivo.print("V");
    archivo.print(", ");
    archivo.print(current2);
    archivo.println("A");
    archivo.close();
    
  }
  else {
    Serial.println("Error en apertura de archivo"); //si no está insertadala tarjeta
  }

}

Gracias por utilizar el inglés en los foros generales. He movido tu pregunta a una categoría para español.

1 Like

En una interrupción, las interrupciones están desactivadas, por lo que no podrás utilizar el SPI. Tampoco podrás escribir en un archivo en la tarjeta SD a 1000Hz, es demasiado rápido.

Si hace menos de 48hs te dije que solo abrir y cerrar un archivo consume casi 4.5mseg ¿Cómo vas a poder guardar datos cada 1mseg si abres y cierras el archivo en cada escritura?

Además, todo lo que intentas hacer dentro de la rutina de interrupción no se puede hacer dentro de una rutina de interrupción.

1 Like

Gracias

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.