Es probable que su entrada sea simplemente bastante ruidosa. Aplicar alguna forma de promediar aquí es su mejor apuesta.
La solución más sencilla es tomar n muestras y promediarlas juntas para producir un resultado. Esto divide su tasa de muestreo por la cantidad de muestras que utiliza por intervalo de promediación.
Otra opción es usar un filtro digital; la más sencilla de implementar es una respuesta de impulso infinito de primer orden, y se parece a esto:
accumulator = 0.9 * accumulator + input
Donde input
es la lectura de ADC. Cada vez que actualiza el filtro con una nueva lectura, está tomando un promedio ponderado de los nuevos datos y todos los datos antiguos. Para obtener el resultado promedio, divida accumulator
por la inversa de la ponderación, en este caso, 0.1, así:
value = accumulator / (1 - 0.9)
El valor de ponderación controla la cantidad de promedios que obtiene y la rapidez con la que los resultados convergen cuando hay un cambio en la entrada; en este caso, cada valor depende del 90% del estado anterior y solo del 10% depende de la nueva lectura.
Si selecciona ponderaciones que son potencias de 2, por ejemplo, 1/2, 1/4, etc., puede ejecutar esto de manera muy eficiente en un microcontrolador sin necesidad de costosas operaciones de división. Por ejemplo, al elegir un valor de ponderación de 1/16 (= 6.25%), puede calcular su acumulador de la siguiente manera:
accumulator = accumulator - (accumulator >> 4) + value
y obtén un resultado como este:
result = accumulator >> 4