Documentos de Académico
Documentos de Profesional
Documentos de Cultura
(A/D)
1
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.
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.
1. El muestreo
El muestreo implica que s e t i e n e que coger una muestra de la seal cada T segundos en
el eje de las abscisas, 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:
2
2. La cuantificacin
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.
3
Si s e aumenta 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 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
Ejemplo. A partir de la potencia de una seal, podemos saber que error se est cometiendo.
4
- 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.
5
Anlisis de cada parte del mdulo de Conversin Analgico Digital :
Las entradas de seleccin del multiplexor de los canales analgicos, son los bits 5-3, CH2:CH0,
del registro de control ADCON0. Adems, los canales analgicos a usar debern tener sus bits
TRIS correspondientes seleccionados como entradas.
Los bit 3-0, PCFG3:PCFG0, del registro de control ADCON1, configuran los canales de
entrada del convertidor A/D, es decir, estos bits son las entradas de seleccin del multiplexor
para la configuracin de las entradas analgicas, entradas digitales y voltajes de
referencia.
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.
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:
7
5.5. 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.
2. Configurar interrupciones para el convertidor A/D (si se desea), para ello: limpiar
a. ADIF y poner ADIE, PEIE y GIE.
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:
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
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 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
10
con la siguiente tabla:
PCFG3: AN7(1) AN6(1) AN5(1) AN4 AN3 AN2 AN1 AN0 CAN/(2)
VREF+ VREF-
PCFG0 /RE2 /RE1 /RE0 /RA5 /RA3 /RA2 /RA1 /RA0V 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
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.
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.
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.
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:
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
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.
14
Nota: El bit GO/#DONE no debe ponerse a uno en la misma instruccin que se pone en ON el
convertidor A/D.
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
dispositivo se despierta. Si la interrupcin no est habilitada, el mdulo A/D se apagar aunque
el bit ADON (ADCON0 <0>) 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.
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.
Direccin Nombre Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Valor en Valor en el
POR,BOR resto de
Reset
0Bh,8Bh INTCON GIE PEIE TOIE INTE RBIE TOIF INTF RBIF 0000 000x 0000 000u
10Bh,18Bh
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/#DO ADOM 0000 00-0 0000 00-0
NE
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
(1)
89h TRISE IBF OBF IBOV PSPMODE --- Bit de direccionamiento del 0000 -111 0000 -111
PORTE
(1)
09h PORTE --- --- --- --- --- RE2 RE1 RE0 ---- -xxx ---- uuuu
15
EIL Error absoluto -- -- <1 LSb VREF=VDD = 5.12V
Vss VAIN VREF
EDL Error Direccional -- -- <1 LSb VREF=VDD = 5.12V
Vss VAIN VREF
EGN Error de ganancia -- -- <1 LSb VREF=VDD = 5.12V
Vss VAIN VREF
-- Monotonicidad -- Garantizada -- -- Vss VAIN VREF
VREF Voltaje de referencia 2.0V -- VDD+0.3 V Absoluta
(VREF+- VREF-) especificacin.
Asegura la precisin
de 10 bits
VREF+ Voltaje de referencia AVDD-2.5V AVDD+0.3V V
alto
Voltaje de referencia AVSS 0.3 -- VREF + 0.3 V
bajo
VAIN Voltaje analgico de VSS-0.3 -- VREF + 0.3 V
entrada
ZAIN Impedancia
recomendada para la
fuente de voltaje
analgico
IAD Corriente de -- 220 __ A Promedio de
conversin -- 90 __ A consumo de corriente
Estndar cuando el A/D est
Extendida activado (Nota1)
IREF Corriente de entrada VREF 10 -- 1000 A Durante la
(Nota 2) -- -- 10 A 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
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):
16
1. Diagrama de Flujo:
17
INICIO
initrans
d30us
GO1
NO
#DONE=0
SI
envbayte
envbayte
W0x0D
envia
W0x0A
envia
18
El diagrama de flujo de la Subrutina asc:
19
El diagrama de flujo de la Subrutina d30us:
d30us
W0x08
contW
contcont-1
NO
Z=1
SI
FIN
20
El diagrama de flujo de la Subrutina initrans, no es necesario porque esta subrutina nicamente sirve
para inicializar el puerto serie USART como transmisor a 9600 Bauds, considerando un cristal de reloj de
4 MHZ.
2. Cdigo en Assembler:
;************************************************************************
;* 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. *
;************************************************************************
PROCESSOR 16F877
RADIX DEC
INCLUDE "P16F877A.INC"
;Define variables
CBLOCK 0x20
cont
msnib
lsnib
ENDC
org 0x00
21
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 <CR>
CALL envia ;lo enva
MOVLW 0x0A ;carga cdigo de avance de lnea <LF>
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
;************************************************************
; Subrutina de pausa de aprox. 30 seg (con Fosc=14.7456 MHZ)
;************************************************************
pausa MOVLW 0x23 ;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 14.7456 MHZ
;****************************************************************
initrans:
BCF STATUS,RP1
BSF STATUS,RP0 ;banco 1
BCF TXSTA,BRGH ;pone bit BRGH=0 (velocidad baja)
MOVLW 0x17 ;valor para 9600 Bauds (Fosc=14.7456 Mhz)
MOVWF SPBRG ;configura 9600 Bauds
BCF TXSTA,SYNC ;limpia bit SYNC (modo asncrono)
BSF TXSTA,TXEN ;pone bit TXEN=1 (habilita transmisin)
;***************************************************************
;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
22
Anlisis del cdigo
Registro ADCON1
ADCON1 = 0x8E
Registro ADCON0
ADCON0 = 0x41
Selecciona el reloj a una frecuencia Fosc/8 (el TAD depende de la seal de reloj seleccionada
para la conversin A/D, en este caso la Fuente del Reloj A/D es 4 MHz y la Frecuencia mxima
del dispositivo para la frecuencia de Fosc/8 es 5 MHz)
ADCS1=0
ADCS0=1
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 <CR> y el cdigo de avance
de lnea <LF>. Repitiendo el ciclo desde el tiempo de adquisicin de 30 seg.
initrans, subrutina para inicializar el puerto serie USART como transmisor a 9600 Bauds, considerando
un cristal de reloj de 4 MHZ.
Ejercicio
Realizar el mismo ejercicio anterior, con la condicin que el dato convertido de anlogo a digital, sea
transmitido a la PC solo cuando cambia de valor.
24