Академический Документы
Профессиональный Документы
Культура Документы
(A/D)
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.
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 se
tiene que muestrear y cuantificar, como se explica a continuacin:
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. 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.
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
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:
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:
R/W-0
ADCS0
R/W-0
G0/#DONE
U-0
---
R/W-0
ADON
Bit 0
para operacin en modo SLEEP, ya que este modo desconecta la frecuencia del
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:
bit 1:
bit 0:
U-0
---
R/W-0
---
U-0
---
R/W-0
PCFG3
R/W-0
PCFG2
R/W-0
PCFG1
R/W-0
PCFG0
Bit 0
el
estos registros es de 8 bits, por lo tanto, juntos pueden guardar hasta 16 bits. Sin embargo,
como el 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<7>) como se muestra en la figura siguiente
mnimo
tpico
mximo
VREF+-VREFVREF+
VREFVoltaje analgico VAIN
Impedancia de la fuente de seal externa ZAIN
Corriente promedio
Estndar
consumida por el convertidor
Extendido
IAD
2v
VDD-2.5v
VSS-0.3v
VSS-0.3v
-
220A
90A
VDD+0.3v
VDD+0.3v
VREF+-2v
VREF++0.3v
-10 K
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.
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
Operacin
ADCS1:ADCS0
FOSC/2
00
FOSC/8
01
FOSC/32
10
RC (1,2,3)
11
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
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.
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
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.
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
xxxx xxxx
uuuu uuuu
9E h
ADDRESL
xxxx xxxx
uuuu uuuu
1Fh
ADCON0
ADCS1
0000 00-0
0000 00-0
CHS2
CHS1
CHS0
GO/#DO
NE
---
---
PCFG3
PCFG2
ADOM
9Fh
ADCON1
ADFM
---
--0- 0000
--0- 0000
85h
TRISA
---
---
--11 1111
--11 1111
05h
--0x 0000
--0u 0000
0000 -111
0000 -111
---- -xxx
---- uuuu
PORTA
---
---
89h
(1)
TRISE
IBF
OBF
IBOV
PSPMODE
---
09h
(1)
PORTE
---
---
---
---
---
PCFG1
PCFG0
RE1
RE0
Caractersticas
Resolucin
Mnimo
--
Tpica
--
Mximo
10-bits
Unid.
Bit
Condiciones
VREF=VDD = 5.12V
Vss VAIN VREF
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
-VREF
Monotonicidad
Voltaje de referencia
(VREF+- VREF-)
-2.0V
Garantizada
--
-VDD+0.3
-V
VREF+
Voltaje de referencia
AVDD-2.5V
alto
Voltaje de referencia
AVSS 0.3
bajo
Voltaje analgico de
VSS-0.3
entrada
Impedancia
recomendada para la
fuente de voltaje
analgico
Corriente de
-conversin
-Estndar
Extendida
Corriente de entrada VREF
10
(Nota 2)
--
AVDD+0.3V
--
VREF + 0.3
--
VREF + 0.3
220
90
__
__
A
A
---
1000
10
A
A
VAIN
ZAIN
IAD
IREF
Promedio de
consumo de corriente
cuando el A/D est
activado (Nota1)
Durante la
adquisicin VAIN
basada en la
diferencia VHOLD y
VAIN a carga Durante
el ciclo de
conversin.
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):
16
1. Diagrama de Flujo:
Diagrama de flujo del Programa Principal:
17
INICIO
initrans
d30us
GO1
#DONE=0
NO
SI
W
envbayte
envbayte
W0x0D
envia
W0x0A
envia
18
19
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"
;Setup of PIC configuration flags
__CONFIG
_XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF
;Define variables
CBLOCK 0x20
cont
msnib
lsnib
ENDC
org 0x00
inic
CALL initrans
BSF STATUS,RP0
MOVLW 0x8E
MOVWF ADCON1
BSF TRISA,0
BCF STATUS,RP0
MOVLW 0x01
MOVWF ADCON0
ciclo
CALL pausa
BSF ADCON0,GO
BTFSC ADCON0,2
GOTO espera
MOVF ADRESH,W
CALL Envbyte
BSF STATUS,RP0
espera
21
MOVF ADRESL,W
CALL Envbyte
MOVLW 0x0D
CALL envia
MOVLW 0x0A
CALL envia
GOTO ciclo
;Carga en W el
;enva el byte
;carga cdigo de
;lo enva
;carga cdigo de
;lo enva
;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 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)
BCF STATUS,RP0
BSF RCSTA,SPEN
RETURN
;regresa al banco 0
;pone bit SPEN=1 (habilita puerto serie)
;***************************************************************
;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
---
---
---
PCFG3
1
PCFG2
1
PCFG1
1
PCFG0
0
Bit 0
ADCS0
1
CHS2
0
CHS1
0
CHS0
0
GO/#DONE
0
---
ADON
1
Bit 0
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
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 <CR> y el cdigo de avance
de lnea <LF>. Repitiendo el ciclo desde el tiempo de adquisicin de 30 seg.
Subrutinas. Son tres: Envbyte, pausa y initrans:
23
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=4 MHZ).
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