Vous êtes sur la page 1sur 14

CURSO DE MICROCONTROLADORES PIC16F877A

EL CONVERSOR A/D

Mdulo 6: CONVERTIDOR ANLOGO DIGITAL

Normalmente la naturaleza que nos rodea tiene fenmenos que para el hombre es de suma importancia medir. Para medir estos fenmenos usamos sensores que transforman un valor fsico en un valor elctrico. Por ejemplo cuando queremos medir la voz, necesitamos usar un micrfono, este sensor a su salida nos dar una pequeo voltaje, esta seal de voltaje tendremos que amplificarla para poder tratarla. En pocas pasadas el tratamiento de la seal de voz era puramente analgico, sin embargo en la actualidad existen muchos mtodos para tratar las seales de voz de manera digital. Antes de pasar al control digital de la seal de voz, debemos convertir esta seal en digital, para este propsito se usa un conversor A/D. Un convertidor anlogo digital tiene como entrada un nivel de voltaje (valor analgico) y produce en su salida un nmero binario de n bits proporcionales al nivel de la entrada (valor digital). El proceso de conversin A/D normalmente posee las etapas de: - Muestreo - Cuantificacin - Codificacin

Uno de los parmetros que definen al conversor A/D es la resolucin como la mnima variacin de voltaje en la entrada que produce cambio del valor digital en la salida. Por ejemplo un convertidor de 10 bits tiene un total de valores (1024 valores de 0 a 1023). Si tenemos 10V a la entrada la resolucin seria de 9,765mV. En este caso el voltaje es de 10V a 0V pero pueden variar. Por ejemplo si tenemos de 10v a 5v la resolucin ser:

Una frmula para el clculo ser: Donde las tensiones de referencia son:

Profesor: Mishell Sanchez

Pgina 1

CURSO DE MICROCONTROLADORES PIC16F877A


1. Descripcin General

EL CONVERSOR A/D

El mdulo convertidor Anlogo Digital (A/D) del PIC 16F877A tiene 8 canales de entrada. La conversin de la seal analgica aplicada (a uno de los canales) se plasma en nmero binario de 10 dgitos. El mdulo A/D posee voltajes de referencia que pueden ser seleccionados para emplear las tensiones VDD, VSS del microcontrolador o puede emplear tensiones aplicadas a los pines RA2 o RA3 (incluso es posible establecer combinaciones de los anteriores valores). Para operar el modulo ADC contamos con 4 registros: Registro de resultado de byte alto de la conversin A/D (ADRESH). Banco 0, 0x1E Registro de resultado de byte bajo de la conversin A/D (ADRESL). Banco 1, 0x9E Registro 0 de control del mdulo A/D (ADCON0). Banco 0, 0x1F Registro 1 de control del mdulo A/D (ADCON1). Banco 1, 0x9F

El detalle del registro ADCON0 se muestra a continuacin:

bit 7-6 ADCS1:ADCS0: Bits Selectores de reloj del Conversor A/D (Bits de ADCON0 en negrita)

bit 5-3 CHS2:CHS0: Bits selectores de canal analgico 000 = Canal 0 (AN0) 001 = Canal 1 (AN1) 010 = Canal 2 (AN2) 011 = Canal 3 (AN3) 100 = Canal 4 (AN4) 101 = Canal 5 (AN5) 110 = Canal 6 (AN6) 111 = Canal 7 (AN7) Nota: Los dispositivos PIC16F873A/876A solo tienen canales A/D del 0 hasta el 4; los selectores no implementados son reservados. No seleccione los canales sin implementar en estos dispositivos.

bit 2

bit 1 bit 0

