5 El Convertidor Analógico - PIC

Embed Size (px)

DESCRIPTION

El Convertidor Analógico - PIC

Citation preview

  • 1

    El Convertidor Analgico Digital (A/D)

  • 2

    5. Introduccin

    El microcontrolador PIC16F877 de Microchip puede desempear muchas funciones pero en la que se va a centrar aqu es la de su conversor analgico-digital. Antes de entrar de pleno en su funcionamiento se va a comentar los conceptos bsicos de una conversin de una seal analgica a digital.

    5.1. Conversin de una seal analgica a digital

    Tanto la voz como muchas de las seales que se envan a travs de un medio guiado como un cable, o no guiado como es el aire; son de tipo continuo, y pueden tomar infinitos valores a lo largo del tiempo. Por ejemplo, se puede decir que la seal elctrica que se transmite de la tarjeta de sonido al altavoz es continua y puede tomar cualquier tensin entre los dos hilos.

    En la siguiente figura se muestra una seal analgica:

    El inters en digitalizar una seal puede surgir por varios motivos: el hecho de querer almacenarla en un soporte digital, transmitirla digitalmente para poder reconstruirla, o poder tratar los valores analgicos que d un sensor en programas computacionales, etc.

    Delimitando (acotando) la seal analgica en un intervalo de tiempo y con unos valores mnimos y mximos de tensin, se tiene que tener en cuenta dos factores fundamentales a la hora de almacenar digitalmente (con ceros y unos) dicha seal en un formato adecuado, que son: se tiene que muestrear y cuantificar.

    El muestreo implica que se t i ene que coger una muestra de la seal cada T segundos, ya que no hay memoria suficiente capaz de almacenar los infinitos puntos de una seal en un intervalo cualquiera de tiempo. En el ejemplo de la figura anterior se ha acotado un segundo de tiempo y 5 V de tensin de entrada analgica del PIC, obtenindose la siguiente figura, que se han tomado 24 muestras en un segundo, esto es, la frecuencia de muestreo:

  • 3

    La cuantificacin surge por el mismo motivo que el muestreo pero para el eje de ordenadas: una vez que se tiene una muestra su amplitud puede tomar infinitos valores, los cuales se debe redondear entre unos valores fijos a lo largo de ese eje. Estos valores van a depender del nmero de bits que se vayan a almacenar para cada muestra, por ejemplo, en la imagen se cogen 4 bits y con ellos se pueden formar 16 combinaciones y por lo tanto 16 distintos niveles en los que se puede dividir el eje. En el PIC se cuantifica con 10 bits lo que se obtiene 1023 niveles.

    Tanto en un proceso como en otro, se va a provocar una prdida de la forma de la seal original, y eso implica que se va a cometer un error de aproximacin cuya magnitud se puede calcular, la que se va a comentar con ms detalle en el siguiente apartado.

    5.2. Error de cuantificacin

    1. Muestreo

    El parmetro fundamental del muestreo digital es el intervalo de muestreoseg, o su equivalente frecuencia de muestreo 1/ Hz. Lgicamente, cuanto menor sea , mayor nmero de valores se obtienen de la seal, y viceversa. El resultado de dicho muestreo es la obtencin de una serie discreta ordenada: {xr} = {x0, x1, x3,..., xr,...}, en la que el ndice r indica la posicin de orden temporal del valor xr. As, el valor de la seal original, en el tiempo t = r, x (t), se representa por xr.

    Si aumentamos el nmero de muestras por unidad de tiempo, la seal muestreada se parecer ms a la seal continua. Respecto a esto, el criterio de Nyquist asegura que para que la seal muestreada contenga la misma informacin que la continua, la separacin mnima

  • 4

    entre dos instantes de muestreo debe ser 1/(2 W), siendo W el ancho de banda de la seal. Dicho de otra forma, que la frecuencia de muestreo debe ser mayor o igual que 2W.

    2. Cuantificacin

    Se conoce como error de cuantificacin (o ruido), a la diferencia entre la seal de entrada (sin cuantificar) y la seal de salida (ya cuantificada), interesa que el ruido sea lo ms bajo posible.

    Ejemplo. Si tenemos una seal cualquiera, y la queremos guardar en un archivo de 4 bits, tendremos 24 niveles para cuantificarla, (8 para valores positivos, y 8 ms para los negativos).

    = (1/2N-1)= Intervalo de cuantificacin = 1/23 = 0.125

    Error: -/2 < error >/2

    Ejemplo. A partir de la potencia de una seal, podemos saber que error estamos cometiendo.

    Potencia: < error2 >= 2/12

    Si tenemos una tarjeta de sonido, y trabaja a 16 bits por muestra: Cometer un error de: (1/215)2/12 = 1/(230 * 12)

    3. Tcnicas de cuantificacin

    Como informacin complementaria, decir que existen diferentes tipos de cuantificacin, cada uno de los cuales se amoldara a los datos que se est enviando.

    - Cuantificacin uniforme: la distancia entre los niveles de reconstruccin es siempre la misma. No hacen ninguna suposicin acerca de la naturaleza de la seal a cuantificar, de ah que no proporcionan los mejores resultados. Sin embargo, tienen como ventaja que son los ms fciles y menos costosos de implementar.

    - Cuantificacin logartmica: incrementa la distancia entre los niveles de reconstruccin conforme aumenta la amplitud de la seal. Muy usada en seales de voz.

    - Cuantificacin no uniforme: si se conoce la funcin de la distribucin de probabilidad, se puede ajustar los niveles de reconstruccin a la distribucin de forma que se minimice el error cuadrtico medio. Esto significa que la mayora de los niveles de reconstruccin se den en la vecindad de las entradas ms frecuentes y, consecuentemente, se minimice el error (ruido).

    - Cuantificacin vectorial: se basa en cuantificar segn las muestras vecinas, resulta ms eficiente cuantificar los datos en bloques de N muestras.

    - Cuantificadores de Vecino Ms Cercano (Voronoi): el proceso de codificacin no necesita almacenar una descripcin geomtrica de las celdas, la codificacin es mediante una comparacin de distancias.

  • 5

    5.3. Descripcin General del Mdulo Conversin Analgico Digital (ADC)

    Los PIC16F87X poseen un mdulo ADC interno que les permite manejar 5 entradas analgicas para los dispositivos de 28 pines y 8 para los otros dispositivos. En la siguiente figura se muestra un diagrama de bloques del mdulo ADC.

    A travs de la entrada analgica se aplica la seal analgica a un condensador de captura y retencin (sample and hold) que despus se introduce en el convertidor. El convertidor de aproximaciones sucesiva da como resultado una palabra de 10 bits.

    El multiplexor. El ADC es un convertidor de aproximaciones sucesivas de 10 bits, el cual puede realizar la conversin de una de las 8 entradas (o canales) analgicas AN0,...,AN7 multiplexadas por la lgica interna que utiliza como lneas de seleccin del canal los bits CHS2:CHS0, en donde se coloca el nmero en binario del canal a convertir.

    Voltajes de Referencia. Todo convertidor ADC requiere voltajes de referencia que determinan el valor de mnima escala (VREF-) y el de plena escala (VREF+), de manera que la conversin de un valor de voltaje analgico Vin en el rango de VREF- a VREF+ producir un valor equivalente binario D en el rango de 0 a 2n, Donde n es la resolucin del convertidor (n = 10).

    Es decir, el convertidor A/D puede seleccionar como tensin de referencia la interna VDD y masa o bien una externa que se introduzca entre RA3/AN3/VREF+ y RA3/AN3/VREF. Cuando se

  • 6

    selecciona la tensin de referencia externa, hay que tener en cuenta que existen algunas limitaciones; el mximo voltaje aplicado a la patilla VREF+ (RA3/AN3) ser VDD+0,3V y el mnimo VDD-2,5V. En cuanto a la tensin VREF- (RA2/AN2) la mnima tensin ser VSS-0,3V y la mxima VREF+ - 2V, as por ejemplo, si la tensin de alimentacin es de 5V, la tensin en RA3/AN3 no podr exceder de 5V. Por lo que el mximo voltaje en VREF- ser de 3V. Siempre se ha de cumplir que .

    El convertidor A/D tiene como caracterstica especial el ser capaz de seguir trabajando mientras el dispositivo est en el modo SLEEP. Para ello el oscilador interno RC debe conectarse al conversar.

    El mdulo de A/D tiene cuatro registros. Estos registros son:

    ADRESH : Parte alta del resultado de la conversin ADRESL : Parte baja del resultado de la conversin ADCON0: Registro de Control 0 ADCON1, Registro de Control 1

    Los registros ADCON0 de control del funcionamiento del conversar se muestran seguidamente al igual que el registro ADCON1 de configuracin de los pines del puerto. Los pines del PORTA pueden configurarse como entradas analgicas (RA, tambin puede ser entrada de tensin de referencia) o como E/S digital.

    Como la relacin entre escalas es lineal, una regla de tres nos da la relacin entre el voltaje analgico de entrada (Vin) y el valor digital (D) obtenido por el ADC

    Con la eleccin ms comn: VREF+ = VDD = 5v, VREF- = VSS= 0v, y como n=10, obtenemos:

    De donde se ve que cuando Vin vara en todo su rango, desde 0 hasta 5v, el valor obtenido D vara tambin en todo su rango, de 0 a 1023.

    Si a la inversa, obtenemos un valor D y deseamos saber que voltaje representa, basta con despejar:

    Observacin: Como puede verse, la conversin del dato D al voltaje correspondiente requiere una multiplicacin por un nmero fraccionario, para lo cual el PIC no posee instrucciones, si deseamos realizar esta multiplicacin en el PIC debemos hacer un programa que multiplique nmeros de punto fijo o de punto flotante.

  • 7

    5.4. El proceso de Conversin Analgico/Digital.

    En el siguiente diagrama de tiempo se muestran los eventos que tienen lugar durante el proceso de una conversin analgico / digital.

    De acuerdo a la figura, para echar a andar el convertidor se debern seguir los siguientes pasos:

    1. Configurar el mdulo A/D: a. Configurar los pines analgicos y los Voltajes de referencia VREF- y VREF+,

    mediante el registro ADCON1 (9Fh) (y los correspondientes bits TRIS como entradas)

    b. Seleccionar el canal de entrada a convertir mediante los bits CHS2:CHS0 del registro ADCON0 (1Fh)

    c. Seleccionar el reloj de conversin mediante los bits ADCS1:ADCS0 (ADCON0)

    d. Habilitar (energizar)el convertidor mediante el bit ADON (ADCON0)

    2. Configurar interrupciones para el convertidor A/D (si se desea), para ello: limpiar a. ADIF y poner ADIE, PEIE y GIE.

    3. Esperar mientras transcurre el tiempo de adquisicin (unos 20 seg). 4. Iniciar la conversin poniendo el bit GO/#DONE (ADCON0). 5. Esperar a que termine la conversin:

    a. Por poleo (Polling): Consultando continuamente el bit GO/#DONE (el cual es limpiado por el convertidor cuando la conversin est completa).

    b. Por interrupciones: Cuando la conversin termina, la bandera ADIF se activa y esto genera una solicitud de interrupcin, la cual deber ser atendida por una rutina de atencin a la interrupcin diseada para ello.

    6. Leer el dato convertido D de los registros (ADRESH:ADRESL) 7. Para la siguiente conversin, esperar al menos 2TAD (Donde TAD es el tiempo de

    conversin por bit).

  • 8

    El diagrama de flujo que deber seguir el programa para realizar una conversin A/D puede ser la que se muestra en la siguiente figura:

    5.5. Los Registros de Control

    A continuacin se presenta un resumen de los registros relacionados con la operacin del convertidor:

    1. Registro ADCON0 (direccin lFh)

    R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 U-0 R/W-0 ADCS1 ADCS0 CHS2 CHS1 CHS0 G0/#DONE --- ADON Bit 7 Bit 0 bit 7-6: ADCS1:ADCS0: bit de seleccin de reloj para el Convertidor A/D

    00 Fosc/2 01 Fosc /8 10 Fosc/32 11 FRC (Procede del oscilador RC interno)

    * El oscilador RC interno del convertidor tiene un TAD tpico de 4 seg, sin embargo, puede variar entre 2 y 6 seg.. Este reloj es recomendable para operacin en modo SLEEP, ya que este modo desconecta la frecuencia del

  • 9

    reloj externo. * Precaucin: El convertidor A/D no trabajar correctamente con un TAD menor que TAD(mnimo) = 1.6seg. El usuario deber cuidar la eleccin del reloj adecuado para no violar esta limitante.

    bit 5-3: CH2:CH0: bit de seleccin del canal analgico (Los canales analgicos a usar debern tener sus bits TRIS correspondientes seleccionados como entradas). 000 = Canal 0, (RA0/AN0) 001 = Canal 1, (RA1/AN1) 010 = Canal 2, (RA2/AN2) 011 = Canal 3, (RA3/AN3) 100 = Canal 4, (RA4/AN4) 101 = Canal 5, (RA5/AN5); los PIC16F87X de 28 pines no tienen este canal 110 = Canal 6, (RA6/AN6); los PIC16F87X de 28 pines no tienen este canal 111 = Canal 7, (RA7/AN7),, los PIC 1 6F87X de 28 pines no tienen este canal

    bit 2: GO/#DONE. bit de estado de la conversin A/D. Con el convertidor encendido, poniendo este bit en 1 se inicia la conversin del canal seleccionado. Este bit permanece en 1 durante la conversin y es limpiado automticamente por el convertidor al terminar la conversin. 1= La conversin A/D est en marcha (mientras est a 1 se est realizando la

    conversin) 0 = La conversin ha finalizado. (el bit se pone a cero automticamente por

    hardware cuando la conversin A/D finaliza) el resultado de la conversin aparece en ADRDES:ADRESL

    bit 1: No implementado: Se lee como 0

    bit 0: ADON: bit de puesta en marcha 1 = El convertidor A/D est operativo 0 = El convertidor A/D est apagado y no consume corriente.

    2. Registro ADCON1 (direccin 9Fh)

    U-0 U-0 R/W-0 U-0 R/W-0 R/W-0 R/W-0 R/W-0

    ADFM --- --- --- PCFG3 PCFG2 PCFG1 PCFG0

    Bit 7 Bit 0

    bit 7: ADFM: Selecciona el formato del resultado de la conversin A/D 1 = Pone en el registro ARDESH los seis bit de mayor peso a 0 (alineacin a la derecha). 0 = pone los 6 bit de menor peso del registro ADRESL a 0 (alineacin a la izquierda).

    Por lo tanto los 16 bits que forman el registro ARDESH-ARDESL con ADFM=1 tiene los 6 bit de mayor peso a cero y con ADFM=0 los 6 bit de menor peso estn a cero

    bit 6-4: No implementados: Se leen como cero

    bit 3-0: PCFG3:PCFG0: bits de configuracin de los canales de entrada del convertidor A/D.

    Se utilizan para configurar las patillas como E/S digital o como entrada analgica de acuerdo con la siguiente tabla:

  • 10

    PCFG3:

    PCFG0

    AN7(1)

    /RE2

    AN6(1)

    /RE1

    AN5(1)

    /RE0

    AN4

    /RA5

    AN3

    /RA3

    AN2

    /RA2

    AN1

    /RA1

    AN0

    /RA0V VREF+ VREF-

    CAN/(2)

    REFS

    0000 A A A A A A A A VDD VSS 8/0

    0001 A A A A VREF+ A A A RA3 VSS 7/1

    0010 D D D A A A A A VDD VSS 5/0

    0011 D D D A VREF+ A A A RA3 VSS 4/1

    0100 D D D D A D A A VDD VSS 3/0

    0101 D D D D VREF+ D A A RA3 VSS 2/1

    011X D D D D D D D D VDD VSS 0/0

    1000 A A A A VREF+ VREF- A A RA3 RA2 6/2

    1001 D D A A A A A A RA3 VSS 6/0

    1010 D D A A VREF+ A A A RA3 VSS 5/1

    1011 D D A A VREF+ VREF- A A RA3 RA2 4/2

    1100 D D D A VREF+ VREF- A A RA3 RA2 3/2

    1101 D D D D VREF+ VREF- A A RA3 RA2 2/2

    1110 D D D D D D D A VDD VSS 1/0

    1111 D D D D VREF+ VREF- D A RA3 RA2 1/2

    A= Entrada Analgica; D = E/S Digital; (1) Estos canales no estn disponibles para los dispositivos de 28 pines

    Notas: (1) Estos tres canales no existen en los PIC16F873 / 76 (2) Esta columna indica el nmero de canales analgicos de entrada disponibles y el nmero de canales analgicos usados como entradas de voltaje de referencia.

    3. Registros ADRESH Y ADRESL

    El par de registros ADRESH:ADRESL se carga con el resultado de 10 bits de la conversin A/D. Este par de registros se extienden hasta 16 bits. El mdulo A/D tiene la posibilidad de justificar el resultado de 10 bits dentro de los 16 bits de la pareja de registros. La seleccin del formato de justificacin a la izquierda o derecha se realiza con el bit ADFM (ADCON1). Los bits restantes (a los 10 de la conversin) se llenan con ceros. Cuando se completa la conversin A/D, el resultado se guarda en los registros y se pone a cero el bit GO/#DONE y el flag de fin de conversin ADIF (PIR1) se pone a 1.

    Estos dos registros cuando el convertidor A/D est en OFF y no se utiliza, pueden utilizarse como dos registros de 8 bits de propsito general.

    Cuando se completa la conversin A/D, el resultado se guarda en los registros y se pone a cero el bit GO/#DONE.

    Despus de que el conversar A/D se ha configurado como se quiere, la seleccin del canal debe realizarse antes de hacer la adquisicin. Los canales de entrada analgica deben tener los correspondientes bits del registro TRIS seleccionados como entradas.

    5.6. Los Registros de Resultados

    El par de registros ADRESH:ADRESL (1Eh:9Eh) son cargados con el dato (D) resultante de una conversin analgico / digital al terminar sta. Cada uno de estos registros es de 8 bits, por lo tanto, juntos pueden guardar hasta 16 bits. Sin embargo, como el

  • 11

    resultado D es de 10 bits, el mdulo de conversin A/D permite justificarlo (alinearlo) en la parte izquierda o derecha de los 16 bits disponibles, para elegir alguna de las dos opciones se usa el bit ADFM (ADCON1) como se muestra en la figura siguiente

    5.7. Caractersticas Elctricas del convertidor

    Las siguientes son algunas de las especificaciones ms importantes, y son vlidas para los PIC16F87X-04, PIC16F87X-10, PIC16F87X-20, PIC16LF87X-04:

    Caracterstica mnimo tpico mximo VREF+-VREF- 2v - VDD+0.3v

    VREF+ VDD-2.5v - VDD+0.3v VREF- VSS-0.3v - VREF+-2v

    Voltaje analgico VAIN VSS-0.3v - VREF++0.3v Impedancia de la fuente de seal externa ZAIN - - -10 K

    Corriente promedio consumida por el convertidor

    IAD

    Estndar - 220A - Extendido - 90A -

    5.8. Otras Caractersticas

    1. Requisitos para la Adquisicin A/D

    Para que el convertidor A/D pueda tener la exactitud especificada, debe permitirse la carga del condensador (CHOLD) que mantiene la entrada a un nivel de tensin. La Estructura de un pin de un canal Analgico se muestra en la siguiente figura.

  • 12

    De la impedancia de la fuente (RS) se toma una muestra a travs del interruptor (RSS) la impedancia afecta directamente al tiempo de carga del condensador CHOLD. La impedancia recomendada para las fuentes analgicas es de 10 K. Cuando la impedancia disminuye tambin disminuye el tiempo de adquisicin. Antes de realizar, la conversin debe seleccionarse el canal de la entrada analgica.

    Para calcular el tiempo mnimo de adquisicin mnimo se puede utilizar la siguiente ecuacin, que asume un error de LSB para 1024 pasos del convertidor A/D.

    2. Seleccin del reloj del convertidor A/D

    Se define por TAD al tiempo de conversin por bit. El convertidor A/D requiere un mnimo de 12 TAD para la conversin de los 10 bits, La seal de reloj para la conversin A/D se selecciona por software mediante los bits ADCS1:ADCS0

    2 TOSC

    8 TOSC

    32 TOSC

    Oscilador interno RC (2-6 s)

    Para realizar conversiones correctas el reloj del convertidor A/D debe seleccionarse para asegurar un tiempo mnimo de TAD de 1,6 mS.

    La tabla siguiente muestra los tiempos de TAD dependiendo de la seal de reloj seleccionada para la conversin A/D:

    Fuente del Reloj A/D Frecuencia mxima del dispositivo Operacin ADCS1:ADCS0 Mx

    FOSC/2 0 0 1.25 MHz FOSC/8 0 1 5 MHz

    FOSC/32 1 0 20 MHz RC (1,2,3) 1 1 Nota 1

    Notas: 1. Si la fuente es el oscilador RC tiene un TAD tpico de 4 s, pero puede variar entre 2 6 s.

    2. Cuando la frecuencia del dispositivo es mayor de 1MHz, la fuente del oscilador RC para la conversin A/D se recomienda solo si se trabaja en el modo Sleep.

    3. Para dispositivos de tensin mayores (LC), comprobar las caractersticas elctricas

    3. Configuracin de los Pines del Puerto Analgico

    Los registros ADCON1 y TRIS controlan la configuracin de los pines del puerto del convertidor A/D. Cuando se desea configurar una entrada como analgica, debe configurarse

  • 13

    como entrada los bits correspondientes del registro TRIS. Si el bits del TRIS correspondiente se pone a cero (salida), el valor digital de la salida (VOH o VOL) se convertir.

    El funcionamiento del convertidor A/D es independiente de los bits CHS2:CHS0 y del valor del TRIS.

    Notas: 1. Al leer el registro del puerto, cualquier pin configurado como un canal analgico se lee

    como un cero (nivel bajo). Los pines configurados como entradas digitales convertirn la entrada analgica. Los niveles analgicos de una entrada digital no afectarn la exactitud de la conversin.

    2. Los niveles analgicos en cualquier pin de entrada digital (AN7:AN0 ) pueden causar que el buffer de entrada consuma una corriente superior a la de las especificaciones del dispositivo

    4. Conversiones A/D

    Si se pone a cero el bit GO/#DONE durante la conversin, se aborta la conversin actual. El par de registros no se modificarn parcialmente con los bit que se hayan completado hasta el momento. Es decir, los registros ADRESH:ADRESL seguirn conteniendo el valor de la ltima conversin completa (o el ltimo valor que se haya escrito en ADRESH:ADRESL) despus de abortar la conversin A/D, es requerido el TAD de espera para realizar la prxima adquisicin comience. Despus de 2 TAD de espera, la adquisicin en cauce se comienza automticamente.

    En la siguiente figura se presenta los ciclos TAD del convertidor A/D. Despus de poner el bit GO a uno, la primera vez el segmento tiene un TCY mnimo y un TAD mximo.

    Nota: El bit GO/#DONE no debe ponerse a uno en la misma instruccin que se pone en ON el convertidor A/D.

    5. Funcionamiento del Convertidor A/D en el modo Sleep

    El mdulo del convertidor A/D puede trabajar durante el modo Sleep. Para ello se debe poner como fuente de reloj el modo RC (ADCS1.ADCS0 = 1l). Cuando la fuente de reloj es el RC interno, el mdulo A/D espera un ciclo de mquina antes de empezar la conversin. Esto permite eliminar el ruido de la conversin digital, Cuando la conversin finaliza el bit GO/#DONE se pone a cero y el resultado se carga en, la pareja de registros ADRESH:ADRESL. Si la interrupcin por final de conversin A/D est habilitada, el

  • 14

    dispositivo se despierta. Si la interrupcin no est habilitada, el mdulo A/D se apagar aunque el bit ADON (ADCON0 ) permanezca a uno.

    Cuando el reloj del convertidor A/D es otra fuente distinta del RC interno, la instruccin sleep aborta la conversin actual y el mdulo A/D se apaga, aunque el bit ADON permanezca a uno. Apagando el mdulo del convertidor A/D el consumo es ms bajo.

    6. Efectos del Reset

    Cuando se fuerza un Reset se reestablecen todos los registros, esto obliga a apagar el convertidor A/D y se aborta cualquier conversin en curso. El valor de los registros ADRESH:ADRESL no es modificado por un Power-on Reset.

    7. Registros asociados al Convertidor A/D

    Direccin Nombre Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Valor en POR,BOR

    Valor en el

    resto de

    Reset 0Bh,8Bh

    10Bh,18Bh INTCON GIE PEIE TOIE INTE RBIE TOIF INTF RBIF 0000 000x 0000 000u

    0Ch PIR1 PSPIF1 ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF 0000 0000 0000 0000 0Bh PIE1 PSPIE1 ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE 0000 0000 0000 0000

    1E h ADDRESH Parte alta de la conversin A/D xxxx xxxx uuuu uuuu

    9E h ADDRESL Parte baja de la conversin A/D xxxx xxxx uuuu uuuu

    1Fh ADCON0 ADCS1 ADCS0 CHS2 CHS1 CHS0 GO/#DONE

    ADOM 0000 00-0 0000 00-0

    9Fh ADCON1 ADFM --- --- --- PCFG3 PCFG2 PCFG1 PCFG0 --0- 0000 --0- 0000

    85h TRISA --- --- Registro de direccionamiento de datos de PORTA --11 1111 --11 1111

    05h PORTA --- --- Latch de datos para escritura del PORTA --0x 0000 --0u 0000

    89h (1) TRISE IBF OBF IBOV PSPMODE --- Bit de direccionamiento del

    PORTE 0000 -111 0000 -111

    09h (1) PORTE --- --- --- --- --- RE2 RE1 RE0 ---- -xxx ---- uuuu

    8. Caractersticas del convertidor A/D

    Symb. Caractersticas Mnimo Tpica Mximo Unid. Condiciones NR Resolucin -- -- 10-bits Bit VREF=VDD = 5.12V

    Vss VAIN VREF

    EIL Error absoluto -- --

  • 15

    Voltaje de referencia bajo

    AVSS 0.3 -- VREF + 0.3 V

    VAIN Voltaje analgico de entrada

    VSS-0.3 -- VREF + 0.3 V

    ZAIN Impedancia recomendada para la fuente de voltaje analgico

    IAD Corriente de conversin Estndar Extendida

    --

    --

    220 90

    __

    __

    A A

    Promedio de consumo de corriente cuando el A/D est activado (Nota1)

    IREF Corriente de entrada VREF

    (Nota 2) 10 --

    --

    --

    1000 10

    A A

    Durante la adquisicin VAIN basada en la diferencia VHOLD y VAIN a carga Durante el ciclo de conversin.

    Nota 1: Cuando el mdulo A/D est apagado (OFF) no consume corriente

    Nota 2:

    Ejemplo 1

    Adquisicin de una seal analgica por poleo.

    El siguiente programa realiza la conversin repetitiva de una seal analgica conectada al canal AN0. El dato obtenido en cada conversin es convertido a 4 cdigos ASCII de los respectivos 4 dgitos hexadecimales equivalentes para poder desplegarlos en la pantalla de una PC que los recibir a travs de su puerto serie RS232.

    El circuito se muestra a continuacin, donde la seal conectada a la lnea AN0 deber estar en el rango de VSS a VDD, para fines de prueba puede ser usado un potencimetro (de 1 a 10 K):

    ;************************************************************************ ;* Este programa realiza la conversin de una seal analgica conectada * ;* al canal AN0 y enva a travs del puerto serie el resultado de la * ;* conversin en forma de 4 dgitos hexadecimales. Reloj de 4 MHz. * ;************************************************************************ ;

  • 16

    Include "p16f877.inc" cont EQU 0x20 msnib EQU 0x22 lsnib EQU 0x23

    org 0x0000

    inic CALL initrans ;inicializa el puerto serie para transmisin BSF STATUS,RP0 ;Banco 1 MOVLW 0x8E ;Configura 1 canal analgico, VREF+=VDD y VREF-=VSS MOVWF ADCON1 ;y el resultado ajustado a la derecha. BSF TRISA,0 ;configura como entrada el canal digital RA0 BCF STATUS,RP0 ;Banco 0 MOVLW 0x01 ;Selecciona el canal AN0, reloj de conversin Fosc/2 MOVWF ADCON0 ;y enciende el convertidor

    ciclo CALL d30us ;espera 30 seg a que pase el tiempo de adquisicin BSF ADCON0,GO ;inicia conversin

    espera BTFSC ADCON0,2 ;Espera a que termine la conversin #DONE=0 GOTO espera MOVF ADRESH,W ;Carga en W el Byte alto del resultado CALL Envbyte ;enva el byte por el puerto serie BSF STATUS,RP0 ;banco 1 MOVF ADRESL,W ;Carga en W el Byte bajo del resultado CALL Envbyte ;enva el byte por el puerto serie MOVLW 0x0D ;carga cdigo de retorno de lnea CALL envia ;lo enva MOVLW 0x0A ;carga cdigo de avance de lnea CALL envia ;lo enva GOTO ciclo ;repite

    ;*************************************************************** ; Subrutina que enva el byte en W por el puerto serie, separado ; en los cdigos ASCII de sus dos nibbles hexadecimales ;*************************************************************** Envbyte:

    MOVWF msnib ;pone byte en msnib MOVWF lsnib ;y una copia en lsnib SWAPF msnib,1 ;intercambia nibbles en msnib MOVLW 0x0F ;mscara para limpiar el nibble alto ANDWF msnib,1 ;limpia parte alta de msnib ANDWF lsnib,1 ;limpia parte alta de lsnib MOVF msnib,W ;carga msnib en W CALL asc ;obtiene cdigo ASCII equivalente CALL envia ;lo enva por el puerto serie MOVF lsnib,W ;carga lsnib en W CALL asc ;obtiene cdigo ASCII equivalente CALL envia ;lo enva por el puerto serie RETURN

    asc ADDWF PCL,1 ;Calcula el cdigo a retornar ;Saltando W instrucciones adelante

    DT "0123456789ABCDEF"

    ;************************************************************ ; Subrutina d30us de aprox. 30 seg (con Fosc=4MHZ) ;************************************************************ d30us MOVLW 0x08 ;Carga dato para 30 seg.

    MOVWF cont ;inicializa contador con el dato rep DECFSZ cont,1 ;Decrementa contador y escapa si cero

    GOTO rep ;si no es cero, repite esc RETURN ;regresa de esta subrutina

    ;**************************************************************** ;Subrutina para inicializar el puerto serie USART como transmisor ;a 9600 Bauds, considerando un cristal de reloj de 4 MHZ ;**************************************************************** initrans:

  • 17

    BCF STATUS,RP1 BSF STATUS,RP0 ;banco 1 BSF TXSTA,BRGH ;pone bit BRGH=1 (velocidad alta) MOVLW 0x19 ;valor para 9600 Bauds (Fosc=4 Mhz) MOVWF SPBRG ;configura 9600 Bauds BCF TXSTA,SYNC ;limpia bit SYNC (modo asncrono) BSF TXSTA,TXEN ;pone bit TXEN=1 (habilita transmisin)

    BCF STATUS,RP0 ;regresa al banco 0 BSF RCSTA,SPEN ;pone bit SPEN=1 (habilita puerto serie) RETURN

    ;*************************************************************** ;Subrutina para enviar el byte guardado en W por el puerto serie ;*************************************************************** envia BSF STATUS,RP0 ;banco 1 esp BTFSS TXSTA,TRMT ;checa si el buffer de transmisin

    GOTO esp ;si est ocupado espera BCF STATUS,RP0 ;regresa al banco 0 MOVWF TXREG ;enva dato guardado en W RETURN end

    Anlisis del cdigo

    En primer lugar configuramos el registro ADCON1 y ADCON0.

    Registro ADCON1

    ADCON1 = 0x8E

    ADFM --- --- --- PCFG3 PCFG2 PCFG1 PCFG0

    1 1 1 1 0

    Bit 7 Bit 0

    ADFM=1, resultado justificado a la derecha

    Configura un canal analgico, VREF+=VDD y VREF-=VSS PCFG3=1 PCFG2=1 PCFG1=1 PCFG0=0

    Registro ADCON0

    ADCON0 = 0x01

    ADCS1 ADCS0 CHS2 CHS1 CHS0 GO/#DONE --- ADON

    0 0 0 0 0 0 1

    Bit 7 Bit 0

    Selecciona el reloj a una frecuencia Fosc/2 ADCS1=0 ADCS0=0

  • 18

    Selecciona el canal analgico para convertir AN0. CHS2=0 CHS1=0 CHS0=0

    GO/#DONE=0, apaga la conversin ADON=1, enciende el convertidor

    Programa principal. Este programa luego de la configuracin de los registros ADCON0 y ADCON1,

    espera 30 seg a que pase el tiempo de adquisicin para iniciar la conversin GO=1. Espera a que

    termine la conversin para Carga en W el Byte alto del resultado y lo enva el byte por el puerto serie; lo

    mismo para el Byte bajo, luego carga y enva: el cdigo de retorno de lnea y el cdigo de avance

    de lnea . Repitiendo el ciclo desde el tiempo de adquisicin de 30 seg.

    Subrutinas. Son tres: Envbyte, pausa y initrans:

    Envbyte, subrutina que enva el byte en W por el puerto serie, separado en los cdigos ASCII de sus dos

    nibbles hexadecimales.

    pausa, subrutina de pausa de aprox. 30 seg (con Fosc=14.7456 MHZ).

    initrans, subrutina para inicializar el puerto serie USART como transmisor a 9600 Bauds, considerando

    un cristal de reloj de 4 MHZ.