Cómo mejorar la resolución ADC de 10 bits de mi placa Arduino Uno

El ADC en la placa Uno tiene una resolución de 10 bits, lo que le permite diferenciar a 2 ^ 10 (1024) niveles diferentes para una entrada analógica.

Hay 4 buenas maneras en que puedo pensar fuera de mi cabeza para mejorar su resolución. El mejor método depende de cuán complejo esté dispuesto a obtener y de cuánta mejor resolución realmente necesite. La mayoría de los métodos probablemente le proporcionarán de manera realista el equivalente a 2-4 bits adicionales de resolución (12-14 bits en total), excepto el chip ADC separado, que podría obtener aproximadamente 14 bits adicionales (24 bits en total).

Promedio de datos

Tome múltiples medidas y use un algoritmo y un promedio para obtener una mejor precisión. Por ejemplo, una cosa que puede hacer es tomar 10 (o 100) mediciones, desechar el 10% superior y el 10% inferior, y promediar el resto.

Pros: bastante simple, sin hardware nuevo
Contras: toma mucho más tiempo hacer tantas lecturas

Ajuste de rango

Puede ajustar el voltaje AREF (referencia analógica) que está utilizando en el Arduino o ajustar la salida de su sensor si solo necesita medir en un rango muy pequeño. Por ejemplo, si estaba midiendo la temperatura y el termómetro le daba de 0 a 102.3 grados, podría medir 0.1 grados. Sin embargo, si solo necesita medir entre 60 y 70 grados, puede cambiar el termómetro para que salga solo en ese rango (mediante el uso de un amplificador operacional) y, en su lugar, tener una resolución de 0.01 grados, lo que efectivamente le permite obtener más Lectura precisa con el mismo ADC.

Pros: use la misma placa Arduino, la misma entrada analógica, la misma velocidad de muestreo
Contras: pérdida de rango completo, se requieren circuitos adicionales

Chip ADC separado

Puede usar un chip ADC separado con una resolución más alta que interactúe con Arduino a través de Serial, I2C o SPI. Muchos están disponibles de proveedores de electrónica en resoluciones generalmente de hasta 24 bits por menos de $ 10.

Pros: obtendrá la mejor resolución disponible
Contras: el chip ADC adicional y la interfaz serial aumentan la complejidad

Junta Arduino diferente

Obtenga una placa Arduino con un ADC de 12 bits, como Arduino Due o Arduino Zero.

Pros: sin circuitos adicionales
Contras: el costo adicional de la junta puede ser excesivo por el beneficio proporcionado

Lamento que NO PUEDAS aumentar la resolución de tu ADC de 10 bits en tu Arduino. Ver resolución de un ADC es el hardware que se decide al diseñar el ADC.

Una resolución de 10 bits significa que ADC puede detectar el nivel individual de 1024 de la señal de voltaje más alta que está diseñado para detectar, como en el caso de ARDUINO, puede ser de 5V si usa un código normal y no especifica la referencia de ADC o puede ser de 3.3V si su placa está funcionando a 3.3V en lugar de 5V, también puede ser 2.5V o 1.1V si selecciona las referencias de voltaje interno.

Digamos que su referencia de ADC es un voltaje interno de 2.5V, luego, para una resolución de 10 bits, podrá detectar 1024 niveles de voltaje diferentes entre 0 y 2.5 V, simplemente truncará cualquier señal de voltaje por encima y por debajo de este rango.
El menor voltaje que se convertirá con éxito a forma digital será:
2.5 / 1024 = 0.00244 V, y cualquier voltaje por debajo de este será simplemente ignorado y se le dará un valor mínimo, es decir, “0”.

Con los ADC internos de Arduino, en el mejor de los casos, se pueden hacer dos cosas:

  1. Aumente el rango : con esto puede aumentar el rango de niveles de voltaje que puede medir con ADC. Esto requerirá un circuito adicional para llevar las voltae máxima y mínima que desea medir a un nivel de “voltaje de referencia cero”, de lo contrario, las cosas no funcionarán como se esperaba.
  2. SUAVIZAR : puede usar rutinas de suavizado (promediación) de software para estabilizar los resultados de conversión de ADC. Esto en un nivel inferior tomará más tiempo que la conversión de ADC convencional, ya que requeriría múltiples conversiones de ADC para producir un solo resultado.

