domingo, 20 de septiembre de 2015

¿Cuál es la precisión de medida del Arduino?



Para contestar a esta pregunta deberíamos formular primero si lo que queremos saber es cuál es el menor cambio en una señal a medir capaz de producir una salida perceptible en el Arduino. A esto se le conoce comúnmente por el nombre de resolución.

Y esto nos lleva a la segunda pregunta, ¿de qué precisión estamos hablando, de la precisión de las entradas analógicas o de la precisión de las entradas digitales?

Si nuestra duda viene generada por la resolución de las mediciones que nuestro Arduino hace a través de las entradas analógicas, conviene primero hacer un pequeño repaso a los detalles concretos de la placa que estemos usando, puesto que está en la naturaleza de la placa que tengamos en la mano, la respuesta a nuestra pregunta.

Vamos a repasar juntos los detalles de la placa Arduino UNO y con el mismo método podremos resolver la pregunta para el resto de las placas disponibles.

La placa Arduino UNO lleva montado un microcontrolador del tipo ATmega328



Pues bien, si le echamos un vistazo a la hoja de datos del ATMEL de este micro, veremos que lo primero que nos indica, si le echamos un vistazo a la sección de periféricos (Peripheral Features en inglés), esto es de las estructuras que usa para conectarse con el mundo exterior, es que si nuestro encapsulado es del tipo PDIP (Dual-In-Line), el conversor que usa para transformar las señales analógicas en digitales es de 6 canales y de 10 bits.



Por lo que al menos físicamente parece que encaja con la imagen de la tarjeta que tenemos en la mano, y con el número de pines analógicos identificados en la placa : A0, A1, A2, A3, A4 y A5.



Pero y ¿qué significa "10-bit ADC"? ¿estará ahí la respuesta a nuestra pregunta sobre la precisión de medida de nuestro Arduino?

Para contestar a esta pregunta tenemos que volver a la presentación que hicimos sobre los tres pasos de la conversión analógica digital que estuvimos viendo en entradas anteriores:

1.- Muestreo (ver entrada)
2.- Cuantización de la señal (ver entrada)
3.- Codificación binaria de la señal (ver entrada)

Primero muestramos la señal, luego ajustamos las medidas a unos valores concretos y finalmente transformamos estas medidas en números binarios para que sean procesables por nuestro Arduino.



Pues bien, es desde aquí desde donde podemos contestar a nuestra pregunta sobre la precisión de nuestra medida.

Imaginemos que estamos intentando medir una señal eléctrica pero solo tenemos un multímetro de juguete que tiene tres LEDs que se iluminan cuando la tensión es mayor o igual a 1,  3 y 5voltios respectivamente.






Si traducimos este sistema de LEDs al lenguaje binario,  cuando no se encienden, entenderíamos que es 0 voltios, y se traduce por un 00, cuando se encienda 1 LED entenderíamos que es mayor o igual a 1 voltios y lo traduciríamos por 01 en binario, cuando se encienden 2 LEDs, entenderíamos que es mayor o igual a 3 voltios y lo traduciríamos en binario por 10,  y por último cuando se encendieran los tres,  entenderíamos que es mayor o igual a 5 voltios, y  lo traduciríamos por un 11 al lenguaje binario. 

Con este sencillo multímetro de LEDs binarios, estaríamos traduciendo nuestra señal con un conversor analógico digital de 2 bits.


Pero una cosa es lo que mido y otra cosa bien distinta es lo es. Teniendo en cuenta que mi sistema de LEDs no admite "decimales" o bien se enciende o bien está apagado, estamos perdiendo parte de la realidad, y con los datos obtenidos, la señal original podría ser cualquier cosa comprendida en estos puntos. Un par de ejemplos los podríamos ver a continuación:





Con los mismos resultados, no seríamos ni tan siquiera capaz de asegurar la periodicidad de la onda, no ya la forma, que como podríamos ver podría ser cuadrada, triangular, periódica o totalmente irregular, etc...  

