You are on page 1of 7

El Convertidor Anlogo-Digital en Arduino

Primero que nada disculpas a todos por haber estado desaparecido durante el ltimo mes. Se me
juntaron muchas cosas del trabajo y estuve un par de semanas completamente desconetado de
Internet.
Regresando al tema, habrn visto que en algunas entradas anteriores he hecho uso del convertidor
Anlogo-Digital includo en el Arduino. Pero poco o nada me he detenido a explicar su funcionamiento o
como utilizarlo.
Para dar continuidad a los artculos de Arduino, en esta entrada les explicar algunas generalidades
sobre convertidores Anlogos-Digital y cmo utilizarlos en el Arduino.

Lo anlogo y lo digital

Al principio, solo solo existan los circuitos anlogos. La electrnica digital y su uso generalizado es
relativamente reciente, antes de ello los circuitos electrnicos anlogos eran la regla.
La diferencia entre ambos tipos de circuitos es bastante sencilla: Mientras que en los circuitos digitales
su funcionamiento est determinado por las combinaciones de estados lgicos que usualmente
identificamos como 1s y 0s. En la electrnica anloga los valores son continuos es decir que una seal
puede tomar cualquier valor de voltaje o corriente dentro del rango para el que fu diseado. Si en la
electrnica digital solo tenemos blanco o negro, en la electrnica anloga las seales son todas escalas
de gris.

Si bien la mayora de equipos electrnicos modernos estn


controlados por lgica o controladores digitales, vivimos en un mundo anlogo as que se hace
necesaria la existencia de un dispositivo que convierta los valores que observamos a nuestro alrededor
en datos digitales que se puedan analizar.

Midiendo el mundo anlogo


El convertidor Anlogo-Digital (ADC por sus siglas en ingls) es un dispositivo que toma una seal
anloga (corriente, voltaje, temperatura, presin, etc.), cuantifica la seal y le asigna un valor que se
muestra a su salida en formato digital.
Los ADC ms comunes son aquellos que convierten seales de voltaje o corriente a su equivalente
digital aunque podemos encontrarlos para medir diversidad de magnitudes anlogas. Afortunadamente
los Arduinos incluyen de fbrica uno o varios ADC que nos permiten convertir niveles de voltaje a
valores digitales.

En general hay tres cosas que nos interesa saber sobre un ADC:
1.
La resolucin
2.
El tiempo de conversin
3.
El rango de trabajo
Vamos ahora a revisar en detalle cada una de estas tres caractersticas.

La resolucin del convertidor

Uno de los mayores incovenientes de convertir seales anlogas a su equivalente en digital es que
pasamos de una seal que por naturaleza es continua y sin cortes a un dato discreto, que solo puede
tener ciertos valores. Este proceso es conocido como "cuantificacin".
Generalmente la cantidad de valores discretos en los que un ADC puede traducir una seal anloga a
digital se conoce como su resolucin y usualmente es medida en base al nmero de bits que el ADC
tiene a su salida. El nmero de bits representa la cantidad mxima de valores discretos o de pasos que
un ADC puede tener.
Supongamos por ejemplo que tenemos un convertidor ADC de 3 bits. Este convertidor podr tener solo
8 valores diferentes a su salida. Esto significa que nuestros voltajes al ser convertidos podran tener mas
o menos la siguiente distribucin (asumiendo un voltaje mximo de 5V):

Entrada anloga (V) Salida digital


0.000 - 0.625
0
0.625 - 1.250
1
1.250 - 1.875
2
1.875 - 2.500
3
2.500 - 3.125
4
3.125 - 3.750
5
3.750 - 4.375
6
4.375 - 5.000
7
Para calcular el nmero de valores discretos que el ADC es capaz de convertir utilizaremos esta
frmula:

Seguramente ahora te estars preguntando: Qu tanta resolucin necesito? La respuesta depende


muchsimo de la aplicacin. Si por ejemplo ests fabricando un "dimmer" digital posiblemente estos 8
pasos de resolucin sean ms que suficiente para la esa aplicacin. Si en cambio ests haciendo un
control en que requires muchsima precisin tener solo 8 pasos de conversin puede resultar
desastroso.

