Está en la página 1de 22

UNIDAD CURRICULAR: SISTEMAS DE CÓMPUTO

RECOPILACIÓN DE MATERIAL DIDACTICO PARA LA ENSEÑANZA DE:

CONVERTIDOR
ANALÓGICO-DIGITAL

La conversión analógica digital consiste en emplear ciertos dispositivos para precisar


el equivalente en el sistema digital de una señal analógica. Existen varios métodos que
incluyen ADC de salida de datos en paralelo o serial, además de los ADC internos a los
µC. En este sentido, se disponen inicialmente de ciertas señales de naturaleza
analógica (son continuas en el tiempo) que pueden interactuar con otras señales no
deseadas. Por esto, a continuación se describe un mecanismo para tratar la señal y
poder calcular su equivalente digital con precisión.

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.

PROCESO DE MUESTREO O SAMPLING

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.

PROCESO DE RETENCIÓN O HOLD

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.

EL PROCESO DE CONVERSIÓN DE SEÑALES ANALÓGICAS A DIGITALES

La conversión analógico-digital es el proceso de calcular el valor digital o equivalente


binario que representa la amplitud de onda de la señal analógica de entrada. El
proceso de muestreo y retención hace que se mantenga constante la amplitud de la
señal analógica de entrada entre sucesivos impulsos de muestreo; así, la conversión
analógico-digital puede realizarse utilizando un valor constante, en lugar de permitir
que la señal analógica varíe durante el intervalo de conversión, que es el intervalo
comprendido entre los impulsos de muestreo; o sea, se alternan los momentos de
muestreo y conversión (en el proceso de conversión, la señal debe permanecer lo
suficientemente estable para calcular su equivalente binario).
El proceso de convertir un valor analógico en un determinado código se denomina
cuantificación. Durante el proceso de cuantificación, el ADC convierte cada valor
muestreado de la señal analógica en un código binario. Cuantos más bits se empleen
para representar un valor muestreado, más precisa será la representación.

Página 2 de 22
CONVERTIDOR ANALOGICO – DIGITAL

Dispositivo capaz de transformar una señal de entrada Analógica (Vin continua en el


tiempo) en su equivalente Digital (palabra de base binaria) según una tensión de
referencia. Sin embargo, en ocasiones hay que considerar implementar un circuito que
permita hacer la equivalencia entre la señal de entrada y una tensión de referencia
Vref+. Este circuito se materializa regularmente como un divisor de tensión (en caso
que Vin sea mayor a Vref+) o un amplificador (en caso que Vin sea menor a Vref+).
En el mercado existen una gran variedad de convertidores, los cuales se diferencian
según 5 parámetros fundamentales:

1. Tiempo de Conversión o tc: Es el tiempo que amerita el dispositivo para


calcular el valor digital equivalente a la señal de entrada Vin. Comienza al
terminar el proceso de retención y finaliza con una señal que indica el fin de la
conversión.

2. Presentación: Se refiere a la cantidad de pines que presenta el dispositivo y el


tipo de encapsulado (DIP (Dual in-line packages), SMD/SMT (Encapsulados de
Montaje en Superficie), SOP(contorno pequeño), QFP (Quad Flat Packages),
entre otros).

3. Canales de Entrada: Es la cantidad de líneas de entrada directa que dispone el


dispositivo para introducir las señales a medir. Este parámetro se controla
comúnmente con mecanismos de Multiplexión o selección de canal.

4. Tipo de Salida: Forma que presenta el dispositivo la palabra binaria


equivalente a la conversión del valor análogo. Puede presentarse como salida
de tipo Serial (bit a bit, mediante un reloj de entrada) o tipo Paralelo (presenta
toda la palabra en sus pines al final de la conversión).

5. Resolución: Equivale al cociente entre el rango de operación y dos (2) elevado


a la cantidad de bits menos 1 o sea:

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 AO es un amplificador lineal de dos entradas de señal (V- y V+), dos entradas de


alimentación (Vdd y Vss), dos entradas de ajuste o compensación y una salida (Vo).
Posee una alta impedancia en los pines de entrada de señal, que junto a su estructura
interna sustenta los principios de análisis: a) La diferencia de potencial entre las
entradas de señal es muy pequeña, al punto de asumirla como 0V, y b) La corriente
que entra por las entradas de señal es muy pequeña, al punto de asumirla como 0A.
Las configuraciones básicas de un AO son: como comparador, como amplificador
inversor de ganancia R f/Ri, como amplificador no inversor de ganancia 1+R 2/R1, como
sumador, como integrador o derivador.

