Professional Documents
Culture Documents
INGENIERIA ELECTRICA
Convertidor Analgico-Digital.
Grupo: ________
INTEGRANTES
Calificacin: ___________
JLDM Pgina 1 de 18
CARRERA DE INGENIERIA ELECTRICA.
Prcticas de Laboratorio de Electrnica III. Practica No. 13
OBJETIVOS:
a) Manejo del software de programacin CodeWarrior, en su versin 6.1, para configuracin del
microcontrolador HC08 en la utilidad del ADC.
b) Configuracin de los registros del ADC en el microcontrolador HC08.
c) Manejo de la herramienta de desarrollo DEMOJM, en la configuracin de sus puertos ADC.
Introduccin terica
Un sistema de control (como un microcontrolador) no tiene capacidad alguna para trabajar con seales
analgicas, de modo que necesita convertirlas en seales digitales para poder trabajar con ellas.
Valores. Que valor en voltios define 0 y 1. En nuestro caso es tecnologa TTL (0 5V)
Resolucin analgica: n de bits que usamos para representar con una notacin digital una seal
analgica:
En el caso de un arduino Uno, el valor de 0 voltios analgico es expresado en digital como B0000000000
(0) y el valor de 5V analgico es expresado en digital como B1111111111 (1023).
Por lo tanto todo valor analgico intermedio es expresado con un valor entre 0 y 1023, es decir, sumo 1
en binario cada 4,883 mV.
Arduino Uno tiene una resolucin de 10 bits, es decir, unos valores entre 0 y 1023.
Arduino Due tiene una resolucin de 12 bits, es decir, unos valores entre 0 y 4095.
JLDM Pgina 2 de 18
CARRERA DE INGENIERIA ELECTRICA.
Prcticas de Laboratorio de Electrnica III. Practica No. 13
PWM
Como hemos dicho Arduino Uno tiene entradas analgicas que gracias a los conversores analgico digital
puede entender ese valor el microcontrolador, pero no tiene salidas analgicas puras y para solucionar
esto, usa la tcnica de PWM.
Las Salidas PWM (Pulse Width Modulation) permiten generar salidas analgicas desde pines digitales.
Arduino Uno no posee salidas analgicas puras.
El arduino due, posee dos salidas analgicas puras mediante dos conversores digital a analgico. Estos
pines pueden usarse para crear salidas de audio usando la librera correspondiente.
La modulacin por ancho de pulsos (tambin conocida como PWM, siglas en ingls de pulse-width
modulation) de una seal o fuente de energa es una tcnica en la que se modifica el ciclo de trabajo de
una seal peridica (una senoidal o una cuadrada, por ejemplo), ya sea para transmitir informacin a travs
de un canal de comunicaciones o para controlar la cantidad de energa que se enva a una carga.
El ciclo de trabajo de una seal peridica es el ancho relativo de su parte positiva en relacin con el perodo.
duty cycle = (tiempo que la salida est a uno o HIGH)/ (periodo de la funcin)
JLDM Pgina 3 de 18
CARRERA DE INGENIERIA ELECTRICA.
Prcticas de Laboratorio de Electrnica III. Practica No. 13
En este ejemplo se ve como simular con PWM una onda sinusoidal analgica.
En la actualidad existen muchos circuitos integrados en los que se implementa la modulacin PWM, por
ejemplo para lograr circuitos funcionales que puedan controlar fuentes conmutadas, controles de motores,
controles de elementos termoelctricos, choppers para sensores en ambientes ruidosos y algunas otras
aplicaciones.
JLDM Pgina 4 de 18
CARRERA DE INGENIERIA ELECTRICA.
Prcticas de Laboratorio de Electrnica III. Practica No. 13
Un microcontrolador solo entiende seales digitales (1s y 0s), por lo tanto para poder leer seales
analgicas necesitamos los convertidores Analgico a Digital (ADC).
JLDM Pgina 5 de 18
CARRERA DE INGENIERIA ELECTRICA.
Prcticas de Laboratorio de Electrnica III. Practica No. 13
Conversor digital analgico (DAC)
Al contrario que las seales analgicas, las seales digitales se pueden almacenar y transmitir sin
degradacin. Los DAC se usan para los altavoces, amplificadores para producir sonido. Ejemplo de la
transmisin de la voz por la lneas telefnicas.
En arduino para tratar las entradas y salidas digitales usamos las siguientes funciones:
analogReference().
analogRead().
analogWrite().
Las entradas digitales y analgicas (especialmente estas) son un recurso escaso en los
microcontroladores, para poder multiplicar esas entradas/salidas, podemos hacer uso de los multiplexores.
Los multiplexores son circuitos combinacionales con varias entradas y una nica salida de datos, estn
dotados de entradas de control capaces de seleccionar una, y slo una, de las entradas de datos para
permitir su transmisin desde la entrada seleccionada hacia dicha salida.
Esta es una tcnica muy utilizada para multiplicar las seales, con arduino podemos usar varios shield
para multiplexar las seales.
Muxshield:
Para ver las funciones de la librera de este shield para Arduino se pueden ver en la pgina
5: http://dlnmh9ip6v2uc.cloudfront.net/datasheets/Dev/Arduino/Shields/Mux_Shield_II_User_Guide.pdf
JLDM Pgina 6 de 18
CARRERA DE INGENIERIA ELECTRICA.
Prcticas de Laboratorio de Electrnica III. Practica No. 13
Permite hasta 48 pines de Arduino. Usa el TI 74HC4067 para la funcionalidad de multiplexacin de 16
canales y TI 74HC595 para los registros de cambio (registro de desplazamiento de tres estados). Tiene
mltiples modos: entrada y salida digital y entrada analgica
Breve repaso de lo que es la conversin anloga a digital. Antes de comenzar a manipular el mdulo
ADC de la mquina MCF51JM128, se har un pequeo repaso sobre los conceptos relacionados con la
conversin anloga a digital de una seal.
Las mquinas, como los microcontroladores, tratan de medir y/o convertir las variables anlogas a datos
binarios, pero el proceso de convertir introduce una inevitable prdida de informacin. Esta prdida es
inherente al proceso de discretizar las seales anlogas y continuas, que finalmente sern llevadas a
cantidades binarias.
La Figura 12.1 representa una seal anloga continua entre los puntos t0 y t1, que desde el punto de
vista de la magnitud ser sometida a un nmero discreto de valores binarios y que la cantidad de valores
se conoce con el nombre de Resolucin del sistema.
Esos valores deben estar comprendidos dentro de dos lmites, que forman la ventana de conversin o
valores de referencia (Vmin, Vmax). Para la Figura 12.1, el punto P tiene una interpretacin en el
mundo de lo discreto y es de Vx.
Se recomienda que el alumno aproveche al mximo la resolucin del sistema, adecuando la seal
anloga para que excursione de la manera ms completa en la ventana de conversin. Por ejemplo, una
JLDM Pgina 7 de 18
CARRERA DE INGENIERIA ELECTRICA.
Prcticas de Laboratorio de Electrnica III. Practica No. 13
seal con un valor mximo de 100mV deber ser amplificada por un factor de 30, para una ventana de
conversin de 3V y de sta manera aprovechar la resolucin del sistema.
Para calcular el paso mnimo de conversin y por otro lado conocer el intervalo de prdida de
informacin, supngase que se tiene una seal sometida a un convertidor de 12 bits de resolucin, un
Vmin = 0V y un Vmax = 5V. El paso mnimo de conversin est dado por:
El clculo anterior indica que la diferencia en magnitud entre el resultado de una conversin y la
inmediatamente superior (o inferior) es de 1.22mV. Todo valor que no sea mltiplo entero de un paso
mnimo, se deber aproximar al valor ms cercano y es all donde un convertidor A/D ignora
informacin del mundo anlogo.
La Figura 12.2 presenta una seal anloga continua entre los puntos t0 y t1, que desde el punto de vista
del muestreo es sometida a un nmero finito de muestras y que cada muestra es tomada a un intervalo
constante T, llamado perodo de muestreo.
Al igual que en la resolucin el muestreo introduce prdida de informacin, debido a los valores que
no son muestreados entre dos intervalos de muestreo contiguos.
Idealmente la razon de muestreo debera ser infinita, pero existen restricciones tecnolgicas. Entonces,
mientras menor sea la separacin entre los Si (T pequeo), mostrados en la Figura 12.6, ms fiel ser
la seal digitalizada con respecto a la seal anloga original.
Error de muestreo (Sampling Error): Este tipo de error est asociado al modelo de entrada del
convertidor A/D y tiene que ver con la impedancia y capacitancia caractersticas de entrada
JLDM Pgina 8 de 18
CARRERA DE INGENIERIA ELECTRICA.
Prcticas de Laboratorio de Electrnica III. Practica No. 13
Por ejemplo: Para el convertidor A/D del microcontrolador MCF51JM128, cuya impedancia tpica es
de RADIN = 7K y CADIN = 5.5pF, en donde muestras cercanas a LSB (significa que para una
resolucin de 12 bits este error tendr un peso de 0.024%, Less Significant bit) con una resolucin de
12 bits, pueden ser realizadas con la mayor velocidad de conversin de 3.5 ciclos de un reloj de 8MHz.
Lo anterior es posible siempre y cuando la impedancia caracterstica (Zs) de la seal aplicada al pin
A/D, permanezca cercana a un valor de 2K que sera el equivalente a la impedancia caracterstica del
A/D (ZAD).
NOTA: El alumno deber siempre conocer las limitaciones de velocidad del convertidor y aplicar el teorema de
Nyquist-Shannon a la hora de digitalizar.
Error por goteo del pin (Pin Leakage Error): Es posible que se presente una corriente de goteo debida
a una alta resistencia de la fuente anloga a digitalizar. El alumno deber garantizar que Rs siempre
est por debajo de:
En donde:
VDDAD: Voltaje de alimentacin del A/D
N: Resolucin de la conversin A/D
ILEAK: Corriente de goteo (dato del manual)
Esta condicin garantiza que el error por goteo estar por debajo de LSB.
Error por ruido inducido (Noise Induced Error): El ruido en una conversin anloga a digital ocurre
durante el muestreo (sample) o el proceso de conversin. El ruido inducido es inevitable, pero puede
ser minimizado y para esto se recomiendan las siguientes acciones:
JLDM Pgina 9 de 18
CARRERA DE INGENIERIA ELECTRICA.
Prcticas de Laboratorio de Electrnica III. Practica No. 13
Ubicar un condensador de 0.1uF, con baja ESR (resistencia serie equivalente) entre VREFH y
VREFL.
Ubicar un condensador de 0.1uF, con baja ESR entre VDDAD y VSSAD.
Si la fuente VDD usa un aislamiento inductivo, es necesario ubicar un condensador adicional de
1uF entre VDDAD y VSSAD.
Si VREFL se encuentra al nivel de VSS, es necesario garantizar una buena unin elctrica.
No hacer conmutaciones de pines I/O durante una conversin.
Existen situaciones en donde el ruido radiado o conducido (EMI) es intenso, para esto se hacen las
siguientes recomendaciones:
Ubicar un condensador de 0.01uF, con baja ESR a la entrada del canal de conversin, pero se
debe tener en cuenta que esto altera la velocidad de muestreo.
Hacer algoritmos que promedien las muestras, para suavizar los cambios ruidosos.
Utilizar un reloj asncrono como fuente del ADC y promediar las muestras.
Error de cuantizacin (Quantization Error): Para una resolucin de 12 bits, un paso de conversin
(code) corresponde a una 1/4096 parte en la ventana de conversin. Este paso es el delta entre un cdigo
y el vecino inmediato, entonces la relacin que define este paso sera:
1 LSB = 5V/1024
1 LSB = 4.88mV
De donde:
Error de cuantizacin = 2.44mV
Error de escala cero (Zero Scale Error =Offset Error): Est definido como la diferencia entre el
ancho del paso actual de conversin y el paso de conversin terico, esto para el primer paso de
conversin. La Figura 12.4 ilustra el fenmeno de error de escala cero.
JLDM Pgina 10 de 18
CARRERA DE INGENIERIA ELECTRICA.
Prcticas de Laboratorio de Electrnica III. Practica No. 13
La muestra tomada en el punto P debera arrojar un valor de cuantizacin de 0x000, para la muestra
tomada en S0 (valor terico). Como se puede apreciar el resultado real fue de 0x001, es decir un error
de cero (e) de 1LSB.
Error de escala plena (Full Scale Error): Est definido como la diferencia entre el ancho del paso
actual de conversin y el paso de conversin terico, esto para el ltimo paso de conversin. La
Figura 12.5 ilustra el fenmeno de error de escala plena.
La muestra tomada en el punto P debera arrojar un valor de cuantizacin de 0xFFF, para la muestra
tomada en S (valor terico). Como se puede apreciar el resultado real fue de 0xFFE, es decir un error
de escala plena (e) de 1LSb.
Error diferencial no lineal (Diferential non Linearity Error): Est definido como la peor diferencia
entre el valor terico y el valor actual, de un paso de conversin. Esto aplica para toda conversin en
todo el rango de la escala de conversin.
Error integral no lineal (Integral non Linearity Error): Est definido como el ms alto valor (valor
absoluto) de la suma de los errores diferenciales acumulados.
Error por parpadeo en la conversin (Code Jitter Error): Se presenta cuando en ciertos puntos, un
voltaje de entrada determinado es convertido de uno a dos valores, durante un muestreo repetitivo.
Es usual que pequeas cantidades de ruido en el sistema, puedan causar que el convertidor se
indetermine (valor equivocado entre dos cdigos consecutivos). El error tpico de jitter es de LSb.
Para minimizar el error por jitter se recomienda hacer un promedio de las medidas.
Error por no monotonicidad (Non Monotonicity Error): Se presenta cuando el convertidor arroja un
cdigo bajo ante un voltaje alto de entrada.
JLDM Pgina 11 de 18
CARRERA DE INGENIERIA ELECTRICA.
Prcticas de Laboratorio de Electrnica III. Practica No. 13
1 Computadora
1 Software Arduino IDE.
1 Tarjeta Arduino
1 LM35
DESARRROLLO DE LA PRCTICA.
El primer ejercicio que se llevara a cabo es leer una seal analgica conectada a la A3 y el valor
obtenido se ver en la ventana del Monitor Serie.
/*
* Practica 13a_ADC Fecha:
* Grupo: 6EV Equipo:
* Integrantes: JLDM
* Objetivo: Convertidor Analgico Digital con Monitor serie
*/
void setup() {
Serial..begin(9600); // Configura la terminal Monitor Serie
}
void loop() {
val=analogRead(AnalogTerm);
Serial.println(val);
}
Para llevar a cabo la adquicin de datos, para su despus conversin de la seal analgica a digital
debemos conocer el tiempo de muestreo, esto lo hacen os de la siguiente forma.
/*
* Practica 13b_ADC Fecha:
* Grupo: 6EV Equipo:
* Integrantes: JLDM
* Objetivo: Conocer el tiempo de muestreo de la Placa Arduino
*/
void setup(){
Serial.begin(9600);
muestreo();
}
void loop(){
}
void muestreo(){
unsigned long time1=0;
unsigned long time=0;
Serial.println("*************************");
Serial.println("ENSAYO TIEMPO DE MUESTRO:");
Serial.println("*************************");
for(byte i =0; i<4; i++){
time1=micros();
JLDM Pgina 12 de 18
CARRERA DE INGENIERIA ELECTRICA.
Prcticas de Laboratorio de Electrnica III. Practica No. 13
int A=analogRead(A0);
time=micros()-time1;
Serial.print(" Muestra: ");
Serial.print(i+1);
Serial.print(" Tiempo: ");
Serial.println(time);
}
Excepto en la primera medida, las dems tiene un tiempo de muestreo de 112 micro segundos, lo que
equivale a una frecuencia de muestreo de 8.928 kHz, podemos tomar por valido ya que estoy
utilizando una placa Arduino UNO. A dems debemos tener en cuenta una pequea perdida de
tiempo que tenemos al guardar y calcular las variables time1 y time.
Otro factor a tener en cuenta del ADC es su resolucin, para ello hablamos de los bits
de resolucin que tiene, los bits no permiten hacer combinaciones, cuantos mas tengamos mayor
numero de combinaciones podremos hacer, cada una de estas combinaciones muestra una medida
del sistema analgico, la cantidad de medidas que tenemos sern 2 elevado al numero de bits de
resolucin. Puesto que Arduino UNO, en mi caso, tiene un ADC de 10 bits de resolucin tendr 1024
combinaciones. La placa Arduino DUE por ejemplo cuenta con un ADC de 12 bits
(4096 combinaciones).
Pero hay un segundo factor que interviene en la resolucin, es el rango de medida, El rango de
Voltae de las placas Arduino por defecto es de 5v o 3.3v. Con esto sabemos que en voltios tenemos
una resolucin igual a;
5
= = 4.88
1024
JLDM Pgina 13 de 18
CARRERA DE INGENIERIA ELECTRICA.
Prcticas de Laboratorio de Electrnica III. Practica No. 13
A continuacin, haremos un ejemplo con Arduino de la resolucin midiendo el voltaje en un
potencimetro, iremos girando la manecilla del potencimetro y veremos que conversin da el ADC y
a que corresponde en voltaje. Comprobaremos adems que el paso calculado antes de 4.88mV es
correcto.
/*
* Practica 13b_ADC Fecha:
* Grupo: 6EV Equipo:
* Integrantes: JLDM
* Objetivo: Conocer el tiempo de muestreo de la Placa Arduino
*/
int contador;
void setup(){
contador=1;
Serial.begin(9600);
Serial.println("*****************");
Serial.println("ENSAYO RESOLUCION");
Serial.println("*****************");
}
void loop(){
muestreo();
contador++;
}
void muestreo(){
int A=analogRead(A0);
float B= float(A)*5/1023;
Serial.print(" Muestra: ");
Serial.print(contador);
Serial.print(" Medida Digital: ");
Serial.print(A);
Serial.print(" Medida Analogica: ");
Serial.println(B, 5);
delay(1000);
}
JLDM Pgina 14 de 18
CARRERA DE INGENIERIA ELECTRICA.
Prcticas de Laboratorio de Electrnica III. Practica No. 13
[1.28543 1.28055]
= = 4.88
[263 262]
En ocasiones, utilizaremos sensores cuyo rango de voltaje no ser igual a [0, 5v]. En primer lugar,
tenemos que tener en cuenta, que no debemos introducir en la placa Arduino voltajes mayores de 5v
o 3.3v, partiendo de esto podemos cambiar el lmite superior del rango de voltaje. De
manera interna o externa:
A continuacin haremos un nuevo ejemplo anlogo al anterior, con una placa Arduino utilizando la
funcin interna analogReference para que su voltaje de referencia sea 1.1v. Para alimentar el
potencimetro requeriremos una fuente de 1.1v, para crearla utilizaremos un divisor de tensin y un
seguido nivel de tensin:
JLDM Pgina 15 de 18
CARRERA DE INGENIERIA ELECTRICA.
Prcticas de Laboratorio de Electrnica III. Practica No. 13
Una vez montado cargamos el siguiente programa, para verificar que funciona
correctamente:
/*
* Practica 13d_ADC Fecha:
* Grupo: 6EV Equipo:
* Integrantes: JLDM
* Objetivo: Conocer el tiempo de muestreo de la Placa Arduino
*/
int contador;
void setup(){
analogReference(INTERNAL);
contador=1;
Serial.begin(9600);
Serial.println("******************");
Serial.println("ENSAYO RESOLUCION");
Serial.println("REFERENCIA INTERNA");
Serial.println("******************");
}
void loop(){
muestreo();
contador++;
}
void muestreo(){
int A=analogRead(A0);
float B= float(A)*1.1/1023;
Serial.print(" Muestra: ");
Serial.print(contador);
Serial.print(" Medida Digital: ");
Serial.print(A);
Serial.print(" Medida Analogica: ");
JLDM Pgina 16 de 18
CARRERA DE INGENIERIA ELECTRICA.
Prcticas de Laboratorio de Electrnica III. Practica No. 13
Serial.println(B, 5);
delay(1000);
}
[0.52581 0.48387]
= = 1.075
[489 450]
Finalmente, queda la manera externa para cambiar el voltaje de referencia, para ello utilizaremos el
pin AREF. El funcionamiento de este pin es sencillo el voltaje que introduzcamos por el, ser la nueva
referencia, pero cuidado, dicho voltaje debe estar entre entre 1.1v y 5v.
/*
* Practica 13e_ADC Fecha:
* Grupo: 6EV Equipo:
JLDM Pgina 17 de 18
CARRERA DE INGENIERIA ELECTRICA.
Prcticas de Laboratorio de Electrnica III. Practica No. 13
* Integrantes: JLDM
* Objetivo: Conocer el tiempo de muestreo de la Placa Arduino
*/
int contador;
void setup(){
analogReference(EXTERNAL);
contador=1;
Serial.begin(9600);
Serial.println("******************");
Serial.println("ENSAYO RESOLUCION");
Serial.println("REFERENCIA EXTERNA");
Serial.println("******************");
}
void loop(){
muestreo();
contador++;
}
void muestreo(){
int A=analogRead(A0);
float B= float(A)*2.5/1023;
Serial.print(" Muestra: ");
Serial.print(contador);
Serial.print(" Medida Digital: ");
Serial.print(A);
Serial.print(" Medida Analogica: ");
Serial.println(B, 5);
delay(1000);
}
JLDM Pgina 18 de 18
CARRERA DE INGENIERIA ELECTRICA.
Prcticas de Laboratorio de Electrnica III. Practica No. 13
Este sensor se caracteriza por tener la seal digital calibrada por lo que asegura una alta calidad y
una fiabilidad a lo largo del tiempo, ya que contiene un micro controlador de 8 bits integrado. Est
constituido por dos sensores resistivos (NTC y humedad). Tiene una excelente calidad y una
respuesta rpida en las medidas. Puede medir la humedad entre el rango 20% aprox. 95% y la
temperatura entre el rango 0C 50C.
Pin 1 = VCC
Pin2 = Data
Pin 3 = GND
JLDM Pgina 19 de 18
CARRERA DE INGENIERIA ELECTRICA.
Prcticas de Laboratorio de Electrnica III. Practica No. 13
cable. Es importante tener bien identificado cada hilo para conectarlo en su pin correspondiente del
Arduino.
En la parte del Arduino UNO conectaremos el cable blanco (seal) al pin A0 analgico, como se
muestra en la figura.
El siguiente paso se conecta el cable negro (GND) al pin GND, posteriormente se conecta el cable
gris (VCC) al pin de 5v.
/*
* Practica 13e_ADC Fecha:
* Grupo: 6EV Equipo:
* Integrantes: JLDM
* Objetivo: Conocer el tiempo de muestreo de la Placa Arduino
*/
JLDM Pgina 20 de 18
CARRERA DE INGENIERIA ELECTRICA.
Prcticas de Laboratorio de Electrnica III. Practica No. 13
void setup()
{
DDRC |= _BV(DHT11_PIN);
PORTC |= _BV(DHT11_PIN);
Serial.begin(9600);
Serial.println("Ready");
}
void loop()
{
byte dht11_dat[5];
byte dht11_in;
byte i; // start condition
// 1. pull-down i/o pin from 18ms
PORTC &= ~_BV(DHT11_PIN);
delay(18);
PORTC |= _BV(DHT11_PIN);
delayMicroseconds(40);
DDRC &= ~_BV(DHT11_PIN);
delayMicroseconds(40);
dht11_in = PINC & _BV(DHT11_PIN);
if(dht11_in)
{
Serial.println("dht11 start condition 1 not met");
return;
}
delayMicroseconds(80);
dht11_in = PINC & _BV(DHT11_PIN);
if(!dht11_in)
{
Serial.println("dht11 start condition 2 not met");
return;
}
delayMicroseconds(80);
// now ready for data reception
for (i=0; i<5; i++)
dht11_dat[i] = read_dht11_dat();
DDRC |= _BV(DHT11_PIN);
PORTC |= _BV(DHT11_PIN);
byte dht11_check_sum = dht11_dat[0]+dht11_dat[1]+dht11_dat[2]+dht11_dat[3];
// check check_sum
if(dht11_dat[4]!= dht11_check_sum)
{
Serial.println("DHT11 checksum error");
}
Serial.print("Humedad = ");
Serial.print(dht11_dat[0], DEC);
Serial.print(".");
Serial.print(dht11_dat[1], DEC);
Serial.print("% ");
Serial.print("Temperatura = ");
Serial.print(dht11_dat[2], DEC);
Serial.print(".");
Serial.print(dht11_dat[3], DEC);
Serial.println("C ");
delay(2000);
}
JLDM Pgina 21 de 18
CARRERA DE INGENIERIA ELECTRICA.
Prcticas de Laboratorio de Electrnica III. Practica No. 13
JLDM Pgina 22 de 18