Conversor Analogico-Digital implementado en el PIC16f877

Un conversor A/D o analógico-digital es un dispositivo capaz de convertir una señal analógica continua (de tensión preferentemente) en una señal discreta con una resolución determinada y una frecuencia de refresco predefinida.


Existen muchos tipos de conversores, pero resulta interesante destacar tres elementos primordiales que pueden ser muy importantes a la hora de definir con cual trabajar:
  • Error o precisión con respecto a un calculo teórico o constante de proporcionalidad.
  • Frecuencia máxima de trabajo y de la señal de entrada (en caso de trabajar con señal no-continua).
  • Resolución (del registro en bits que representa la tensión).
Los microcontroladores son la manera más eficaz de poder implementar distintas aplicaciones respondiendo a nuestras necesidades. Estos dispositivos (que ya presentamos en alguna entrada de este sitio) se pueden programar para efectuar diferentes tareas a través de algún compilador utilizando algún lenguaje de programación base como el ASM, Basic o C por ejemplo.

Introduciendonós al PIC16f877, la idea es tratar de explicar como utilizar el modulo conversor que este contiene.
Este PIC al trabajar con la característica de conversor A/D permite representar un valor de tensión contenido en un rango predefinido, a través de una palabra de 10 bits. Esto brinda una gran resolución lo que permite tener una precisión aceptable. 
Si las tensiones de referencia son Vref+ y Vref-, tensiones continuas situadas en un rango permisible del PIC (ver datasheet) entonces la resolucion es de:


Resolucion = (Vref+ - Vref- )/1024


Suponiendo que ya tienen una idea de cuales son las direcciones de un PIC16f877 y la arquitectura de este microcontrolador, les comento como trabajar sencillamente para configurar el A/D.

¿En que elementos se constituye el módulo de conversión A/D del PIC?
-Un registro de resultado de la conversión que consiste en dos bytes:
                                                                                                      Un byte alto o ADRESH (Bank0 0x1E)
                                                                                                      Un byte bajo o ADRESL (Bank1 0x9E)
-Dos registros de control y configuración del modulo A/D:
                                                                                    Registro ADCON0 (Bank0 0x1F)
                                                                                    Registro ADCON1 (Bank1 0x9F)


-Dos niveles de tensión de referencia que pueden configurarse entre los bits:
                                                                                                                 RA2, RA3
                                                                                                                 RA2, VSS
                                                                                                                 RA3, VSS
                                                                                                                 VDD, VSS

¿Cómo configuro y utilizo el conversor en el PIC?
Necesitamos configurar el puerto que recibirá la llamada tensión de referencia, la velocidad de "lectura de los valores de tensión, las lineas que estarán pudiendo recibir niveles de tensión a leer y otros elementos más.


El registro ADCON0 que se ubica en el primer banco (necesitamos acceder a este banco antes de configurarlo), más precisamente en la dirección 1F está compuesto de los siguientes bits:


b7        b6         b5        b4        b3         b2               b1       b0 
ADCS1  ADCS0   CHS2    CHS1    CHS0    GO/DONE    -----     ADON


El bit menos significativo ADON deberá estar en 1 para activar el modulo.


El bit de control GO/DONE estará en 1 cada vez que el modulador esté trabajando: este bit lo podemos utilizar como flag para encender un led o evitar que se produzca una interrupción durante el proceso.


Como podemos trabajar leyendo niveles de tensión desde cualquiera de los canales del puerto A del PIC entonces los bits CHS2, CHS1 y CHS0 permiten escoger el puerto que el conversor "leerá". Por ej: CH2,CH1,CH0= 101 utiliza el puerto RA5 para leer niveles de tensión.


Por otra parte, el registro ADCON1 situado en el banco 0 más precisamente en la dirección 9F, se encarga más que todo de la configuración de las tensiones de referencia y la velocidad de actualización. Así:








b7        b6         b5        b4       b3          b2          b1          b0 
ADFM   ADCS2   ------     ------    PCFG3    PCFG2    PCFG1   PCFG0

Como los bits del registro del conversor son 10, los 2 bits del byte alto pueden ser justificados a la izquierda o a  la derecha. El hardware completa con 0's los demás 6 bits. El bit ADFM permite la justificación: si es 1 se justifica a la derecha, si es 0 lo hace a la izquierda.

Los bits PCFG3, PCFG2, PCFG1 y PCFG0 permiten configurar las lineas de entrada al conversor y las tensiones de referencia. Las líneas pueden ser analógicas o digitales. Si son analógicas pueden recibir niveles de tensión que estén situados entre los dos valores de referencia. Si son digitales serán puertos comunes del PIC (no participan del módulo A/D).

Existen 16 combinaciones para configurar las lineas,las cuales pueden mostrarse en la siguiente tabla:



Por ej : Si los bits PCFG3, PCFG2, PCFG1 y PCFG0 se configuran como 011x todos los puertos son digitales, pero si se configuran como 1110, el bit RA0 será la linea de entrada al conversor y las lineas de referencia (Vref+ y Vref-) serán respectivamente las tensiones VDD y VSS.

Los bits ADCS2, ADCS1 y ADCS0 (repartidos entre los dos registros) permiten definir la frecuencia con la que el modulo trabajará. La tabla muestra algunas de las posibilidades:

ADCS2  ADCS1   ADCS0     Frecuencia
   0          0           0             Fosc/2
   0          0           1             Fosc/8
   0          1           0             Fosc/32
   1          0           1             Fosc/16
   1          1           0             Fosc/64

donde Fosc es la frecuencia del oscilador externo con el que está trabajando el microcontrolador.



De esta manera tenemos las primeras herramientas para usar un poderoso modulo que contiene nuestro micro. Trabajaremos con un conversor r2r implementado en base a este concepto próximamente.