Documentos de Académico
Documentos de Profesional
Documentos de Cultura
CONVERTIDOR
ANALÓGICO-DIGITAL
PROCESO DE FILTRADO
Los dos primeros procesos del mecanismo son el filtro de anti-aliasing y el circuito de
muestreo y retención. La función de muestreo y retención lleva a cabo dos
operaciones, la primera de las cuales es el muestreo. El muestreo es el proceso de
tomar un número suficiente de valores discretos en determinados puntos de una
forma de onda como para poder definir adecuadamente esa forma de onda. Cuantas
más muestras se tomen, más precisamente se podrá definir esa forma de onda. El
muestreo convierte una señal analógica en una serie de impulsos, cada uno de los
cuales representa la amplitud de la señal en un determinado instante.
Cuando hay que muestrear una señal analógica, es necesario satisfacer ciertos
criterios para poder representar de forma precisa la señal original. Todas las señales
analógicas (excepto las ondas sinusoidales puras) contienen un espectro de
frecuencias componentes, denominadas armónicos. Los armónicos de una señal
analógica son ondas sinusoidales de diferentes frecuencias y amplitudes. Al sumar
todos los armónicos de una cierta forma de onda periódica, el resultado es la señal
original. Antes de poder muestrear una señal, es preciso pasarla a través de un filtro
paso-bajo (filtro de anti-aliasing) para eliminar las frecuencias armónicas situadas por
encima de un cierto valor, que estará determinado por la frecuencia de Nyquist.
El teorema de muestreo establece que para poder representar una señal analógica, la
frecuencia de muestreo, fmuestreo, debe ser al menos dos veces superior a la
componente de mayor frecuencia fa(máx) de la señal analógica. Otra forma de indicar
este hecho es que la frecuencia analógica más alta no puede ser mayor que la mitad de
Página 1 de 22
la frecuencia de muestreo. La frecuencia f a(máx) se conoce como la frecuencia de
Nyquist. En la práctica, la frecuencia de muestreo debe ser dos veces superior a la
frecuencia analógica más alta, o sea fmuestreo ≥ 2fa(máx). Entonces, se debe incorporar
un mecanismo de cualquier naturaleza que permita tomar valores de la señal original
a una velocidad que supere el doble de la frecuencia de la señal a muestrear,
recomendándose que la frecuencia de muestreo sea tan alta como sea posible a modo
de recrear la señal original tantas veces como sea posible; así se garantiza la fidelidad.
Después del filtrado y del muestreo, el nivel muestreado debe mantenerse constante
hasta que se tome la siguiente muestra. Esto es necesario para que el ADC disponga
del suficiente tiempo como para procesar el valor muestreado. Esta operación de
muestreo y retención genera una forma de onda “en escalera” que se aproxima a la
forma de onda analógica de entrada. Este tipo de circuito está conformado
generalmente por un arreglo de resistencias y capacitores.
Página 2 de 22
CONVERTIDOR ANALOGICO – DIGITAL
Página 3 de 22
𝑉𝑟𝑒𝑓 + − 𝑉𝑟𝑒𝑓 −
𝑟=
2𝑛 −1
donde Vref+ y Vref- definen el rango o intervalo efectivo a medir. Por ejemplo, si el valor
de la señal de entrada a medir oscila entre 1V y 4V entonces sería conveniente
establecer Vref+=4V y Vref-=1V y así aprovechar al máximo el rango dinámico de
conversión. Otro parámetro importante es el valor binario máximo que puede
representarse con la cantidad de bits que conforman la palabra digital de salida,
puesto que a mayor cantidad de bits, mejor resolución. En primera figura se modela
una señal analógica mediante el uso de un código binario de 2 bits, en la segunda
figura se usa un código de 4 bits, lo cual evidencia que a mayor cantidad de bits en la
palabra código equivalente a la amplitud de onda de la señal analógica, mejor es la
modelación de la señal original, a modo de evitar la pérdida de información.
EL AMPLIFICADOR OPERACIONAL
El método flash utiliza circuitos comparadores con prioridad como el 74LS147 que
relaciona una serie de tensiones de referencia con la tensión de entrada analógica.
Cuando la tensión analógica sobrepasa a la tensión de referencia de un comparador
determinado, se genera un nivel ALTO. La figura presenta un convertidor de 3 bits que
utiliza siete circuitos comparadores; no se necesita comparador para el caso de que
todas las comparaciones sean cero.
Página 4 de 22
En general, se requieren 2 n−1
comparadores para la conversión a un
código binario de n bits. El número de
bits empleado en un ADC es su
resolución. Una de las desventajas del
ADC flash es el gran número de
comparadores necesarios para un
número binario de tamaño razonable,
por ejemplo, para construir un ADC
Flash de 8 bits de salida se requiere
emplear 255 AmpOp como
comparadores, lo que es mucha
circuitería. Su principal ventaja es que
tiene un tiempo de conversión rápido,
gracias a su alta tasa de transferencia,
la cual se mide en muestras por
segundo. La tensión de referencia de
cada comparador se establece
mediante un circuito divisor de tensión resistivo. La salida de cada comparador se
conecta a una entrada del codificador de prioridad. El codificador se habilita mediante
un impulso aplicado a la entrada de habilitación EN, y el código de tres bits que
representa el valor de la entrada analógica se presenta en las salidas del codificador.
El código binario queda determinado por la entrada de mayor orden que se encuentre
a nivel ALTO, ya que el circuito es un codificador de prioridad.
La frecuencia de los impulsos de habilitación y el número de bits del código binario
determinan la precisión con la que la secuencia de códigos digitales representa la
entrada del ADC. Debe haber un pulso de habilitación por cada nivel de muestreo de la
señal de entrada.
Página 5 de 22
y, como resultado, habrá una rampa lineal negativa de tensión en la salida de A1, como
se muestra en la Figura a. Cuando el contador alcance un valor de cuenta especificado,
se pondrá a cero (RESET) y la
lógica de control conmutará a la
tensión de referencia negativa
(−VREF) aplicándola a la
entrada de A1, como muestra la
Figura b. En este instante, el
condensador está cargado a una
tensión negativa (−V)
proporcional a la tensión
analógica de entrada. A
continuación, el condensador se
descarga linealmente debido a
la corriente constante de
−VREF, como ilustra la Figura c.
Esta descarga lineal produce
una rampa positiva en la salida
de A1, cuyo valor inicial es −V y
que tiene una pendiente
constante, independiente de la
tensión de carga. A medida que
el condensador se descarga, el
contador avanza desde su
estado de RESET. El tiempo que
tarda el condensador en descargarse hasta cero depende de la tensión inicial −V
(proporcional a Vin), puesto que la velocidad (pendiente) de descarga es constante.
Cuando la tensión de salida del integrador (A1) alcanza el valor cero, el comparador
A2 conmuta al estado BAJO e inhabilita la señal de reloj aplicada al contador. La
cuenta binaria se almacena en los latches, completando un ciclo de conversión. La
cuenta binaria es proporcional a Vin, ya que el tiempo que tarda el condensador en
descargarse sólo depende de −V, y el contador registra este intervalo de tiempo.
Página 6 de 22
o menor que la salida del DAC. Si la salida del DAC es mayor que la señal de entrada, la
salida del comparador está
a nivel BAJO, haciendo que
el bit que estaba a uno en
el registro pase a cero.
por el contrario, si la salida
Vout del DAC es menor que
la entrada, el bit que se
puso a 1 se mantiene en
alto el registro y se
continua con el bit
siguiente más significativo.
El sistema realiza esta
operación con el MSB
primero, luego con el
siguiente bit más
significativo, después con
el siguiente, y así sucesivamente hasta llegar al bit menos significativo o LSB. Después
de que todos los bits del DAC hayan sido aplicados, el ciclo de conversión estará
completo y el SAR mostrará la salida binaria serie que representa el valor digital de la
señal de entrada.
Por ejemplo: la resolución del modelo mostrado en la figura anterior de 4 bits sería
r=(5-0)/(24-1), lo que resulta una resolución de 0.33V, o sea la señal debe superar este
valor entre medidas para que cambie un bit de la palabra digital. Por ahora
supongamos que la señal de entrada es Vin=3.95V y 1) el SAR coloca a B3 en “1”
(MSB). Entonces el equivalente DAC a la palabra 1000 sería 8*r= 2.66V, valor que es
menor a la señal de entrada y el comparador le indica al SAR que deje el bit B3 en “1” y
continue con el siguiente. Luego 2) el SAR coloca B2 en “1” generando una palabra
digital 1100, donde el DAC arroja 12*r=4V que resulta un valor mayor a la señal de
entrada y el comparador avisa al SAR que ponga el bit B2 en “0” porque se pasó del
valor de entrada. Posteriormente 3) el SAR coloca B1 en “1” para formar la palabra
1010 y el DAC arroja 10*r=3.33V, y como este valor es menor a la señal de entrada, el
comparador le indica al SAR que deje este bit en “1”. Finalmente 4) el SAR coloca B0
(LSB) en “1” para formar la palabra digital 1011 y que el DAC arroje 11*r=3.67. como
este valor es menor que la señal de entrada, el comparador le indica al SAR que deje
este bit en “1” para enviar como salida la palabra 1011 como el equivalente binario de
una señal analógica de 3.95V.
Se observa que el valor final del DAC fue 3.67V que dista significativamente del valor
de la señal de entrada. Esto se arregla adicionando más bits a la conversión para
mejorar la resolución; aunque esto también aumentaría el tiempo de la conversión.
Observe en el ejemplo de 4 bits se debió hacer el recorrido 4 veces, o sea que para un
ADC de 10 bits se debe hacer el procedimiento 10 veces. En la siguiente tabla se
observa una corrida con el mismo valor de entrada (3,95V) en un ADC-AS de 10 bits.
La resolución sería:
r=(5-0)/(210-1)= 0,004887585532746823069403714565≈0,004888
Página 7 de 22
Bit a Salida del DAC Salida del SAR SAR Observaciones
modificar Comparador Binario DECIMAL
1000000000 512 Arranca la conversión. B10=1
B9 512*r=2,502656V 1 (DAC<Vin) 1100000000 767 B9 queda en 1. B8=1
B8 767*r=3,749096V 1 (DAC<Vin) 1110000000 895 B8 queda en 1. B7=1
B7 895*r=4,37476V 0 (Vin<DAC) 1101000000 831 B7 queda en 0. B6=1
B6 831*r=4,061928V 0 (Vin<DAC) 1100100000 799 B6 queda en 0. B5=1
B5 799*r=3,905512V 1 (DAC<Vin) 1100110000 815 B5 queda en 1. B4=1
B4 815*r=3,98372V 0 (Vin<DAC) 1100101000 807 B4 queda en 0. B3=1
B3 807*r=3,944616V 1 (DAC<Vin) 1100101100 811 B3 queda en 1. B2=1
B2 811*r=3,964168V 0 (Vin<DAC) 1100101010 809 B2 queda en 0. B1=1
B1 809*r=3,954392V 0 (Vin<DAC) 1100101001 808 B1 queda en 0. B0=1
B0 808*r=3,949504V 1 (DAC<Vin) 1100101001 808 B0 queda en 1. Palabra de salida
1100101001 equivalente a 3,95V
Note que el valor del DAC e final es 3.949504V, valor que está mas cercano al
resultado del ADC de 4 bits. Se puede concluir que a mayor cantidad de bits, menor
resolución y más aproximado el valor.
Página 8 de 22
El ADC0803-0804
Página 9 de 22
Al presionar START, el pin /WR recibe un pulso y el ADC arranca la conversión. La
salida se muestra en los displays en formato hexadecimal. Note que el dispositivo
tiene 3 aterramientos: para la señal de entrada Vin- (a menos que la referencia sea
flotante como las termocuplas, por ejemplo), A GND que es el aterramiento para los
dispositivos analógicos (como el AmpOp) y D GND que es el aterramiento para los
dispositivos digitales. En la mayoría de los casos A GND y D GND se conectan a la
misma tierra.
Página 10 de 22
4. Finalmente se hacen las operaciones necesarias para colocar el resultado en el
puerto B del microcontrolador y visualizar el resultado en formato HEX en los
7 segmentos.
La desventaja de usar un ADC0804 es que posee una entrada analógica y por tanto
debe adicionarse un multiplexor analógico para monitorear secuencialmente varias
señales. Este no es el caso del ADC0808 o ADC0809 (se diferencian por la precisión),
los cuales poseen un multiplexor incorporado para hacer más eficiente el diseño. Los
tiempos de duracion de los pulsos deben ser mayores a los señalados en el datasheets,
por tanto se recomienda implementar una espera de por lo menos 1µs. En la siguiente
figura se muestra una forma básica de uso del ADC0808. El ADC0808 y ADC0809
poseen varios pines adicionales para:
Página 11 de 22
START: Pulso en alto de arranque de la conversión.
CLOCK: Señal de reloj para la velocidad de conversión (entre 10KHz y
1.28MHz).
Página 12 de 22
Debido a la necesidad de usar comunicación serial para recibir y enviar datos a través
de registros de corrimiento, en el mercado existen convertidores que incorporan en su
arquitectura estas funciones, tales como ADC0831, ADC0832, ADC0834 y ADC0838;
donde el último dígito del código indica la cantidad de entradas analógicas
multiplexadas que incorporan en sólo una pastilla. La desventaja de usar esta clase de
dispositivo es la necesidad de usar un µC u otro dispositivo inteligente. En la siguiente
figura se ilustra esta idea.
El µC debe inicialmente colocar /CS en alto para habilitar el dispositivo, el cual inicia
la conversión automaticamente por poseer un único canal de entrada. Esto no ocurre
con los otros convertidores seriales que se explicarán más adelante. Al finalizar la
conversión ya se encuentra disponible la palabra digital equivalente a la señal
analógica de entrada y es necesario extraerla de forma serial.
Página 13 de 22
Note que con un µC pequeño se puede construir desde un termómetro (como se
muestra en la figura) hasta otras aplicaciones más complejas.
Página 14 de 22
Si se desea hacer una conexión diferencial (derecha) donde la termocupla está
conectada con su terminal positivo en CH0 y la terminal negativa en CH1, entonces
hay que enviar la palabra 100 para que el ADC se configure en modo diferencial (1 de
arranque, 0 modo diferencial y 0 para indicar que el potencial más alto está conectado
al CH0. Ver datasheets, pag 12). En los dispositivos ADC0834 y ADC0838 la secuencia
es similar, o sea, se debe enviar una secuencia de bits donde el bit 1 (1) es el bit de
arranque, el bit 2 determina sí es modo diferencial (1) o modo simple (0), y del bit 3
en adelante se especifica cómo sería la conexión del canal de entrada (ver datasheets).
Registro ADCON0:
ADCS1 ADCS0 CH2 CH1 CH0 GO-DONE NA ADON
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
Página 15 de 22
Registro ADCON0:
ADFM ADCS2 NA NA PCFG3 PCFG2 PCFG1 PCFG0
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
ADFM: Justifica los bits de la palabra digital (1: derecha y 0: izquierda). Cuando
se usa 1 en este bit se usa la formula ADC=ADRESSH*256+ADRESL. Cuando se
usa 0 en este bit se usa la formula ADC=ADRESH*4+ADRESL/64.
PCFG3-PCFG0: Configura la cantidad de entradas analógicas o digitales del
puerto. Asimismo activa las tensiones de referencia de ser necesario.
EJEMPLO:
Se diseñó este circuito para
detectar el nivel de tensión
del pin RA0 conectado al
potenciómetro, cuyo valor
oscila entre 0V y 5V. No se
activan los niveles de
referencia externos y
solamente el canal AN0
estará activo como entrada
analógica. El resultado
obtenido se mostrará en la
primera línea de la LCD en
formato original (de 0 a
1023) y en la segunda línea
de la LCD su equivalente
en tensión (de 0V a 5V). La
programación en lenguaje
C del microcontrolador
podría ser la siguiente en
función de la aplicación:
#include <xc.h>
#define _XTAL_FREQ 4000000
Página 16 de 22
#pragma config FOSC = XT, WDTE = OFF, PWRTE = OFF, BOREN = OFF
#pragma config LVP = OFF, CPD = OFF, WRT = OFF, CP = OFF
#define RS PORTCbits.RC5
#define EN PORTCbits.RC7
void LCD(unsigned char DIGITO, unsigned char TIPO); // Función para escribir en la LCD
void LCD_CADENA (const char *CAD, unsigned char Posi); // Función para enviar una cadena de caracteres a la LCD
unsigned int ADC, AUX;
unsigned char DIG;
float CALCULO;
void main(void)
{
/***** CONFIGURACIÓN E INICIALIZACIÓN DE PUERTOS *****/
TRISA = 0b00000001; PORTA = 0b00000000;
TRISB = 0b00000000; PORTB = 0b00000000;
TRISC = 0b00000000; PORTC = 0b00000000;
TRISD = 0b00000000; PORTD = 0b00000000;
TRISE = 0b00000000; PORTE = 0b00000000;
/***** CONFIGURACIÓN DE REGISTROS BÁSICOS DEL ADC *****/
ADCON0 = 0b10000001; //RELOJ: FOSC/64, CANAL 0, ADC activo
ADCON1 = 0b11001110; // Derecha, RELOJ: FOSC/64,
// 1 analógico - sin referencias externas
/***** CONFIGURACIÓN DE LA PANTALLA LCD *****/
LCD(0b00111100,0); LCD(0b00010100,0);
LCD(0b00001100,0); LCD(0b00000110,0);
LCD_CADENA("ADC: ",0x80); LCD_CADENA("Tension: ",0xC0);
while(1)
{
ADCON0bits.GO_nDONE = 1; //Comienza la conversión AD
while(ADCON0bits.GO_nDONE==1) // Espera hasta que termine la conversión
{}
ADC = ADRESH*256+ADRESL; / Justificado a la derecha
AUX = ADC; // Se duplica el valor del ADC para no alterar el resultado
Página 17 de 22
EJEMPLO:
REGISTRO ADCON0:
ADFM VCFG NA NA CH1 CH0 GO-DONE ADON
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
Página 18 de 22
REGISTRO ANSEL:
NA ADCS2 ADCS1 ADCS0 ANS3 ANS2 ANS1 ANS0
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
#include <xc.h>
#define _XTAL_FREQ 4000000
#pragma config FOSC = INTRCIO, WDTE = OFF , PWRTE = OFF
#pragma config MCLRE = OFF, BOREN = OFF, CP = OFF, CPD = OFF
#define RELE GP5
unsigned int ADC;
void main(void)
{
TRISIO = 0b00001011; GPIO = 0; // Configura el puerto
ADCON0 = 0b11000001; ANSEL = 0b01100001; // Configura el ADC
while(1)
{
ADCON0bits.GO_nDONE = 1; //Comienza la conversión
while(ADCON0bits.GO_nDONE==1) // Espera hasta que termine la conversión
{}
ADC = ADRESH*256+ADRESL;
if(ADC<409) // Equivale a temperatura menor a 40ºC
RELE = 1;
if(ADC>613) // Equivale a temperatura mayor a 60ºC
RELE = 0;
__delay_ms(500); //Espera antes de comenzar una nueva conversión
}
}
Página 19 de 22
EJEMPLO:
Para resolver este ejercicio es necesario configurar los registros de este µC asociados
a la conversión AD. Para esto se revisó el apartado 21 del datasheets, indicando que se
deben configurar el ADCON0, ADCON1 y ADCON2.
REGISTRO ADCON0:
NA NA CH3 CH2 CH1 CH0 GO-DONE ADON
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
REGISTRO ADCON1:
NA NA VCFG0 VCFG0 PCFG3 PCFG2 PCFG1 PCFG0
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
REGISTRO ADCON2:
ADFM NA ACQT2 ACQT1 ACQT0 ADCS2 ADCS2 ADCS0
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
Entonces, para lograr el objetivo es necesario configurar los registros para usar el
canal AN0, activar la tensión de referencia mínima y la tensión de referencia máxima,
configurar el puerto para un canal analógico, justificar a la derecha, seleccionar 16Tad
y un reloj Fosc/2. De acuerdo a estas especificaciones se definen los registros como
ADCON0 = 0b0000001, ADCON1 = 0b00111110 y ADCON2 = 0b10110000. A
continuación se muestra una figura que modela el circuito:
Página 20 de 22
La solución cambia porque la referencia mínima no se fija en cero como en el ejemplo
anterior, por tanto hay que construir una ecuación que modele la relación entre la
temperatura y el resultado del ADC. En este caso para una temperatura de 15ºC el
valor del ADC es 0 y para una temperatura de 80ºC el valor del ADC es 1023; por tanto
la ecuación que relaciona la temperatura con el valor del ADC es:
ADC = 15,73844615(TEMP-15)
Por tanto, sí la temperatura es 40ºC entonces el valor del ADC será 393 y sí la
temperatura es 60ºC entonces el valor del ADC será 708 aproximadamente. Note en el
programa en lenguaje C que el cuerpo principal es similar al ejercicio anterior pero los
valores del ADC cambian por el uso de las dos referencias externas y el cambio de los
valores máximo y mínimo.
Página 21 de 22
#include <xc.h>
#define _XTAL_FREQ 8000000
#pragma config PLLDIV = 1, CPUDIV = OSC1_PLL2, USBDIV = 1
#pragma config FOSC = HS, FCMEN = OFF, IESO = OFF
#pragma config PWRT = OFF, BOR = OFF, BORV = 3, VREGEN = OFF
#pragma config WDT = OFF, WDTPS = 32768
#pragma config CCP2MX = OFF, PBADEN = OFF, LPT1OSC = OFF, MCLRE = OFF
#pragma config STVREN = OFF, LVP = OFF, ICPRT = OFF, XINST = OFF
#pragma config CP0 = OFF, CP1 = OFF, CP2 = OFF, CP3 = OFF
#pragma config CPB = OFF, CPD = OFF
#pragma config WRT0 = OFF, WRT1 = OFF, WRT2 = OFF, WRT3 = OFF
#pragma config WRTC = OFF, WRTB = OFF, WRTD = OFF
#pragma config EBTR0 = OFF, EBTR1 = OFF, EBTR2 = OFF, EBTR3 = OFF
#pragma config EBTRB = OFF
#define RELE PORTCbits.RC0
Página 22 de 22