GO/DONE: Bits de estado del Conversor A/D Cuando ADON = 1: 1 = Conversin A/D en curso (seteando este bit se inicia la conversin A / D que se borra automticamente por hardware cuando la conversin A / D es completa 0 = Conversin A/D no est en curso. Bit no implementado: Ledo como 0 ADON: Bit para prender el Conversor A/D

Profesor: Mishell Sanchez

Pgina 2

CURSO DE MICROCONTROLADORES PIC16F877A

EL CONVERSOR A/D

1 = El modulo conversor A/D est prendido 0 = El mdulo conversor A/D est apagado y no consume corriente de funcionamiento Y el detalle del registro ADCON1 se muestra a continuacin:

bit 7

bit 6

ADFM: Bit Selector de Formato del Resultado A/D 1 = Justificacin derecha. Seis de los bits mas significantes de ADRESH son ledos como 0. 0 = Justificacin izquierda. Seis de los bits menos significativos de ADRESL son ledos como 0. ADCS2: Bit selector de reloj del conversor A/D (Bits de ADCON1 en zona sombreada y en negrita)

bit 5-4 Bits no implementados: Ledos como 0 bit 3-0 PCFG3:PCFG0: Bits de Control para la configuracin del Puerto A/D

El registro ADCON1 configura las funciones de los pines de entrada al mdulo. Como se aprecia se puede configurar los pines del puerto A como entradas analgicas inclusive la lnea RA3 puede funcionar como el votaje de referencia. Los registros ADRESH:ADRESL contienen el resultado de la conversin (10 bits). Cuando se ha completado una conversin el resultado es almacenado en ADRESH:ADRESL y adems el bit GO/-DONE (registro ADCON bit 2) se pone a 0-lgico y el bit ADIF (registro PIR1 bit 7) se pone como 1-lgico. El

Profesor: Mishell Sanchez

Pgina 3

CURSO DE MICROCONTROLADORES PIC16F877A

EL CONVERSOR A/D

registro PIR1 ocupa la posicin 0x0C del banco 0. He aqu parte del registro que volveremos a tocar en el mdulo de interrupciones:

El diagrama de bloques del modulo ADC del PIC es:

Despus que el mdulo A/D ha sido configurado, es necesario esperar un periodo de tiempo para que la seal sea adquirida (antes que las conversiones empiecen). Cada uno de los canales de entrada tiene su correspondiente bit de configuracin en los registros TRIS y estos han de ser puestos como entradas. Una vez que el periodo de adquisicin ha terminado la conversin A/D puede empezar. Los siguientes pasos muestran la secuencia de uso: 1. Configure el mdulo A/D: (lo cual significa) - Configurar los pines de entrada de los canales analgicos a usar. Configure los voltajes de referencia. (en el registro ADCON1) - Seleccione el canal de entrada al mdulo A/D (en el registro ADCON0) - Seleccione el clock de conversin A/D (en el registro ADCON0) - Ponga a funcionar el mdulo A/D (en el registro ADCON0) 2. Configure la interrupcin del A/D si lo desea: - ADIF=0 -lgico (bit que indica si se produjo una conversin) - ADIE=1-lgico (habilitador de interrupcin del modulo analgico) - PEIE=1 lgico (habilitador de interrupcin de perifricos)

Profesor: Mishell Sanchez

Pgina 4

CURSO DE MICROCONTROLADORES PIC16F877A

EL CONVERSOR A/D

- GIE=1-lgico (Habilitador general de interrupciones) 3. Espere por el tiempo de adquisicin (es el tiempo que se demora en trabajar el bloque de sampling and hold). 4. Comienzo de la conversin: GO/-DONE=1-lgico (en el registro ADCON0) 5. Esperar a que la conversin se complete. Para saber si la conversin termino podemos: - Revisar el bit GO/-DONE esperando que sea de nuevo 0 -lgico - O esperar al flag de ADIF sea 1-lgico (puede emplearse como interrupcin) 6. Leer el resultado del A/D en el par de registros (ADRESH:ADRESL). No debemos olvidar colocar el bit ADIF a 0-lgico (si se requiere). 7. Para la siguiente conversin, regrese al paso 1 o paso 2 dependiendo si solo se usa uno o ms canales. 2. Requerimientos para la adquisicin A/D Para que el modulo convertido A/D trabaje apropiadamente la carga del capacitor que muestrea la seal anloga debe ser la mxima.

Como se muestra en la figura, la impedancia de la fuente (Rs) y la impedancia del switch interno (Rss) afectan el tiempo requerido para la carga del capacitor. La mxima impedancia recomendada para la fuente analgica es de 10 K ohmios. Cuando la impedancia es menor el tiempo de adquisicin es menor y por tanto la respuesta es mejor. Luego que el canal de entrada es seleccionado (o ha sido cambiado) no olvide esperar un tiempo a que la adquisicin del dato sea hecha antes de que la conversin propiamente dicha empiece. Para calcular el mnimo tiempo requerido en la adquisicin podemos usar la ecuacin:

3. Seleccin del clock de conversin Analgica Digital Existe otro parmetro que es importante mencionar y es el tiempo de conversin de A/D POR BIT (definida como TAD). La conversin A/D requiere un mnimo de 12 TAD por 10 bits de conversin, La fuente para el clock en la conversin A/D se selecciona por software. Hay 7 posibles valores para la seleccin del TAD:

Profesor: Mishell Sanchez

Pgina 5

CURSO DE MICROCONTROLADORES PIC16F877A

EL CONVERSOR A/D

- 2Tosc - 4Tosc - 8Tosc - 16Tosc - 32Tosc - 64Tosc - Oscilador RC interno que tiene el modulo A/D (crea un retardo de 2us a 6 us). Para el correcto funcionamiento del mdulo el clock de conversin debe ser seleccionado para asegurar un TAD de 1.6 us como mnimo. La siguiente tabla muestra el resultado de varios TAD calculados para diferentes clock aplicados al microcontrolador.

4. Configuracin de los pines de los puertos para que trabajen de forma analgica Los registros ADCON1 y TRIS controlan la operacin de los pines de los canales A/D. Los pines que se empleen como entradas deben ser configurados en los registros TRIS como 1-lgico. Si en el registro TRIS se coloca a 0-lgico (como lnea de salida) el mdulo A/D convertir el voltaje presente a la salida del pin. La operacin de conversin del A/D es independiente del estado de los bits CHS2:CHS0 y de los bits de los registros TRIS Nota 1.

2.

Si el puerto A ha sido configurado como analgico y tratamos de leer el registro del puerto (PORTA) lo que encontraremos sern 0-lgicos. Los pines configurados como salida digital sern ledos como entradas analgicas con el valor de voltaje presente en las lneas. Si hubiera niveles analgicos en cualquier pin definido como entrada digital (incluyendo los pines AN7:AN0). Pueden causar en el buffer de entrada un consumo de corriente que est fuera del rango de las especificaciones y por tanto daar el microcontrolador.

5. Conversiones A/D Si iniciamos una conversin y colocamos a 0-lgico el bit GO/-DONE conseguimos abortar la conversin A/D que se est llevando a cabo en ese momento. El resultado de la conversin no aparecer en los registros ADRESH:ADRESL y se mantendr el ltimo valor convertido. Despus que la conversin A/D es abortada, la siguiente adquisicin en el canal seleccionado empieza automticamente. El bit GO/-DONE puede ser colocado a 1 para empezar la conversin.

Profesor: Mishell Sanchez

Pgina 6

CURSO DE MICROCONTROLADORES PIC16F877A

EL CONVERSOR A/D

Como se aprecia en la figura despus que el bit GO es colocado a 1-lgico comienza la conversin y al inicio hay que desconectar el condensador lo cual demanda como mximo 1 TAD, luego vienen los 10TAD correspondientes a los 10 bits del A/D y se necesita un TAD mas para depositar el resultado en los registros ADRES, colocar el bit GO/-DONE de nuevo a 0-lgico y el bit ADIF a 1-lgico. Nota. EL bit GO/-DONE y el bit ADON estn en el registro ADCON0 pero no debe ser activados a la vez esto es en la misma instruccin. 6. Registros que almacenan el resultado de la conversin El par de registros ADRESH:ADRESL almacenan el resultado de la conversin A/D. Este par de registros ocupan 16 bits. EL mdulo A/D tiene la flexibilidad de colocar el resultado justificado a la derecha o a la izquierda de esos 16 bits (formato). El bit que selecciona el formato es el ADFM (registro ADCON1 bit 7). La figura muestra como el detalle de la justificacin:

Los bits extras (6 bits) son llenados con 0-lgicos. Si en un programa no se emplea el mdulo A/D es posible usar los registros ADREH :ADRESL como si fueran registros de propsito general (registros de 8 bits). 7. Operacin del mdulo A/D durante la operacin SLEEP El mdulo A/D puede seguir operando durante el modo SLEEP, esto requiere que el clock A/D sea la red RC (ADCS1:ADCS0=111). Cuando el clock RC es seleccionado, el mdulo A/D espera un ciclo de instruccin antes de empezar la conversin. Esto le permite a la instruccin SLEEP ser ejecutada eliminando todos los ruidos digitales producidos por el swticheo en la conversin. Cuando la conversin es completada, el bit GO/-DONE es colocado a 0-lgico y el resultado es cargado a los registros ADRES. Si est habilitada la interrupcin del mdulo A/D el microcontrolador se despierta o sale del modo SLEEP.

Profesor: Mishell Sanchez

Pgina 7

CURSO DE MICROCONTROLADORES PIC16F877A

EL CONVERSOR A/D

Si las interrupciones del mdulo A/D no estn habilitadas, el mdulo A/D ser apagado pese a que el bit ADCON sigue aun en 1-lgico. Cuando se apaga el modulo A/D se tiene el mnimo consumo de corriente. Nota. Para que el mdulo A/D opere durante el modo SLEEP la fuente del clock A/D debe ser siempre el RC (ADCS1:ADCS0=11). Para permitir que la conversin ocurra durante el modo SLEEP asegrese de colocar la instruccin SLEEP inmediatamente despus de colocar el bit GO/-DONE a 1-lgico. 8. Efectos en el RESET Despus de un RESET el mdulo A/D est apagado y si haba una conversin en curso sta es abortada. Todos los pines que entran al modulo A/D son configurados como entradas analgicas. El valor presente en ADRESH:ADRESL no se modifica despus de un RESET. Luego de encender el microcontrolador el valor presente en ADRESH:ADRESL es aleatorio (basura). Ejercicio1: Mostrar la medida de temperatura que el sensor de LM35 nos ofrece a su salida. Usar el PORTD y RC7 para mostrar los datos en binario. Usar el canal analgico 7 (AN7) y un cristal de 20 MHz. Para este problema necesitaremos algunos conocimientos previos: 1- El Sensor LM35 es un sensor de temperatura que nos ofrece a su salida 10mv/C. La alimentacin que normalmente se le da es de 5v, sin embargo puede trabajar en el rango de 4 a 20v. Los circuitos que se pueden montar con este sensor son diversos, gran mayora de estos circuitos estn en su hoja de datos que proporciona el fabricante, nosotros usaremos la configuracin tpica pues no hay le necesidad en el ejemplo de usar algo mas complejo.

2- El primer paso para nuestro diseo debera ser analizar la resolucin sensor-microcontrolador. Sabemos que el sensor nos ofrece una resolucin 10mv/C, lo cual significa que nuestro microcontrolador debera estar a la misma resolucin o lo ms prximo. El pic cuenta con 10bits para almacenar la muestra del conversor A/D, adems tiene por defecto los por tanto si usamos los 10bits del pic n=10 la resolucin seria:

Vemos que a 10 bits tenemos una buena resolucin, sin embargo si usamos 9 bits obtendremos algo mas cercano a la resolucin del sensor, de esta manera algn incremento en nuestro dato de 9 bits, seria directamente el incremento en la temperatura sin hace ningn tipo de procesamiento:

Notese que mientras mas alta sea la temperatura ser mas grande el error, mejor dicho:

Para obtener una medida muy exacta tendramos que usar los Vref del pic. Otra opcin sera configurar a nuestro sensor para ajustar al resolucin como lo expresa la hoja de datos.

Profesor: Mishell Sanchez

Pgina 8

CURSO DE MICROCONTROLADORES PIC16F877A

EL CONVERSOR A/D

Ahora ya poseemos los conocimientos necesarios en cuanto al Conversor A/D del PIC y el sensor LM35. Vamos a configurar el PIC a 9bits de datos justificados a la izquierda, teniendo en teniendo en cuenta la frecuencia de muestreo y canal analgico 9. 1- Configuracin del ADCON0:

Para elegir el canal analgico 7: CHS2-CHS1-CHS0= 111 Aun no solicitaremos ninguna muestra, entonces GO/DONE: 0 La conversin A/D requiere un mnimo de 12 TAD por 10 bits de conversin, no nos haremos problema en este punto, as que usaremos 32 TAD que se refleja en ADCS2-ADCS1-ADCS0=010 ntese que en este registro solo moveremos los bits ADCS1-ADCS0, el bit ADCS2 se encuentra en el registro ADCON1 que se encuentra en el banco 1. Finalmente prenderemos el conversor A/D haciendo ADON=1

2- Configuracin del ADCON1:

Para justificacin a la izquierda el ADFM=0 En el paso 1 concluimos de la tabla de configuracin que el ADCS2=0 Para los bits PCFG3- PCFG2- PCFG1- PCFG0, queremos introducir la seal analgica por el pin AN7, lo ideal sera que los pines que restan sean digitales, sin embargo vemos que el AN7 no tiene la combinacin idnea para esto, por tanto PCFG3- PCFG2- PCFG1- PCFG0 = 0000:

Profesor: Mishell Sanchez

Pgina 9

CURSO DE MICROCONTROLADORES PIC16F877A

EL CONVERSOR A/D

El Programa en ASM para este ejemplo seria: __config _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _HS_OSC list P=16f877a include<p16f877a.inc> cblock 0x20 TEMP_100us TEMP_1ms endc ORG 0x000 CONF_PINOUT bsf clrf bcf bcf clrf CONF_AD bsf movlw movwf bcf movlw movwf PRINCIPAL bsf btfsc goto movf movwf bsf movlw btfsc movlw bcf movwf call goto retardo_1ms movlw movwf retardo_100us movlw movwf nop nop decfsz goto decfsz goto return END

STATUS,RP0 TRISD TRISC,7 STATUS,RP0 PORTD STATUS,RP0 b'00000000' ADCON1 STATUS,RP0 b'10111001' ADCON0 ADCON0,GO ADCON0,GO $-1 ADRESH,W PORTD STATUS,RP0 b'00000000' ADRESL,7 b'10000000' STATUS,RP0 PORTC retardo_1ms PRINCIPAL .10 TEMP_1ms .100 TEMP_100us

; banco 1 ; PORTD : Salida ; RC7 : Salida ; banco 0

; ADCS2 = '0' ; Todos los pines Analogicos ; ADCS1-ADCS0="10" ; Chanel: AN7 Conversor A/D Prendido ; Inicio de muestreo ; Espero que la muestra este lista

; banco 1

; banco 0

TEMP_100us $-3 TEMP_1ms retardo_100us

Profesor: Mishell Sanchez

Pgina 10

CURSO DE MICROCONTROLADORES PIC16F877A


La Simulacin de este programa la haremos en PROTEUS:

EL CONVERSOR A/D

Ejercicio2: Realizar un programa que sirva como voltmetro, sabiendo que el nivel de voltaje a medir puede variar entre 0v y 30v. El ingreso de la seal analgica se har por el pin AN0. Mostrar los datos de voltaje usando 3 displays, con un decimal de precisin. Los displays irn conectador al PORTB, PORTC y PORTD respectivamente. Para los displays usaremos la tcnica de multiplexacin, por tanto necesitaros habilitadores para estos. Usar un cristal de 20 MHz. Para este problema para poder imprimir los datos en los displays tendremos que hacer una rutina que nos permita transformar nmeros BINARIOS a formato BCD (decimal). Para este ejemplo trabajaremos con 8 bits del conversor A/D, por tanto solo necesitaremos convertir los 8 bits del registro ADRESH a 3 nmeros BCD.

La ecuacin nos invita a separar CENTENAS, DCENAS y UNIDADES en otros registros de 8 bits, cabe resaltar que podran ser solo 2 registros, pues cada BCD es de 4 bits, pero para este ejemplo por la facilidad de manejo de datos los haremos de la primera manera. Usaremos restan consecutivas unas de 100 para las centenas, otras de 10 para las decenas y finalmente el residuo ser las unidades. Si usramos el lenguaje de alto nivel C, usando datos de 8 bits sin signo la solucin sera:

Profesor: Mishell Sanchez

Pgina 11

CURSO DE MICROCONTROLADORES PIC16F877A


Lo expuesto anteriormente representado en lenguaje ensamblador seria: BINTOBCD clrf clrf clrf CENT movlw subwf btfss goto incf goto movlw addwf DEC movlw subwf btfss goto incf goto movlw addwf UNID movf movwf return

EL CONVERSOR A/D

CENTENAS DECENAS UNIDADES .100 DATOC STATUS,C $+3 CENTENAS CENT .100 DATOC .10 DATOC STATUS,C $+3 DECENAS DEC .10 DATOC DATOC,W UNIDADES ; En DATOC tenemos el residuo de las ; operaciones anteriores

; Esperamos que la resta sea negativa ; Para que el bit C del STATUS se ponga a CERO ; y continue ahora con las rutina de decenas ; Para volver al valor anterior ; antes que sea negativo

Hasta este momento ya resolvimos un problema de software, sin embargo aun nos queda solucionar el cuestionamiento que por el PIC no puede ingresar ninguna seal mayor de 5v. Para poder conectar la seal al pin AN0 usaremos un divisor de tensin con resistencias por su simplicidad, cabe resaltar que esta solucin disminuir un poco la precisin, hay otras soluciones que dependern de la aplicacin y de la importancia de la seal a ingresar, otra solucin seria opamps, etc.:

Muy bien, circuito ya solucionamos el problema de acondicionamiento de seal, ahora vamos a configurar los registro ADCON0 y ADCON1. Colocaremos los valores y el lector tendr que comprobar estos con los apuntes hechos arriba.

Profesor: Mishell Sanchez

Pgina 12

CURSO DE MICROCONTROLADORES PIC16F877A


El Cdigo en ASM para este ejercicio sera: __config _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _HS_OSC list P=16f877a include<p16f877a.inc> cblock 0x20 TEMP_100us TEMP_1ms CENTENAS DECENAS UNIDADES DATOC endc ORG 0x000 CONF_PINOUT bsf clrf clrf clrf bcf clrf CONF_AD bsf movlw movwf bcf movlw movwf PRINCIPAL bsf btfsc goto movf movwf call movf call movwf movf call movwf movf call movwf call goto BINTOBCD clrf clrf clrf CENT movlw subwf

EL CONVERSOR A/D

STATUS,RP0 TRISB TRISC TRISD STATUS,RP0 PORTD STATUS,RP0 b'00000000' ADCON1 STATUS,RP0 b'10000001' ADCON0 ADCON0,GO ADCON0,GO $-1 ADRESH,W DATOC BINTOBCD CENTENAS,W DISPLAY PORTB DECENAS,W DISPLAY PORTC UNIDADES,W DISPLAY PORTD retardo_1ms PRINCIPAL

; banco 1 ; PORTB: Salida ; PORTC: Salida ; PORTD: Salida ; banco 0

; ADCS2 = '0' ; Todos los pines Analogicos ; ADCS1-ADCS0="10" ; Chanel: AN0 Conversor A/D Prendido ; Inicio de muestreo ; Espero que la muestra este lista

; Tiempo de espera para otra ADC

CENTENAS DECENAS UNIDADES .100 DATOC

Profesor: Mishell Sanchez

Pgina 13

CURSO DE MICROCONTROLADORES PIC16F877A


btfss goto incf goto movlw addwf DEC movlw subwf btfss goto incf goto movlw addwf UNID movf DATOC,W movwf UNIDADES ;--return retardo_1ms movlw movwf retardo_100us movlw movwf nop nop decfsz goto decfsz goto return DISPLAY addwf retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw END .10 DATOC STATUS,C $+3 DECENAS DEC .10 DATOC STATUS,C $+3 CENTENAS CENT .100 DATOC

EL CONVERSOR A/D

; Para volver al valor anterior ; antes que sea negativo

; Este tiempo es para la recuperacin del ADC .10 TEMP_1ms .100 TEMP_100us

TEMP_100us $-3 TEMP_1ms retardo_100us

PCL,f b'00111111' ;0 b'00000110' ;1 b'01011011' ;2 b'01001111' ;3 b'01100110' ;4 b'01101101' ;5 b'01111101' ;6 b'00000111' ;7 b'01111111' ;8 b'01101111' ;9 b'01110111' ;A b'01111100' ;B b'00111001' ;C b'01011110' ;D b'01111001' ;E b'01110001' ;F

; PC=PC+W

Profesor: Mishell Sanchez

Pgina 14

Vous aimerez peut-être aussi