El Arduino Mega que utilizaremos en este ejemplo posee 10 ADC con una resolucin de 10bits cada
uno. Esto significa que para cada entrada anloga tenemos disponibles 1024 pasos o valores discretos,
para la mayora de aplicaciones esto resulta ms que suficiente.

El tiempo de conversin y la frecuencia de muestreo

Lstimosamente la conversin de una seal anloga a su equivalente valor digital no es instantnea,


esto significa que el convertidor tarda algn tiempo (usualmente muy pequeo) en realizar el proceso de
conversin. Esto limita el nmero de conversiones que podemos realizar en una unidad de tiempo, a
este nmero de conversiones que puede realizar un ADC usualmente se le conoce como frecuencia de
muestreo o en ingles "sampling rate".
Podemos entender este parmetro como la precisin del convertidor en el tiempo. Un ADC con un
tiempo de conversin de 1 segundo es ms lento que uno que tarde 0.001segundos en hacer una
conversin. La frecuencia de muestreo mxima del ADC se calcula utilizando el inverso del tiempo de
conversin:

Al igual que el parmetro de la resolucin, que la frecuencia de muestreo sea buena o mala depende
mucho de que tan rpido cambie el valor anlogo que deseamos medir. Por ejemplo si tenemos una
sonda que mide la humedad en el suelo, el valor a medir no va a cambiar hasta que transcurran algunos
minutos por lo que un ADC que tarde 1 segundo en realizar la conversin no nos va a dar mayor
problema, por el contrario si estamos queriendo convertir a digital una seal de audio, 1 segundo de
tiempo de conversin se queda sumamente corto para capturar las frecuencias que el oido puede
distinguir.
Una forma simple para elegir un ADC es que la frecuencia de muestreo sea "al menos" el doble de la
frecuencia de la seal que queremos convertir (ver Teorema de muestreo de Nyquist-Shannon). Por
ejemplo si queremos medir una seal que oscila a 60Hz lo menos que necesitaremos es un ADC que
logre tomar 120 muestras por segundo.
Segn la hoja de especificaciones del ATmega1280, el tiempo de conversin del ADC vara entre 13s
y 260s lo que implica una frecuencia de muestreo teorica entre 3.8kHz y 76.92kHz. Obviamente el
ATmega1280 no es lo suficientemente rpido como para alcanzar la mxima frecuencia de muestreo
terica del ADC.

El rango de trabajo
La tercer caracterstica, pero no la menos importante, que debemos tomar en consideracin al elegir un
ADC es el rango de voltajes/corrientes que acepta en su entrada, este parmetro es escencial para
evitar "quemar" (literalmente) nuestro ADC.

La nica forma de saber el rango del ADC es revisando su hoja tcnica, usualmente encontraremos el
rango de valores de voltaje y de corriente aceptados en la entrada como tambin las tolerancias
aceptadas.
Para el Arduino Mega, segn las especificaciones tcnicas el rango de entrada va desde 0v hasta Vcc
(5V).

Voltajes de referencia
El voltaje de referencia es un voltaje utilizado como valor "maximo" por el ADC para realizar el proceso
de conversin.
El Arduino Mega puede utilizar dos valores como referencia para realizar la conversin, el primero es el
voltaje de alimentacin (5V) y el otro es un voltaje externo en tanto este no supere el voltaje de
alimentacin (Vcc).
Para que usar un voltaje de referencia externo? Si recuerdan, la resolucin de nuestro ADC est
limitada a un numero de pasos predefinido por el fabricante. En el caso de que la seal que deseamos
medir tenga un valor menor al voltaje de alimentacin entonces el rango de valores que podemos utilizar
se reduce y por lo tanto reducimos tambin la precisin.
Por ejemplo: Nuestra seal vara desde 0 a 2.5V. Si calculamos nuestro tamao de "paso" para cada
valor utilizando la referencia de la alimentacin (5V):

Pero si en cambio utilizamos el voltaje de referencia de 2.5V:

Puedes ver como el tamao de paso se reduce casi a la mitad utilizando el valor mximo de voltaje
medido como referencia, aumentando en consecuencia la precisin de los valores medidos para esa
seal en particular.
Qu hacer si quiero medir un voltaje mayor que el rango de entrada?
Un truco bsico es utilizar un divisor de voltaje. Para el divisor de voltaje se recomienda utilizar
resistencias de valores altos para que las corrientes se mantengan al mnimo. Por ejemplo si quisieras
medir 100V con un Arduino cuya entrada mxima son 5V:
Primero divides entre el voltaje mximo que quieres medir entre el voltaje de referencia (5V) para
encontrar el numero de resistencias que deber tener tu divisor de voltaje:

