Estoy tratando de obtener más de 10 bits de precisión de mi Arduino ADC pero realmente no puedo entender la teoría detrás de esto. Una nota de solicitud de Atmel a menudo citada ( http://www.atmel.com/Images/doc8003.pdf ) dice que
Es importante recordar que el promedio normal no aumenta la resolución de la conversión. La decimación, o interpolación, es el método de promedio, que combinado con el sobremuestreo, que aumenta la resolución
Entonces, lo que proponen para 'Decimación' es mover el punto decimal. Lo que equivale a reducir a la mitad la lectura binaria para cada lugar donde la mueva, por lo que también podría dividir el valor de la base 10 por 2, 4 u 8 o lo que tenga. ¿Estoy entendiendo mal la decimación?
Respuestas:
Eché un vistazo a la nota y esa es una afirmación extraña (o una forma confusa de decir lo que realmente significan).
Quizás lo que realmente significan es el punto de que si desea obtener más resolución, no puede dividir / cambiar el número a la misma escala que una sola muestra porque (en aritmética de enteros) arrojaría los bits que ganó.
Si sus muestras de ADC son ruidosas , entonces, por supuesto, puede dividirlas para obtener un valor menos ruidoso en la escala original.
La otra cosa que pensé de su pregunta fue el hecho de que para realizar un sobremuestreo correcto, debe usar un filtro de paso bajo efectivo, y un promedio móvil directo no es tan bueno para ser un filtro de paso bajo como un FIR diseñado adecuadamente (o IIR) filtro, pero eso no parece ser compatible con el texto de la nota.
fuente
Si le pide a alguien que mida una tabla de 45,2 cm con una precisión del centímetro más cercano, respondería (o debería) 45. Si le pide que la mida nuevamente, responderá 45 nuevamente. Repita el ejercicio 8 veces más y el promedio de todas las mediciones debe ser exactamente 45. No importa cuántas veces se muestree la entrada, uno terminará con un valor de 45. El promedio de todas esas lecturas sería, por supuesto, 45 (aunque el tablero tenga 45,2 cm de largo).
Si la persona ajustó el aparato de medición para leer 0,45 cm de largo antes de la primera medición, 0,35 cm de largo antes del segundo, 0,05 cm de largo antes del quinto, 0,05 cm antes del sexto, etc. hasta 0,45 cm poco antes el décimo, luego dos de las mediciones leerían 46 y las otras ocho leerían 45. El promedio de todas ellas sería 45.2.
En la práctica, lograr sesgar las cosas con tanta precisión es difícil. Si uno ajusta al azar el aparato de medición antes de cada medición para leer en algún lugar entre 0.5 cm de largo y 0.5 cm de corto, entonces aproximadamente 1/5 de las mediciones leerían 46 y el resto 45, pero debido a que los ajustes son aleatorios, la fracción real podría ser mayor o bajo. Tomar diez mediciones no agregaría una cifra bastante significativa de precisión, pero un promedio de aproximadamente 100 sí lo haría.
No estoy seguro de entender bien la justificación del documento para la distinción entre el promedio y el desplazamiento correcto. Uno debe tener en cuenta que la precisión aparente lograda por el promedio puede exceder el nivel significativo de precisión, pero desde mi experiencia, la cuestión de cuándo y cuánto desplazar a la derecha debe estar impulsada por los límites del rango numérico del procesador. Trabajar con números que se amplíen tanto como sea posible sin causar un desbordamiento generalmente minimizará los efectos de los errores de redondeo, siempre que no se atribuya una importancia excesiva a pequeñas cantidades de ruido.
Por cierto, en el uso original, "diezmar" un ejército era matar a 1/10 de los soldados en él. Diezmar los datos de un ADC es descartar parte de él. El prefijo común con la frase "punto decimal" no implica una asociación.
fuente
La respuesta corta es el ruido, y no es necesariamente el ruido lo que importa, sino el tipo de ruido . El otro problema son los efectos no lineales como INL que arrojan el valor promedio
Primero en ruido:
Si tuviéramos que probar una distribución gaussiana se vería así:
La línea roja está más cerca de la distribución térmica real (promediada en el tiempo) y el histograma azul representa muchas muestras de ADC. Si tomáramos una muestra continua de esta distribución, obtendríamos mejores estadísticas y podríamos encontrar el valor promedio o la media con mayor precisión (que generalmente es lo que estaba después, sí, me doy cuenta de que las señales se mueven, hay filtrado y señal de ruido dependiendo del contenido de frecuencia, pero consideremos el caso de CC donde la señal no se mueve por ahora).
El problema es el ruido de parpadeo o el ruido 1 / f, desplaza la media gaussiana y hace que las estadísticas se rompan, porque la distribución ya no es gaussiana.
Este es un modelo pobre, pero podría considerar que verse así, INL también es un problema porque puede introducir algunos bits de error que también desvían la media.
Eso es probablemente confuso, veamos el dominio del tiempo como se muestra a continuación
En la imagen superior puede ver una señal con ruido gaussiano, sería fácil "dibujar una línea" en el medio y encontrar la media. Cuanta más muestra tenga de una señal como esta, mejor precisión y conocimiento tendrá de la media.
En la imagen inferior puede ver cómo se ve el ruido de parpadeo, el promedio no va a ayudar aquí.
El problema es que la mayoría de los componentes electrónicos tienen ruido de parpadeo, las resistencias no (suponiendo que no haya influencia de la temperatura ambiente), pero los transistores y los circuitos integrados sí. Hay amplificadores llamados amplificadores de corte que superan estos efectos.
Otra cosa que debe saber es que hay ADC (lineal tiene un nuevo núcleo SAR) donde los ingenieros han trabajado para eliminar los efectos del ruido 1 / f (y otros efectos no lineales de ADC como INL) a un nivel mucho más bajo que el bit ADC valor. Puede emplear sobremuestreo pesado y obtener valores de 32 bits de un núcleo de 14 bits.
Fuente: EDN- 1 / f Ruido: la vela parpadeante
fuente
no exactamente. la parte de diezmado argumenta que, correctamente desde mi punto de vista, que el "promedio" normal de múltiples muestras, pero conservando el ancho de bits, no retiene tanta información. Entonces, si promedia las lecturas de ADC de n bits, el promedio resultante sigue siendo una lectura de ADC de n bits.
el enfoque propuesto es, por decirlo suavemente, es promediar lecturas de ADC de n bits para que el promedio resultante tenga un ancho de bits más alto. Por ejemplo, sumar 4 lecturas de 10 bits de adc y dividir la suma por 2 produce una lectura de 11 bits de adc.
Pensé que esa era siempre la forma en que el sobremuestreo se hacía profesionalmente. Este simple promedio de personas en la red se entiende ampliamente como el enfoque equivocado.
El otro punto es que para reducir el ruido, el sobremuestreo solo es efectivo si hay ruido, es el correcto. Si tuviera un ADC de 10 bits diseñado por Dios (es decir, cada lectura es la lectura verdadera absoluta, sin variación), el sobremuestreo no hubiera funcionado.
el circuito particular hacia el final del artículo sobre el uso de un pwm para agregar ruido es incorrecto: el ruido de adición del pin debe tener un condensador de bloqueo de CC. y un punto menos importante es que no tiene que ser un pin PWM. Un pin GPIO normal funcionaría.
fuente
Primero, un ADC es tan bueno como su referencia de voltaje. Si su arduino usa el + 5V como referencia, puede olvidarse de cualquier tipo de precisión, ya que el regulador de + 5V es bastante ruidoso, baja precisión como 1-5%, y su voltaje de salida dependerá de la cantidad de corriente extraída de tanto en el momento de la medición como en los últimos milisegundos.
Entonces, si necesita precisión o precisión, seleccione una referencia de voltaje que coincida con sus requisitos. Si no necesita una precisión absoluta en el voltaje, será más barato, ya que solo necesitará que sea estable, en lugar de precisa y estable.
No he probado el SAR ADC dentro del arduino. Tengo experiencia con el AT90PWM3B, que es un pariente cercano. Es bastante bueno Con un voltaje de entrada constante, obtiene la misma lectura de ADC, una y otra vez, con 1 LSB fluctuante si el voltaje está entre valores. No puedo esperar un mejor resultado de un ADC SAR. (Utilicé una referencia de voltaje externo de buena calidad)
Entonces, el ruido no es un problema aquí ...
De hecho, el ruido es tu amigo ...
Supongamos que el voltaje que desea medir cae en el valor ADC 100.1
Hace 10 mediciones, pero como el ADC es bueno, ¡obtiene 100 cada vez!
Por lo tanto, necesita un poco de ruido en su señal, como un LSB de ruido, para asegurarse de que si mide 100.1, obtendrá 100 nueve veces de cada diez y 101 una vez de cada diez. Entonces tendrá un promedio de 100.1, ¿entiendes?
Si proviene de un sensor, generalmente tendrá suficiente ruido de forma gratuita.
fuente
Lo que te falta es el significado de "diezmado".
Estrictamente hablando, "diezmar" es reducir a 1/10. Es decir, de 10 reducir a 1.
"Decimación", como se usa en el muestreo, pierde el significado estricto. En lugar de 1/10, significa "reducir en número".
Lo que esto significa es que promedia un número de muestras y reduce el número de muestras en el mismo número.
Como ejemplo, si muestreas a 1000Hz y promedia 4 muestras, solo mantienes el promedio. Al final, solo tiene 250 muestras por segundo en lugar de 1000. Ha perdido resolución de tiempo, pero ganó un poco de resolución de voltaje.
Por cada factor de 4, gana 1 bit. Promedie y diezme en 4, y pase de una resolución de 10 bits a una resolución de 11 bits.
Otro factor de 4 (4 * 4 = 16 en total) lo lleva de 10 bits a 12 bits. Otro factor de 4 te lleva a 13 bits de resolución.
Pero, tenga en cuenta que ahora está sobremuestreando en un factor de 64. Su frecuencia de muestreo efectiva disminuye en el mismo factor. Usando el ejemplo de la frecuencia de muestreo de 1000Hz, se reducen a aproximadamente 15 muestras efectivas por segundo.
Esto es diezmado, y es cuántos ADC de bit alto obtienen su alta resolución. Muestran a una velocidad alta, promedio (o usan un filtro digital de paso bajo) y diezman.
En el extremo, tiene un ADC de un solo bit (un comparador simple) que sobremuestrea varios millones de veces para obtener una profundidad de bits efectiva de 16 bits.
Una cosa que debe tener en cuenta para que esto funcione es que necesita ruido en su señal aproximadamente igual al valor más pequeño que puede medir su ADC. Para un ADC de 10 bits que usa un voltaje de referencia de 5 V, eso sería un ruido de aproximadamente 5 mV pico a pico.
El promedio del ruido es de donde provienen las ganancias de bits. Imagine que tiene una señal (DC) que se encuentra exactamente entre el valor de 512 recuentos de ADC y 513 recuentos de ADC. Sin ruido, el valor medido siempre será el mismo: el promedio le dará el mismo valor que las muestras.
Agregue ruido casi al valor medible más pequeño, y se ve muy diferente. Aunque la señal en sí no cambia, los valores medidos se "moverán" alrededor del valor verdadero de la señal. El promedio ahora es diferente al de las muestras, y cuantas más muestras use, más se acercará al valor real de la señal.
He usado esta técnica con un Arduino (que usa un procesador Atmel con un ADC de 10 bits) para obtener una mejor resolución para algunas mediciones que estaba haciendo.
Lo conseguí hasta 13 bits, pero descubrí que necesitaba más. Podría haber optado por otro factor de 4, pero eso habría tomado demasiado tiempo para cada muestra y solo me habría dado un poco más.
Los experimentos con sobremuestreo mostraron que lo que estaba haciendo podría funcionar (obtuve resultados reconocibles pero ruidosos) sin tener que gastar tiempo y dinero para obtener un mejor ADC. Con la prueba de concepto, podría seguir adelante y obtener ese mejor ADC, y obtener esa prueba solo me costó unas pocas líneas de código y un poco de tiempo.
Descubrí que necesitaba al menos 16 bits. Eso habría significado promediar 4096 muestras.
Eso es aproximadamente medio segundo usando el muestreo más rápido posible con el software Arduino.
Como necesitaba 14400 mediciones, la ejecución completa hubiera tomado 2 horas.
No soy tan paciente, y las cosas que estaba midiendo no se mantendrían constantes durante tanto tiempo. Tuve que cambiar a usar un ADC que usa una tasa de sobremuestreo mucho más alta internamente, y que ofrece muestras de mayor resolución a una tasa más baja.
Al igual que con muchas cosas, la aniquilación es un compromiso que puede brindarle un mejor rendimiento en una dirección (profundidad de bits) mientras le cuesta el rendimiento en otra dirección (frecuencia de muestreo).
fuente
Así que puedes estudiar la teoría, pero puedo decirte que en la práctica solo importa un modelo simple. Puede promediar, siempre que la señal esté dentro del ruido. Entonces el componente de ruido promedio se pondrá a cero, mientras que la señal permanecerá. De esta forma obtendrá una resolución a expensas del ancho de banda.
Si tiene, por ejemplo, un adc de 16 bits y sus últimos cuatro bits son ruidosos, puede filtrarlos y obtener la señal allí. Pero si solo tiene un poco de ruido, no hay mucho para promediar, por lo que no obtendrá mucha información nueva.
Si necesita una resolución realmente alta (y un ancho de banda bajo), vea cómo funciona el ADC sigma-delta. Tienen una señal de alta velocidad de 1 bit que luego se filtra a un ancho de banda con una resolución más alta, a veces de 20 bits y más.
fuente
El promedio funciona para mejorar la resolución al reducir el error de desviación estándar,σ . El criterio a cumplir es que el ruido gaussiano debe superar el error de cuantificación. La especificación a definir es el error total y hacer que el error de cuantificación o la resolución contribuyan solo con una pequeña cantidad del presupuesto de error total.
Por ejemplo, si desea mejorar la resolución en 2 bits, pero su ruido ya era de 3 bits, debe considerar cómo reducir el ruido en 2 + 3 = 5 bits mientras aumenta la resolución al mismo tiempo en 2 bits.
Donde n es el (los) bit (es) extra (s) de resolución deseado (s), entonces el desplazamiento a la derecha de un número binario (o diezmado) x1 es igual a / 2.
Para promediar significaσ de ruido se reduce por X--√ para x muestras, pero también que la latencia aumenta en x muestras de tiempo, por lo tanto, se necesita un sobremuestreo para reducir la latencia.
Sin embargo, el ruido a esa frecuencia de muestreo,Fs debe ser suficiente para difuminar +/- 1 bit sobre algunas de las muestras x, para obtener la mejor mejora en la resolución.
Demasiado error de cuantificación o demasiado ruido aleatorio requerirán más promedios para reducir el error y más promedios aumentan la latencia del resultado.
Para optimizar un ADC para velocidad y error, se debe definir el presupuesto de error total y la resolución disponible (bits), la SNR deseada o el error absoluto para cualquier señal dentro del rango de medición completo. Definir todas las fuentes de error al principio puede parecer difícil, pero necesario, incluso;
por ejemplo, error de ganancia, error de compensación, error de cuantificación, error de ruido CM, error de ruido DM, ruido Vref o error de compensación, ruido ambiental, etc., error de latencia (del promedio)
Luego determine cuántos bits más de resolución necesita para lograr el presupuesto de error de diseño anterior una vez que se hayan minimizado todas las demás fuentes de error.
Lo mismo se aplica al promedio (para señales lentas) y al sobremuestreo del ancho de banda de la señal y al diezmado para ADC en tiempo real.
Esto no corregirá los errores de ganancia o compensación y si hay ruido aleatorio insuficiente, entonces se debe agregar ruido para oscurecer la señal. Idealmente, todas las demás fuentes de ruido y error no superan 1 bit, de modo que la desviación estándar o el dither sea solo +/- 1 valor sobre el número de muestras. Sin embargo, debe haber suficiente ruido para que no se obtenga la misma lectura mediante muestras sucesivas en ambos métodos.
fuente
La teoría detrás de esto se puede tomar, en forma breve, de esta oración en el artículo de Wikipedia sobre sobremuestreo :
Por lo tanto, siempre que su señal coincida con ciertos criterios (como ser lo suficientemente lento y tener poco ruido), en realidad aumenta un bit por cada 4 muestras. Luego, por cada 4 muestras resultantes, puede "unirse" nuevamente para formar otra muestra de mayor resolución, de modo que al final obtenga bits log_4 (n) por cada n muestras que lea en su ADC.
En cuanto a la parte de diezmado, en realidad no es un promedio, especialmente si tienes en cuenta que estamos hablando de enteros aquí (muestras de ADC). Por ejemplo, si usted tiene muestras
1
,1
,3
y2
, el promedio sería:Como estás promediando con matemáticas enteras, tu "resultado matemático" de 1.75 se redondeará a 1. Si luego multiplicas por 2, obtendrás
2
.Ahora, si lo diezmas con:
Tu resultado será
3
. Puede argumentar que esto es lo mismo que dividir entre 2, pero seguramente no puede argumentar que 3 es el promedio de 1, 1, 3 y 2 . ¿Ver la diferencia?Ahora puede tener la tentación de sumar todo y no descartar el último bit. Pero recuerda que este bit es ruido: realmente no puedes usarlo.
fuente
N/sqrt(N) = sqrt(N)
.Parece que todo el mundo ya ha cubierto la parte teórica de su pregunta, pero dado que está utilizando un Arduino, es posible que desee leer mis aventuras tratando de aumentar la resolución del ADC con esta técnica:
Mejora de la resolución ADC de Arduino con tramado y sobremuestreo
El personaje del ruido es una parte crítica de la historia, y resulta que puedes generar un tramado razonablemente bueno simplemente pulsando un pin con una resistencia mientras lees el ADC de forma asincrónica. No es perfecto, y obtienes un pequeño desplazamiento de sincronía que varía dependiendo de cuántas muestras / bits adicionales estés tratando de lograr. También acepto la crítica de que esta técnica depende de la pobre estabilización ferroviaria en el Arduino, por lo que realmente está diseñando para un defecto, en lugar de seguir una buena práctica. Pero es muy fácil de hacer.
fuente