En definitiva con un conversor ADC de 2 bits, solo podríamos medir bien señales que de antemano supieramos la forma concreta, y nos sería imposible identificar si la señal es periódica o no.

Pues bien, imaginemos que ahora vamos a la tienda donde compramos nuestro medidor de juguete y les compramos otro que tenga al menos 7 LEDs, de modo que podamos medir mejor las medidas intermedias.

Pues bien, si ahora volvemos a medir nuestra señal, lo que tendremos sería algo así como esto

Con este nuevo juguete, hemos podido convertir nuestra señal analógica a una digital con el equivalente a un conversor analógico digital de 3 bits. Cuando está todos los LEDs apagados sería el equivalente binario de un 000, cuando se enciende uno sería el 001, cuando se enciende dos sería el 010, ... así hasta cuando se enciende el séptimo tendríamos un 111.  No está mal.


Y al a vista de la gráfica, empezamos a pensar que la señal podría ser periódica,  pero si miramos más detenidamente, vemos que en esos resultados caben muchas opciones, por ejemplo una función senoidal, o una triangular.




Entonces, ¿por qué no usar un multímetro que tenga "miles" de LEDs?, ¿qué pasaría entonces? Pues sucedería que los valores intermedios estarían tan pegados que podríamos reproducir la señal con muchísima fiabilidad.  A mayor número de bits, mayor cantidad de niveles intermedios de medid




En la siguiente figura podemos ver la diferencia entre usar un conversor ADC de 3 bits y uno de 16 bits. O lo que sería equivalente, un multímetro con capacidad para medir 65,536 valores intermedios.
Pues bien, vamos a regresar al principio y vamos a ver qué tipo de conversor ADC teníamos integrado en nuestro Arduino.

Nuestro conversor era de 6 canales, esto es que puede manejar simultáneamente 6 pines analógicos y de 10 bits, esto es que es capaz de manejar 2 elevado a 10 valores intermedios de tensión. ¿Y esto cuántos pasos son?, pues 1024 diferentes de tensión. Así que si ya hemos visto como de preciso es un conversor de 2 bits y uno de 3, ¿cuánto lo será uno de 10 bits?

La respuesta es una simple cuenta. Si dividimos los 1024 escalones (correspondientes a los 10 bits de resolución del conversor) entre los 5 voltios máximo que admite la entrada analógica, significa que convertirá tensiones entre 0 y 5 voltios a un número entero entre 0 y 1023. Esto proporciona una resolución en la lectura de: 5 voltios / 1024 unidades, es decir, 0.0049 voltios (4.9 mV) por unidad.

De modo que volviendo al comienzo, podemos decir que gracias al conversor ADC de 10 bits,  el menor cambio en tensión que es capaz de producir una salida perceptible en el Arduino, sería 4,9mV.


Y ahora qué sabemos cuál es la resolución del Arduino UNO, ¿cuál es la resolución del resto de las versiones de placas de Arduino disponibles?

Echémosle un vistazo a la descripción de cada una de ella:




Podemos ver que sólo en la versión Arduino Due, se ha incorporado un conversor ADC de 12 bits, y dado que funciona con tensiones máximas de 3.3 voltios en lugar de 5 voltios del resto de las versiones de Arduino, si hacemos los cálculos 3.3/ 4096, nos dará que si usamos la versión Due, podremos trabajar con resoluciones de tensión de 0,8mV.  



En próximas entradas veremos un truco para mejorar la resolución del Arduino UNO sin necesidad de adquirir una Arduino DUE, cuando las señales analógicas trabajen con tensiones inferiores a los 5 voltios, y cómo comprobar experimentalmente el resultado de estas mejoras.

Y ya sabéis, si tenéis alguna sugerencia o duda, no tenéis más que mandarnos un correo a

e intentaremos responder a vuestra pregunta lo antes que podamos. 



No hay comentarios:

Publicar un comentario