CONVERTIDOR ANALÓGICO-DIGITAL FLASH (PARALELO)

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.

CONVERTIDOR ANALÓGICO-DIGITAL DE PENDIENTE DOBLE

El ADC de pendiente doble se utiliza comúnmente en voltímetros digitales y otros


tipos de instrumentos de medida. Utilizan un generador de rampa (integrador) para
generar la característica de pendiente doble.
Comencemos suponiendo que el contador está en estado RESET y la salida del
integrador es cero. Ahora supongamos que se aplica a la entrada una tensión de
entrada positiva por medio del interruptor
(SW), comandado por la lógica de control.
Puesto que la entrada inversora de A1 está a
tierra virtual y suponiendo que Vin es
constante durante un período de tiempo,
circulará una corriente constante a través de
la resistencia de entrada R y, por tanto, a
través del condensador C, el cual se cargará
linealmente ya que la corriente es constante

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.

CONVERTIDOR ANALÓGICO-DIGITAL POR APROXIMACIONES SUCESIVAS

Quizás el método de conversión A/D más utilizado es el de las aproximaciones


sucesivas. Tiene un tiempo de conversión mucho menor que la conversión de
pendiente doble, aunque es más lento que el método flash. Asimismo, el tiempo de
conversión es fijo para cualquier valor de la entrada analógica. La figura muestra un
diagrama de bloques básico de un ADC por aproximaciones sucesivas de 4 bits. Está
formado por un DAC, un registro de aproximaciones sucesivas (SAR, Successive-
Approximation Register) y un comparador. Su funcionamiento básico es el siguiente:
los bits de entrada al DAC se habilitan (se ponen a 1) de uno en uno sucesivamente,
comenzando por el bit más significativo (MSB). Cada vez que se habilita un bit, el
comparador produce una salida que indica si la tensión analógica de entrada es mayor

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.

ERRORES EN LA CONVERSIÓN ANALÓGICO-DIGITAL

De nuevo utilizamos una conversión de


4 bits para ilustrar los principios.
Supongamos que la entrada de prueba
es una rampa lineal ideal.
Código Ausente(a): La salida en
escalera indica que el código binario
1001 no aparece en la salida del ADC.
Observe que el valor 1000 permanece
durante dos intervalos y que la salida
salta al valor 1010. En el convertidor
ADC flash, por ejemplo, un fallo en un
comparador puede ser la causa del
error de omisión de código.
Códigos Incorrectos(b): La salida en
escalera indica que varias de las
palabras del código binario que salen
del ADC son incorrectas. Un análisis
indica que, en este caso concreto, la
línea del bit 21 permanece en estado
BAJO (0).
Offset(c): Se presenta la condición de
offset cuando el ADC interpreta que la
tensión analógica de entrada es mayor
que su valor real.

Página 8 de 22
El ADC0803-0804

El ADC0803-0804 es un ejemplo de ADC por aproximaciones sucesivas con salida de


datos digitales en paralelo. Su alimentación típica es de 0V a 5V. Posee un generador
de reloj interno y tiene una resolución de ocho bits, con un tiempo de conversión total
de 100 µs. Las salidas de datos triestado sirven para realizar la interfaz con el sistema
de buses de un microprocesador. La descripción de los pines es la siguiente:

 /CS: Habilita la conversión. Se activa en bajo.


 /WR: Inicia la conversión. Resetea el SAR y el Registro de Corrimiento.
 /RD: Habilita la lectura de la salida digital.
 /INTR: Avisa fin de la conversión.

El funcionamiento básico del dispositivo es el siguiente: el ADC0804 contiene el


equivalente a una red DAC de 256 resistencias. La lógica de aproximaciones sucesivas
secuencia la red para adaptar la tensión analógica de entrada diferencial (Vin+ - Vin-)
a una salida de la red resistiva.

En primer lugar, se comprueba el MSB como todo proceso de aproximaciones


sucesivas. Después de realizar ocho comparaciones (sesenta y cuatro períodos de
reloj), un código binario de 8 bits se transfiere a los latches de salida y la salida de
interrupción (/INTR) pasa a nivel BAJO (se activa para avisar el fin de la conversión).
El dispositivo puede funcionar en modo de conversión libre (free-running),
conectando la salida /INTR a la entrada de escritura (/WR) y manteniendo la entrada
de inicio de conversión (/CS) a nivel BAJO. Para garantizar una adecuada inicialización
bajo todas las posibles condiciones, se requiere un nivel BAJO en la entrada /WR
durante el ciclo de conexión de la alimentación. A partir de ahí, si se pone /CS a nivel
BAJO en cualquier instante, se interrumpirá el proceso de conversión.