Para algo mejor, use placas Arduino como Arduino Due, que admiten ADC de mayor resolución o use un chip ADC externo como MCP3208.

El uso de un chip ADC externo aumentará nuevamente el tiempo de demora entre el momento de la solicitud para obtener el valor ADC y el valor digital. Básicamente, es una cuestión de intercambio.

Primero intente las rutinas de suavizado para obtener mejores resultados porque no son suficientes. Agregue ADC externo a su proyecto.
¡¡Salud!!

Si está dispuesto a aceptar un corte masivo a la velocidad con la que recopila datos, entonces usar una técnica conocida como Dithering es la mejor y probablemente la forma más barata de hacerlo.

Cómo está hecho:
1) Agregue ruido a su señal. A menudo, la señal ya tendrá suficiente ruido, pero a veces no, y en ese caso se debe agregar ruido. En cualquier caso, el nivel de ruido debe ser más alto que la señal mínima detectable (más que suficiente para voltear el bit menos significativo). Sin el ruido, no puede obtener la resolución mejorada.

2) Tome dos muestras y tome el promedio de las dos. Eso extiende su resolución ADC en un bit. Para una resolución adicional, necesita 2 ^ n muestras para obtener un aumento de n bits en la resolución.

El tramado requiere la menor cantidad de trabajo y el menor gasto. La desventaja es que la resolución mejorada viene con la penalidad de no poder tomar tantas mediciones.

Hay una versión modificada del tramado utilizado en algunos osciloscopios de bajo rendimiento para mejorar la resolución, pero tiene el costo del ancho de banda, ya que básicamente funciona como un promedio móvil.

Una forma que no he visto sugerida aquí y no puedo decir si funcionará o no es usar múltiples entradas analógicas. El Arduino Uno tiene “6 canales” en ese ADC de 10 bits. Ahora, imagino que está multiplexado internamente y en realidad no puede leer simultáneamente todos los canales a la vez, pero tal vez pueda acercarse combinando el muestreo de cada uno de los canales para aumentar la resolución ADC lograda. YMMV.

Su mejor opción es usar un ADC externo o un amplificador de instrumentación.

Aquí:

Mejora de la resolución ADC de Arduino con tramado y sobremuestreo

He esbozado tres métodos diferentes para producir la señal de interpolación que le permite sobremuestrear el ADC de 10 bits del Arduino para obtener 2–5 bits de resolución adicional (no precisión) cuando lee un sensor resistivo simple. Debido a su simplicidad, mi método favorito es el enfoque de alternar clavijas, aunque tendrá que experimentar un poco para encontrar el valor de resistencia correcto para usar en su placa en particular.

¡Salud!

puede obtener otro ADC con mayor resolución e interfaz para la placa, o
puedes usar un truco que consiste en hacer múltiples mediciones y promediarlas. En teoría, puede aumentar la resolución de N bits promediando N mediciones, dos bits en 16 veces el número de mediciones, pero esto está limitado por la linealidad inherente del convertidor. Y quizás por qué tan rápido está cambiando la medición.

La penetración es que su medición a través de la puesta sufrirá mucho. No es un gran problema si está haciendo una sola medición, como un peso para una báscula, por ejemplo, pero no es bueno si está haciendo mediciones dinámicas como música en la que perderá ancho de banda rápidamente.

La forma más fácil es conectar un A / D simple de 16 o 24 bits a través de una conexión en serie. Hay MUCHOS A / D como este que cuestan solo unos pocos bux.

O si tiene un D / A con más bits, puede usarlo y un comparador para hacer su propio A / D de aproximación sucesiva, semi-lenta.

Puede utilizar un “filtro de media móvil” e implementarlo en su código. Esto ayudará a suavizar un poco la señal. Sin embargo, no estoy seguro de cuán viable sería ponerlo en un Arduino.