Filtro Promedio

Introducción 

Este tutorial muestra cómo implementar un filtro promedio en arduino. El objetivo es suavizar los valores de sensores ruidosos o inestables de una manera fácil.




El filtro promedio está dado por la siguiente fórmula


El resultado es la suma de una cantidad de mediciones, y el total se divide por la cantidad de  mediciones N. Cuantas más mediciones incluyas en el promedio, más ruido se eliminará. Sin embargo, se produce un retardo en la lectura de la señal.

Hardware requerido

  • 1 Arduino 
  • 1 Potenciómetro de 10k ohm
  • 1 Protoboard
  • Cable

Circuito

En la  figura 1 se muestra el esquema de conexión. Conecte un pin de un potenciómetro a 5V, el pin central al pin analógico A0, y el último pin a GND.
Figura 1. Esquema de conexión.

Código

El siguiente código permite calcular  el valor promedio de N muestras mediante la función promedio()

Sintaxis
promedio(N, AnalogInput)

Parámetros

AnalogInput: Entrada analógica

float sensorValue = 0;

void setup() 
{
  Serial.begin(9600);   
}
void loop() 
{
    sensorValue=promedio(100,0);
    Serial.println(sensorValue);
    delay(50);
}

float promedio(int numeroLecturas,int sensorPin) 
{
  float aux=0.0;
  for (int conta = 1; conta <= numeroLecturas ; conta++) 
  {
    aux=aux+analogRead(sensorPin); // Escalamiento de Pv
   delayMicroseconds(10);    
 }
 return (aux/numeroLecturas);
}

Resultados

La figura 2 muestra la medición original y la filtrada para un N=10, debido al pequeño número de mediciones aún existe un ruido considerable.
Figura 2. Resultado del filtro con N=10.
La figura 3 muestra la medición original y la filtrada para un N=100, debido al mayor número de mediciones, el resultado es una señal mas suavizada. Sin embargo, a medida que se incrementa N también lo hace el tiempo de muestreo.
El tiempo de ejecución del filtro es de aproximadamente (N*0.13) milisegundos. Es decir, para un N=100 el tiempo de ejecución 13 milisegundos.
Figura 3. Resultado del filtro con N=100.


Compartir:

2 comentarios:

  1. Me funciono para un proyecto similar gracias

    ResponderBorrar
  2. hola: como puedo aplicarlo a un codigo para controlar un servo?

    gracias de ante mano

    ResponderBorrar

Donaciones

Suscribete

SÍGUENOS EN FACEBOOK

Posts Populares

Categorías

Post Recientes