Cuando la entrada /WR pasa a nivel BAJO, el registro de aproximaciones sucesivas


(SAR) interno y el registro de corrimiento de 8 bits se ponen a cero. Mientras /CS y
/WR permanezcan a nivel BAJO, el ADC permanecerá en estado de RESET. El período
de conversión se inicia de uno a ocho períodos de reloj después de que /CS o /WR
hagan una transición de nivel BAJO a nivel ALTO.
Cuando ambas entradas /CS y /RD están a nivel BAJO, el latch de salida triestado se
habilita y el código de salida se aplica a las líneas D0 a D7. Cuando la entrada /CS o la
entrada /RD pasan a nivel ALTO, las salidas D0 a D7 se desactivan. A continuación se
muestran dos formas de funcionamiento de un ADC0804:

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.

En la figura siguiente se muestra una conexión de microcontrolador sin ADC


(PIC16F84A), un ADC0804 y un registro de corrimiento paralelo-serial 74HC165
(cuyo funcionamiento es análogo al 74HC164 pero serial-paralelo). La programación
del microcontrolador según esta topología funciona con la siguiente lógica:

1. El microcontrolador envía un pulso (bajo) a través de RA0 (conectado a /WR


del ADC) para comenzar el proceso y espera 150µs para esperar que termine la
conversión.
2. El microcontrolador envía un pulso (alto) a través de RA2 (conectado a SH/LD
del 74HC165) para efectuar la carga del resultado de la conversión en el
registro de corrimiento.
3. El resultado está disponible en el pin SO del registro de corrimiento (conectado
al RA3 del microcontrolador) y por tanto hay que extraerlo a través de RA3 y
sincronizadamente efectuar un pulso al CLK del registro para colocar el
próximo bit en el pin SO. Este proceso se efectúa 8 veces para ingresar al
microcontrolador los 8 bits equivalentes a la conversión.

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.

El registro de corrimiento 74XX165 paralelo-serial ayuda a aprovechar la cantidad de


pines del microcontrolador usando sólo 3. De no incorporar este CI en el diseño
debería usarse 8 pines del µC para ingresar los datos directamente desde el ADC.

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:

 IN0-IN7: 8 entradas analógicas multiplexadas.


 ADD X: Selector de entrada de 3 bits.
 ALE: Habilitación del dispositivo.
 VREF: Permite fijar el rango de referencia de la señal de entrada.
 EOC: Indica fin de la conversión.
 OE: Habilita la salida.

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).

La lógica de trabajo del ADC0808 (o ADC0809) es la siguiente:


1. Habilitar el dispositivo (ALE=Vcc).
2. Suministrar un tren de pulsos (red RC, LM555 o PWM) en CLOCK para fijar la
velocidad de trabajo del ADC.
3. Fijar las tensiones de referencia Vref+ y Vref-.
4. Indicar el valor del canal de entrada (entre 0 y 7).
5. Emitir un pulso a la entrada del ADC denominada START, en cual activa la
conversión en el flanco de bajada del pulso.
6. Al finalizar la conversión (EOC=1) la salida debe ser habilitada (OE=1) para
leer el resultado. Sí EO=0, entonces las salidas permanecen en alta impedancia.

En la siguiente figura se observa una forma básica de funcionamiento del ADC0808. El


555 está ocilando aproximadamente a 7.2KHz y su salida se conecta a la entradad del
reloj del ADC. Se conecta un pulsador al START para iniciar la conversión. Si la
frecuencia del oscilador disminuye por debajo de lo normal, el pulso de START debe
durar en alto el tiempo necesario para que el convertidor lo note.

Es posible implementar dispositivos inteligentes como µC y circuitos digitales para


optimizar el funcionamiento del convertidor. En la siguiente figura se usa un 74XX165
y un 74XX164 para ejemplificar el comentario anterior. Note que la fimalidad de
implementar estos CI es optimizar el uso de los pines del µC. entonces, con sólo 6 o 7
pines y registros de corrimiento es posible adquirir “n” bits de datos y enviar “n” bits
de datos.

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.

