Go Down

Topic: Imprecisión toma de datos onda de tensión (Read 142 times) previous topic - next topic

Raspduino93

Jul 09, 2017, 02:34 pm Last Edit: Jul 14, 2017, 03:50 am by surbyte Reason: Las imagenes deben verse.
Buenas tardes

Soy nuevo en el foro y en esto de Arduino, explicaré lo que estoy haciendo a ver si alguien me puede ayudar o aclararme la duda

Lo que quiero hacer es medir una onda senoidal a 50 HZ de tensión de un generador de funciones con Arduino Uno, le he añadido el offset para que no de tensiones negativas, por lo que la onda oscila entre 3-0.4V aproximadamente.
El esquema de montaje es bastante simple, el generador conectado a una resistencia de 100ohm y arduino mide tensión ahí, no hay problema.

La forma de medir es leer continuamente durante 100ms, parar un tiempo 5s en este caso y volver a medir 100ms, y repetir tantas veces como quiera.

Cuando recojo los datos y los pongo en LibreOffice para representarlos gráficamente, veo no que están del todo correctos.
Como se puede ver en las capturas, en las 2 muestras que he adjuntado, para el primer ciclo toma bastantes más datos que para los siguientes, se puede ver que para el primer ciclo toma unos 60 datos y para los demás 48, pasa siempre para el principio de todas las muestras

Mi duda es si esto se puede solucionar de alguna forma y hacerlo más exacto o es problema de la propia placa Uno que da este problema al principio o si hay otra manera de poner el código.

Muchas gracias de antemano

Code: [Select]
int cont=0;
int muestras=2;
int sampletime=5000;
unsigned long tiempo=0;
unsigned long t_actualizado=0;
unsigned long t_lectura=100;


// Comienza comunicacion serial
void setup() {
  Serial.begin(115200);
}

void loop() {
  Serial.flush();

    while(cont<muestras)  //Ciclo de muestras
    {   //Ciclo de lectura de datos
          while(tiempo-t_actualizado<t_lectura){
          tiempo=millis();
          // Lectura de pin 0
          int sensorV = analogRead(A0);
          Serial.println(sensorV,DEC);

      }
    tiempo=millis();
    t_actualizado=tiempo;
    while(tiempo-t_actualizado<sampletime){
      tiempo=millis();
    }
    cont=cont+1; //Aumenta contador del ciclo de muestras
    tiempo=millis();
    t_actualizado=tiempo;
    }
}





Lucario448

Yo tampoco estoy seguro de lo que pasa, pero sí de una posible solución: muestrea por interrupciones, que es más preciso.

Aquí te dejo esta librería para poder realizarlo más fácilmente.

Una regla muy importante: ¡NUNCA IMPRIMAS DURANTE UNA INTERRUPCIÓN!. El loop es el único que debe encargarse de eso.

surbyte

Muy complicado o rebuscado lo que has hecho.

Mientras se muestra no se imprime como bien dice Lucario.
Debes crear un vector y almacenar en el las muestras, solo que tienes un limite para el tamaño de dicho vector según la memoria del Arduino que estes usando.


NOTA: muevo el hilo a Software. Tema ampliamente debatido en el foro.

Go Up