Descripción
Arduino dispone de 6 convertidores analógico a digital (ADC) que son los pines A0 a A5, capaces de convertir valores de tensión hasta un máximo de 5V, que es la tensión de referencia en Arduino.
Arduino dispone de 6 convertidores analógico a digital (ADC) que son los pines A0 a A5, capaces de convertir valores de tensión hasta un máximo de 5V, que es la tensión de referencia en Arduino.
Una de las características claves del convertidor, es su número de bits, que define la finura con los que podemos cuantificar esa conversión a digital. En el caso de Arduino, son 10 los bits que maneja en la puertas analógicas, lo que significa que su resolución es 210 = 1.024 posibles valores.
Cuanto mayor sea esta resolución mejor es la capacidad de aproximación al valor real cuya conversión buscamos.
Importante entender que una conversión a digital de una señal analógica es siempre una aproximación, y ni siquiera en el improbable caso de que el valor analógico fuese exactamente el que nos dice el convertidor, siempre tendremos una incertidumbre.
En un convertidor como los de Arduino con 10 bits de resolución, cada escalón de medida es de 5V/1024 = 0,0048828125 V, algo menos de 5mV, lo que significa que no puede diferenciar entre valores de tensión cuya diferencia sea menor que 5mV.
Lo que un convertidor ADC hace es comparar sucesivamente la señal que queremos cuantificar en la entrada, con una tensión de referencia contra la que hace las comparaciones.
Es decir, un ADC no proporciona valores absolutos, sino que proporciona una comparación cuantificada con relación a un valor de referencia.
Por eso, en la sesión Sensor de temperatura TMP36 hemos calculado la tensión de entrada en uno de los pines Analógicos como la lectura multiplicada por una relación entre el valor de la máxima de la entrada 5V con la máxima medida del conversor 1024.
Como las señales que normalmente manejamos en Arduino están alrededor de los 5V, comparar contra 5V es lo razonable, porque además la industria tiene una gama completa de sensores cuyo valor máximo devuelve 5V.
Como las señales que normalmente manejamos en Arduino están alrededor de los 5V, comparar contra 5V es lo razonable, porque además la industria tiene una gama completa de sensores cuyo valor máximo devuelve 5V.
Pero cada vez más, la industria produce electrónica de 3,3V, el propio Arduino DUE es un ejemplo de ello, y si usamos nuestros ADC para digitalizar señales de pico 3,3V, estamos perdiendo precisión y resolución, porque estamos desperdiciando una parte de las posibles comparaciones, de hecho un tercio.
En la práctica, al ser 3,3V el máximo de la tensión de entrada compararlo contra 5V supone que nunca tendremos lecturas mayores de 1.024 * 3,3 /5 = 675 y seguiremos teniendo escalones de entrada de 5mV.
Pero si el convertidor es un comparador de tensiones, si pudiéramos cambiar el valor de tensión contra el que comparamos por una de 3,3V, los escalones serian de 3,3V/1024 = 0,00322265625 o sea 3,2 mV. Es decir hemos mejorado la resolución de nuestro convertidor y sin gastar dinero.
Por eso en una situación ideal, la tensión de comparación contra la que realizamos la conversión de analógico a digital, debería ser el valor máximo posible de la señal de entrada.
Porque es cuándo tendremos la mejor resolución posible con ese convertidor.
Los chicos de Arduino, eran conscientes de este asunto y por eso incluyeron un pin externo, que no habíamos usado hasta ahora, que permite conectar una tensión externa de referencia, contra la que se comparará la señal que leamos en nuestras puertas A0 a A5.
Este pin esta rotulado como AREF (Analog Reference o Referencia Analógica) y está dos pines más arriba del digital pin 13:
Este pin esta rotulado como AREF (Analog Reference o Referencia Analógica) y está dos pines más arriba del digital pin 13:
Usando la referencia analógica externa
La cuestión de la referencia analógica contra la que comparamos las muestras en las puertas A0-A6, es tan importante, que Arduino provee varias tensiones internas contra las que comparar y que podemos activar para cambiar dicha referencia.
Para activar una referencia interna de 1,1V en un Arduino UNO usa la instrucción
analogReference(INTERNAL);
Si por el contrario usas un MEGA puedes usar exclusivamente:
analogReference(INTERNAL1V1);
analogReference(INTERNAL2V56);
Que te activará referencias de 1.1V y 2.56V respectivamente.
Que te activará referencias de 1.1V y 2.56V respectivamente.
Si usamos la clave DEFAULT, volvemos a la referencia estándar de 5V en prácticamente todos los modelos de Arduino.
analogReference(DEFAULT);
analogReference(DEFAULT);
Cuidado con la referencia DEFAULT, porque en el DUE significa 3,3V porque es su tensión de referencia. Asegúrate de esto antes de usarlo alegremente.
Cuando conectemos una tensión de referencia al pin AREF, tenemos que avisar a Arduino de que queremos usarla. Y eso lo hacemos con la instrucción
analogReference(EXTERNAL);
Usad la cabeza cuando modifiquéis la referencia analógica, porque si no tenéis cuidado, se quema el Arduino. Es relativamente fácil destruirlo con ciertas acciones que parecen inocentes:
Asegúrate de que si usas una referencia externa, los GND de Arduino y de la referencia sean el mismo uniéndolos. No hacer esto es destruir el Arduino.
No uses bajo ninguna circunstancia menos de 0v en el pin AREF ( O una señal que varíe y pueda tener transitorios negativos) porque el resultado es impredecible.
Si conectas una tensión externa de referencia, no llames a analogRead() antes de ejecutar la instrucción analogReference(EXTERNAL), porque harías un cortocircuito entre la señal de comparación interna y la tensión externa en AREF, y destruirás el Arduino.
No conectes a AREF menos de 1V ni más de 5V, no puedes poner 12 y esperar que te dé un valor tranquilamente.
Materiales
Placa de Arduino
1 Display LCD 1602A con I2C
1 Potenciómetro
Protoboard, Cables para conexiones y un Cable USB para conectar Arduino al PC y sirve además como alimentación
Esquema 1
Vamos a montar un circuito de prueba con un display I2C y un potenciómetro. Pero en esta ocasión, conectaremos en los extremos del potenciómetro GND y 3,3V de modo que en el pin central que leeremos con A1, no puede nunca superar los 3,3V simulando un sensor con ese valor máximo.
Al ir girando el potenciómetro, leeremos una caída de tensión entre 0V y 3,3V. y la lectura del pin A1, dará valores entre 0 y 670, ya que estamos en el caso que definíamos un poco más arriba.
Montaje 1
Código 1
El programa simplemente leerá el pin analógico A1 y enviara su valor a un display I2C
El programa simplemente leerá el pin analógico A1 y enviara su valor a un display I2C
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define I2C_ADDR 0x27
LiquidCrystal_I2C lcd(I2C_ADDR, 16, 2);
void setup(){
lcd.init();
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("MAGOMIGUELON.ES");
}
void loop(){
lcd.setCursor ( 0, 1 ); // Vamos a la segunda linea
lcd.print(analogRead(A1));
}
Esquema 2
Si ahora conectamos la tensión de 3,3V interna de Arduino al pin AREF, tendremos un circuito como este:
Montaje 2
Código 2
Es el mismo código pero hemos añadido analogReference(EXTERNAL); donde le decimos a Arduino que vamos a usar una tensión de referencia externa. La otra cosa que hemos añadido es para borrar los rastro de pantalla en el loop.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define I2C_ADDR 0x27
LiquidCrystal_I2C lcd(I2C_ADDR, 16, 2);
void setup(){
lcd.init();
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("MAGOMIGUELON.ES");
analogReference(EXTERNAL); // Atentos aqui
}
void loop(){
lcd.setCursor ( 0, 1 ); // Vamos a la segunda linea
lcd.print(analogRead(A1));
lcd.print(" "); // Para borrar rastros en pantalla
}
No hay comentarios:
Publicar un comentario