En la siguiente figura se ilustra la forma de conexión de un ADC0832 (2 canales de


entrada), donde el µC a través de DI debe enviar al ADC0832 un pulso de arranque,
seguido de un código para seleccionar el modo de conversión (simple o diferencia) y
el canal de entrada. Por ejemplo, para seleccionar el canal 0 del ADC en modo simple
(izquierda) se debe enviar un “1” (arranque) y según la tabla dispuesta en los
datasheets se debe enviar “1” y “0” (cada uno con su respectivo pulso en CLK). Cuando
el ADC recibe la secuencia 101, automaticamente inicia la conversión con las
especificaciones que se establecieron. Una vez terminada la conversión, en el pin DO
estarán disponibles los bits que conforman la palabra digital equivalente a la señal de
entrada. En este modelo tambien es conveniente colocar una señal en alto en el pin
/CS para habilitar el dispositivo.

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).

Es posible que el microcontrolador incluya un convertidor analógico-digital en su


arquitectura (se especifica en las características del datasheets). Para activarlo es
importante configurar algunos registros como ADRESH, ADRESL, ADCON0 y ADCON1
entre otros (todo depende de la aplicación y del µC). la explicación se realizará usando
el ADC del PIC16F877A.

El funcionamiento y configuración del ADC de este µC se puede visualizar en la sección


11 del datasheets. El ADCON0 controla la operación del módulo ADC y ADCON1
configura las funciones de los pines del puerto (Puerto A). los registros ADRESH y
ADRESL son registros de 8 bits donde se almacena la palabra equivalente a la señal
digital en un formato de 10 bits. Antes de comenzar la programación se debe
comprender la función de cada bit de los registros.

Registro ADCON0:
ADCS1 ADCS0 CH2 CH1 CH0 GO-DONE NA ADON
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0

 ADCS2-ADCS0: Seleccionan el reloj de conversión.


 CH2-CH0: Seleccionan el canal de entrada.
 GO-DONE: Inicia la conversión colocando el bit a 1 (go). Al finalizar la
conversión se coloca automaticamente a cero (done).
 ADON: Habilita el ADC.

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.

El procedimiento lógico para usar el ADC de el µC es:


 Configurar el ADCON0 y ADCON1 según la aplicación.
 Configurar los bits del puerto A como entradas en caso de usarlos como
entradas analógicas.
 En el ciclo infinito se inicia la conversión (asegurese que la señal de entrada
tenga estabilidad) colocando la instrucción ADCONbits.GO_nDONE=1 y
esperando que vuelva a cero. Luego se usa una variable tipo INT (ya que el
resultado de la conversión está en formato de 10 bits) que en el ejemplo se
llamó ADC, la cual contendrá el resultado de la conversión. De este paso en
adelante, el programador usará el resultado según sus necesidades.

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

LCD(0x85,0); // Escribe en la columna 5 de la primero línea


DIG = AUX/1000; AUX = AUX - DIG * 1000; LCD(DIG+48,1);
DIG = AUX/100; AUX = AUX - DIG * 100; LCD(DIG+48,1);
DIG = AUX/10; AUX = AUX - DIG * 10; LCD(DIG+48,1); LCD(AUX+48,1);

CALCULO = 5*ADC/10.23; // Equivalente en tensión. Regla de 3


/*** debe utilizar por lo menos un decimal en un cálculo de float ****/
AUX = CALCULO; // 0 < AUX < 500 // se transforma el decimal a entero

LCD(0xC9,0); // Escribe en la columna 9 de la segunda línea


DIG = AUX/100; AUX = AUX - DIG * 100; LCD(DIG+48,1);
LCD(',',1); // Muestra una coma falsa para simbolizar el valor entre 0 y 5V
DIG = AUX/10; AUX = AUX - DIG * 10; LCD(DIG+48,1); LCD(AUX+48,1);
__delay_ms(100); // espera para hacer otra conversión
}
}

void LCD(unsigned char DIGITO, unsigned char TIPO)


{
RS = TIPO;
PORTD = DIGITO;
EN = 1; __delay_ms(2); EN = 0; __delay_ms(2);
}

void LCD_CADENA(const char *CAD, unsigned char Posi)


{
unsigned char Caracter;
LCD(Posi,0);
while(*CAD!=0x00)
{Caracter=*CAD; LCD(Caracter,1); CAD=CAD+1;}
}

Página 17 de 22
EJEMPLO:

Se desea conectar un LM35 a la entrada analógica de un PIC12F675 y si la


temperatura es menor a 40º active un relé y cuando la temperatura sensada sea
mayor a 60ºC desarctive el relé. El diseño se presenta en la siguiente figura. Una de las
condiciones de diseño es que la temperatura no excederá de 100ºC, por tanto el
máximo valor de tensión que recibirá la entrada analógica será 1V, o sea que la
referencia se debe fijar a este valor. Para lograr este objetivo, se implementan las
resistencias R3, R4 y R5 para hacer un divisor de tensión. La resistencia R1 protege el
LM35 y R2 funge como la resistencia de base del transistor para activar el relé. Según
el apartado 7 del datasheets del dispositivo, para usar el ADC interno se deben
configurar los registros TRISIO, GPIO, ADRESH, ADRESL, ADCON0 y ANSEL.