Como tener un divisor de voltaje con 20 resistencias es un poco incmodo y ocupa mucho espacio
podras tener algo como lo siguiente:

En este caso estars midiendo 1/20 del voltaje. Solo ten cuidado con las tolerancias de las resistencias.
Si asumimos por ejemplo que la tolerancia de las resistencias es del 5%, su valor real podria variar entre
0.95K y 1.05K es posible que tengas que utilizar un divisor mas grande para as jugar seguro y luego
agregas un pequeo factor de correccin mediante software.

El dimmer digital
Ahora vamos a poner en prctica los conocimietos sobre ADC que hemos adquirido y vamos a utilizar
algunas funciones muy tiles del Arduino. En este caso vamos a fabricar un dimmer de LED digital.
Un "dimmer" o un "atenuador" es un sencillo dispositivo que atenua la intensidad de una luz.
Seguramente ms de alguno ha utilizado o tienes uno de estos dispositivos en sus hogares.

Atenuar un LED es un poco ms complicado, el problema es que los LED no funcionan calentando un
filamento como los focos incandescentes sino que convierten directamente la energa elctrica en luz.
Esto los hace muy eficientes, tan eficientes que si los hacemos funcionar fuera de su rango optimo de
trabajo, por ejemplo reduciendo la corriente, desperdiciaremos mucha energa en forma de calor y
adicionalmente podriamos notar algunas diferencias en el color del LED en tanto reducimos su
intensidad.
Una solucin sencilla muy prctica para atenuar LEDs con circuitos digitales es utilizar "modulacin de
pulsos". La ventaja de utilizar esta tcnica es que permite que el led mantenga su color (ya que siempre
funciona utilizando la misma corriente) y simplemente cambia la intensidad de la luz emitida. Realmente
lo que sucede es que el led se esta apagando y encendiendo muy rapidamente lo que reduce la
cantidad de luz que emite, esto ocurre tan rapido que nuestro ojo no lo nota y pareciera que el led esta
reduciendo su intensidad.

Afortunadamente Arduino ya incluye la funcionalidad para generar seales PWM e incluso ya lo hemos
discutido en una de las primeras entradas de este blog.
El circuito que utilizaremos en esta ocasin es sumamente sencillo, estos son los materiales que vamos
a necesitar:

1 x Arduino Mega

1 x Resistencia 330Ohm (o 470Ohm)

1 x Diodo Led

1 x Potenciometro (resistor variable) de 1K.


El diagrama del circuito es el siguiente:

Programando nuestro Arduino


void setup() {
pinMode(2,OUTPUT);
}
En el setup no es requisito configurar como salida el PIN donde conectaremos el LED, sin embargo lo
dejo indicado solo para que quien lea el cdigo sepa que en esa lnea es donde lo conectaremos.
Para el loop principal utilizaremos el siguiente cdigo:
El cdigo funciona en tres pasos:

int value;
void loop() {
value = analogRead(0);
value = map(value,0,1023,0,255);
analogWrite(2,value);
delay(20);
}
1.
Leemos el dato del voltaje del potenciometro.
2.
Usamos la funcion map para cambiar el rango de entrada de 0-1023 a 0-255 (el rango
que soporta analogWrite)
3.
Escribimos el nuevo valor mapeado como PWM a la salida donde est conectado el
LED.
4.
Utilizo un pequeo delay para evitar que el valor cambie muy frecuentemente.
La funcin map permite convertir un rango especificado en otro. Esto es muy til cuando uno necesita
que el valor anlogo de la entrada se corresponda con un rango diferente en la salida. En este caso
nuestro valor de entrada vara entre 0 y 1023 pero la funcin analogWrite est esperando un mximo de
255.
Para finalizar los dejo con un pequesimo video del funcionamiento:
Y eso es todo!! Espero que esta entrada les haya ayudado a entender como funcionan los
convertidores anlogo-digital y lo puedan utilizar para sus proyectos e inventos.

Sin nada ms que decir... Hasta la prxima!!

You might also like