Professional Documents
Culture Documents
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.
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.
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):
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.
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):
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 Diodo Led
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.