REGISTRO ADCON0:
ADFM VCFG NA NA CH1 CH0 GO-DONE ADON
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0

 ADFM: Justifica el resultado. 1: derecha, 0: izquierda.


 VCFG: 1 Activa la referencia externa. 0 conecta la referencia a Vdd
internamente.
 CH1-CH0: Selecciona el canal de entrada.
 GO-DONE: Inicia la conversión colocando el bit a 1 (go). Al finalizar la
conversión se coloca automaticamente a cero (done).
 ADON: Habilita el ADC.

Página 18 de 22
REGISTRO ANSEL:
NA ADCS2 ADCS1 ADCS0 ANS3 ANS2 ANS1 ANS0
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0

 ADCS2-ADCS0: Bits de selección de la velocidad del reloj de conversión.


 ANS3-ANS0: Bit de asignación individual del tipo del pin. 1: analógico, 0:digital.

En este ejemplo se usará la justificación a la derecha, activación del pin de referencia


externa, una velocidad de reloj de Fosc/64 y se usará solo el canal AN0 como entrada
analógica, por tanto ADCON0 = 0b11000001 y ANSEL = 0b01100001. Según las
especificaciones del cliente se debe buscar el valor del convertidor equivalente a 40ºC
y 60ºC con reglas de 3 (sí 100ºC-1023, entonces 40ºC-409 y 60ºC-613). Luego el
programa del µC sería:

#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
}
}

Con esta programación se aprovecha la resolución del convertidor, ya que si no se


usara la referencia externa el valor de la entrada del sensor sería hasta 1V y el µC está
esperando valores hasta de 5V, entonces ¿Qué pasa con los valores del ADC mayores a
1V o un ADC>204 sí la señal de entrada llegara sólo hasta este valor?. Para aprovechar
al máximo el ADC hay 2 posibles soluciones: 1) Usar la referencia externa o 2) ajustar
(con circuitería externa) la señal de entrada para que su amplitud oscile entre 0V y 5V.
El diseñador seleccionará su método.

Página 19 de 22
EJEMPLO:

Se desea resolver el enunciado anterior pero usando un PIC18F4550 y activando las 2


referencias externas, sabiendo que la temperatura no decenderá bajo 15ºC ni
excederá 80ºC.

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

 CH3-CH0: Bits de selección del canal de entrada analógico a usar.


 GO-DONE: Inicia la conversión colocando el bit a 1 (go). Al finalizar la
conversión se coloca automaticamente a cero (done).
 ADON: Habilita el ADC.

REGISTRO ADCON1:
NA NA VCFG0 VCFG0 PCFG3 PCFG2 PCFG1 PCFG0
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0

 VCFG0(bit5): Activa la tensión de referencia mínima. 1: Vref-, 0:Vss.


 VCFG0(bit4): Activa la tensión de referencia máxima. 1: Vref+, 0:Vdd.
 PCFG3-PCFG0: Bits de configuración del puerto analógico (ver tabla del
datasheets).

REGISTRO ADCON2:
ADFM NA ACQT2 ACQT1 ACQT0 ADCS2 ADCS2 ADCS0
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0

 ADFM: Justificación del resultado. 1:derecha, 0:izquierda.


 ACQT2- ACQT0: Bit de selección del tiempo de adquisición (ver tabla del
datasheets).
 ADCS2- ADCS0: Bit de selección de reloj de conversión (ver tabla del
datasheets).

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

unsigned int ADC;


void main(void)
{
TRISA = 0b00001101; PORTA = 0;
TRISB = 0; PORTB = 0;
TRISC = 0; PORTC = 0;
TRISD = 0; PORTD = 0;
TRISE = 0; PORTE = 0;
ADCON0 = 0b0000001;
ADCON1 = 0b00111110;
ADCON2 = 0b10110000;
while(1)
{
ADCON0bits.GO_nDONE = 1; //Comienza la conversión
while(ADCON0bits.GO_nDONE==1) // Espera hasta que termine
{}
ADC = ADRESH*256+ADRESL;
if(ADC<393)
RELE = 1;
if(ADC>708)
RELE = 0;
__delay_ms(500); //Espera antes de comenzar una nueva conversión
}
}

Página 22 de 22

También podría gustarte