fbpixel
Etiquetas: ,
4
(2)

Un sensor analógico envía un nivel de voltaje, normalmente entre 0 y 5V, que representa un valor físico. Esta tensión puede estar sujeta a ruidos de medición (interferencias electrónicas, interferencias electromagnéticas, precisión de la medición, etc.). En algunas aplicaciones, necesitará un valor bastante estable para hacer sus cálculos o para detectar los eventos que le interesan. Un método sencillo de configuración es el método de promedio móvil que permite modificar el valor leído de acuerdo con el historial de mediciones.

Hardware

  • Computadora
  • Arduino UNO
  • Cable USB A macho a B macho
  • Un sensor analógico

Principio de funcionamiento

El principio del promedio móvil es registrar un cierto número de mediciones en una tabla y luego promediar estos valores en cada lectura. Hay varios fallos en esto:

  • toma un tiempo para que el tablero se llene. Por lo tanto, hay un retraso en el establecimiento del promedio. Tengan cuidado de tener esto en cuenta al iniciar el microcontrolador.
  • la variación de la medición será más lenta, por lo que será imposible detectar fenómenos “rápidos”. Compruebe cuidadosamente el comportamiento de lo que quiere medir.
  • el tablero ocupa más espacio de memoria y requiere más tiempo de gestión

Esquema

Una entrada analógica se conecta preferentemente a una clavija analógica en el microcontrolador. No se requiere ninguna conexión adicional para operar el promedio de funcionamiento. Es una solución puramente algorítmica. Para obtener resultados más controlados, es posible poner filtros electrónicos en su circuito de medición.

Código

Vamos a crear una función que leerá la entrada analógica y manejará la tabla y el promedio. En este código hemos colocado un retardo() en el bucle, para que la visualización en el monitor de serie sea más lenta. Asegúrese de eliminar este retraso() para obtener resultados más consistentes.

//Parameters
const int aisPin  = A0;
const int numReadings  = 10;
int readings [numReadings];
int readIndex  = 0;
long total  = 0;

//Variables
int aisVal  = 0;

void setup() {
  //Init Serial USB
  Serial.begin(9600);
  Serial.println(F("Initialize System"));
  //Init AnalogSmooth
  pinMode(aisPin, INPUT);
}

void loop() {
  readAnalogSmooth();
  Serial.print(F("ais avg : ")); Serial.println(smooth());
  delay(200);
}

void readAnalogSmooth( ) { /* function readAnalogSmooth */
  ////Test routine for AnalogSmooth
  aisVal = analogRead(aisPin);
  Serial.print(F("ais val ")); Serial.println(aisVal);
}

long smooth() { /* function smooth */
  ////Perform average on sensor readings
  long average;
  // subtract the last reading:
  total = total - readings[readIndex];
  // read the sensor:
  readings[readIndex] = analogRead(aisPin);
  // add value to total:
  total = total + readings[readIndex];
  // handle index
  readIndex = readIndex + 1;
  if (readIndex >= numReadings) {
    readIndex = 0;
  }
  // calculate the average:
  average = total / numReadings;

  return average;
}




Resultado

En el monitor serial vemos que el valor bruto oscila entre 306 y 308 mientras que el promedio móvil se mantiene estable en 305.

Aplicaciones

  • Filtro de medición
  • Reducir el ruido en la medición de un sensor

Fuentes

Encuentre otros tutoriales y ejemplos en el generador de código automático
Arquitecto de Código

¿De cuánta utilidad te ha parecido este contenido?

¡Haz clic en una estrella para puntuarlo!

Promedio de puntuación 4 / 5. Recuento de votos: 2

Hasta ahora, ¡no hay votos!. Sé el primero en puntuar este contenido.

Ya que has encontrado útil este contenido...

¡Sígueme en los medios sociales!

¡Siento que este contenido no te haya sido útil!

¡Déjame mejorar este contenido!

Dime, ¿cómo puedo mejorar este contenido?