Módulo de Conversión A/D

Microcontroladores PIC

©ATE-Universidad de Oviedo

1

Módulo de Conversión A/D

Características generales en el PIC16F877 (A)
Ocho canales de conversión.
Cinco pines de PORTA y los tres de PORTE.

Convierte la señal analógica en un número digital de 10 bits.

Tensiones de referencia VREF+ y VREF- seleccionables por software.
Pueden ser VDD y VSS o las tensiones aplicadas en los pines RA3 / RA2.

Puede seguir funcionando cuando el PIC está en modo SLEEP ya que dispone de un oscilador RC interno propio Hay 11 registros asociados a este periférico.
Definición de pines de entrada y señales aplicadas Manejo de interrupciones
TRISA – PORTA – TRISE - PORTE INTCON – PIE1 – PIR1 ADCON0 – ADCON1 – ADRESH - ADRESL
©ATE-Universidad de Oviedo

Control del conversor A/D
Microcontroladores PIC

2

Módulo de Conversión A/D

Estructura interna
Multiplexor analógico 8 a 1
RA0/AN0 RA1/AN1 RA2/AN2/VREFRA3/AN3/VREF+ RA5/AN4 RE0/AN5 RE1/AN6 RE2/AN7
000 001 010 011 100 101 110 111

CHS2:CHS0

Selección del canal analógico
VAIN (Input Voltage)

Módulo A/D
SS RSS Circuito de Muestreo y Retención CHOLD

VDD

Configuración entradas PCFG3:PCFG0
VREF+

PCFG3:PCFG0 VREFVSS Microcontroladores PIC ©ATE-Universidad de Oviedo

GO /DONE

3

Módulo de Conversión A/D

Función de transferencia conversor A/D La primera transición tiene lugar cuando la tensión analógica de entrada alcanza el valor VREF- + (VREF+ - VREF-)/1024 ≡ 1LSb.
11 bits

400h 3FFh 3FEh 3FDh 3FCh

004h 003h 002h 001h 000h

(VREF-)

(VREF+)

1022 LSb 1023 LSb 1024 LSb

1 LSb 2 LSb 3 LSb 4 LSb

1021 LSb

Microcontroladores PIC

©ATE-Universidad de Oviedo

4

ADRESH

A/D

ADRESL

Módulo de Conversión A/D

Función de transferencia conversor A/D
Caso de que V REF+ = VDD y que V REF- = VSS
11 bits

400h 3FFh 3FEh 3FDh 3FCh

004h 003h 002h 001h 2 LSb 4 LSb 1021 LSb 1022 LSb
0V

1 LSB = VDD/1024

1023 LSb 1024 LSb

3 LSb

1 LSb

000h

VDD

Ve

Microcontroladores PIC

©ATE-Universidad de Oviedo

5

Módulo de Conversión A/D

Registro ADCON0 (1Fh)
ADCS1 ADCS0 CHS2 CHS1 CHS0

caso de los PIC16F87x y versiones “antiguas”

GO/DONE

-

ADON

bit 7-6

ADCS1:ADCS0: Selección del reloj para la conversión A/D
00 = fOSC / 2 01 = fOSC / 8 10 = fOSC / 32 11 = fRC

bit 5-3

CHS2:CHS0: Selección del canal de conversión
000 = Canal 0 100 = Canal 4 001 = Canal 1 101 = Canal 5 010 = Canal 2 110 = Canal 6 011 = Canal 3 111 = Canal 7

bit 2

GO/DONE: Estado de la conversión
Si ADON=1: 1 = Conversión en progreso 0 = Conversión finalizada

bit 0

ADON: Bit de encendido del convertidor A/D
1 = Módulo A/D encendido 0 = Módulo A/D apagado 6

Microcontroladores PIC

©ATE-Universidad de Oviedo

Módulo de Conversión A/D

Registro ADCON0 (1Fh)
ADCS1 ADCS0 CHS2 CHS1 CHS0 GO/DONE

caso de los PIC16F87xA

-

ADON

bit 7-6

ADCS1:ADCS0: Selección del reloj para la conversión A/D junto con ADCS2 que está en ADCON1
00 = fOSC / 2 00 = fOSC / 4 01 = fOSC / 8 01 = fOSC / 16 10 = fOSC / 32 10 = fOSC / 64 11 = fRC 11 = fRC

ADCS2= 0 ADCS2= 1

bit 5-3

CHS2:CHS0: Selección del canal de conversión
000 = Canal 0 100 = Canal 4 001 = Canal 1 101 = Canal 5 010 = Canal 2 110 = Canal 6 011 = Canal 3 111 = Canal 7

bit 2

GO/DONE: Estado de la conversión
Si ADON=1: 1 = Conversión en progreso 0 = Conversión finalizada

bit 0

ADON: Bit de encendido del convertidor A/D
1 = Módulo A/D encendido 0 = Módulo A/D apagado 7

Microcontroladores PIC

©ATE-Universidad de Oviedo

Módulo de Conversión A/D

Registro ADCON1 (9Fh)
ADFM PCFG3 PCFG2

caso de los PIC16F87x y versiones “antiguas”

PCFG1

PCFG0

bit 7

ADFM: Selección de formato del resultado
1 = Ajuste a la derecha 0 = Ajuste a la izquierda

bit 3-0

PCFG3:PCFG0: Configuración de las entradas al módulo A/D
PCFG3: AN7 PCFG0 RE2 0000 0001 0010 0011 0100 0101 011x 1000 1001 1010 1011 1100 1101 1110 1111 A A D D D D D A D D D D D D D AN6 RE1 A A D D D D D A D D D D D D D AN5 RE0 A A D D D D D A A A A D D D D AN4 RA5 A A A A D D D A A A A A D D D AN3 RA3 A VREF+ A VREF+ A VREF+ D VREF+ A VREF+ VREF+ VREF+ VREF+ D VREF+ AN2 RA2 A A A A D D D AN1 RA1 A A A A A A D A A A A A A D D AN0 RA0 A A A A A A D A A A A A A A A

VREFA A VREFVREFVREFD VREF-

Microcontroladores PIC

©ATE-Universidad de Oviedo

8

Módulo de Conversión A/D

Registro ADCON1 (9Fh)
ADFM ADCS2 PCFG3 PCFG2

caso de los PIC16F87xA

PCFG1

PCFG0

bit 7 bit 6 bit 3-0

ADFM: Selección de formato del resultado ADCS2: Selección de reloj para conversión A/D junto con ADCS1 y ADCS0 PCFG3:PCFG0: Configuración de las entradas al módulo A/D
PCFG3: AN7 PCFG0 RE2 0000 0001 0010 0011 0100 0101 011x 1000 1001 1010 1011 1100 1101 1110 1111 A A D D D D D A D D D D D D D AN6 RE1 A A D D D D D A D D D D D D D AN5 RE0 A A D D D D D A A A A D D D D AN4 RA5 A A A A D D D A A A A A D D D AN3 RA3 A VREF+ A VREF+ A VREF+ D VREF+ A VREF+ VREF+ VREF+ VREF+ D VREF+ AN2 RA2 A A A A D D D AN1 RA1 A A A A A A D A A A A A A D D AN0 RA0 A A A A A A D A A A A A A A A

1 = Ajuste a la derecha

0 = Ajuste a la izquierda

véase carga del registro ADCON0 en PIC16F87xA

VREFA A VREFVREFVREFD VREF-

Microcontroladores PIC

©ATE-Universidad de Oviedo

9

Módulo de Conversión A/D

Registro INTCON (0Bh , 8Bh , 10Bh , 18Bh)
GIE PEIE T0IE INTE RBIE T0IF INTF RBIF

bit 7 bit 6

GIE: Habilitación global de interrupciones PEIE: Habilitación de interrupciones de periféricos

Registro PIE1 (8Ch)
PSPIE ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE

bit 6

ADIE: Habilitación de la interrupción del convertidor A/D

Registro PIR1 (0Ch)
PSPIF ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF

bit 6

ADIF: Flag de la interrupción del convertidor A/D
1 = Conversión A/D completada. 0 = Conversión A/D aún no completada. 10

Microcontroladores PIC

©ATE-Universidad de Oviedo

Módulo de Conversión A/D

Pasos en una conversión A/D
1. Configurar el módulo A/D.
Definir entradas analógicas y tensión de referencia. Seleccionar el canal de la conversión. (ADCON0) Seleccionar el reloj de la conversión. (ADCON0) Encender el módulo A/D. (ADCON0)
(ADCON1)

2. Configurar la interrupción por conversión A/D. - Bajar el flag ADIF. (PIR1)

- Habilitar la interrupción del convertidor A/D. - Habilitar las interrupciones de los periféricos. - Habilitar la máscara global de interrupciones.

(PIE1) (INTCON) (INTCON)

3. Esperar a que transcurra el tiempo de adquisición.

- Tiempo necesario para capturar el valor analógico a convertir. - Los valores típicos del tiempo de adquisición son del orden de 20µs.
©ATE-Universidad de Oviedo

Microcontroladores PIC

11

Módulo de Conversión A/D

4. Comenzar la conversión.

- Poner a “1” el bit GO/DONE.

(ADCON0) No activar este bit a la vez que se enciende el convertidor A/D

5. Esperar a que se complete la conversión A/D.

a) Controlando cuándo el bit GO/DONE se pone a “0”. b) Esperando a que llegue la interrupción del convertidor. - Disponible en los registros ADRESH:ADRESL. - Bajar el flag ADIF si se están usando interrupciones.

6. Leer el resultado de la conversión.

7. Llevar a cabo la siguiente conversión.
- Volver al paso 1 ó 2, según convenga. - Espera mínima antes de empezar la siguiente adquisición: 2·TAD (Esta espera no es necesaria en el caso de los PIC16F87xA porque el interruptor de captura se “cierra” en cuanto se obtiene el resultado)
TAD: Tiempo necesario para la conversión de un bit.
Microcontroladores PIC ©ATE-Universidad de Oviedo

12

Módulo de Conversión A/D

Tiempo necesario para cargar el condensador de mantenimiento (CHOLD).
VDD

Tiempo de adquisición

RS VA

ANX CPIN 5pF

RIC ≤ 1K IFUGAS ±500nA

SS

RSS CHOLD 120pF VSS

En estas condiciones, TACQ=Amplifier Settling Time +Hold Capacitor Charging Time +Temperature Coefficient =TAMP + TC + TCOFF =2µs + TC + [(Temperature -25°C)(0.05µs/°C)] TC = - CHOLD (RIC + RSS + RS) Ln(1/2047) = -120pF (1k. + 7k. + 10k.) Ln(0.0004885) = 16.47µs TACQ=2µs + 16.47µs + [(50°C -25°C)(0.05µs/°C) = 19.72µs ≈ 20µs

Máxima impedancia recomendada para la fuente: Rs<10K.

Hasta que no acabe la conversión, no empieza otra adquisición (SS abierto)
Esperar TACQ : a) tras una conversión; b) tras seleccionar un nuevo canal; c) tras encender el módulo A/D.
©ATE-Universidad de Oviedo

Microcontroladores PIC

13

Módulo de Conversión A/D

Tiempo de conversión
La conversión de 10 bits dura 12·TAD.
Tciclo ÷ TAD TAD TAD b9 TAD b8 TAD b7 TAD b6 TAD b5 TAD b4 TAD b3 TAD b2 TAD b1 TAD b0

Comienza la conversión Se abre SS (típ. 100ns) GO/DONE ← 1

Se carga ADRES Se pone GO/DONE a “0” Se levanta el flag ADIF CHOLD conectado a entrada analógica

TAD configurable en ADCON0 (reloj de la conversión).

TAD=2·TOSC - TAD=8·TOSC - TAD=32·TOSC - TAD=2µs÷6µs (típ. 4µs) También TAD=4·TOSC - TAD=16·TOSC - TAD=64·TOSC en PIC16F87xA

Para un funcionamiento correcto se necesita un valor mínimo de TAD=1,6µs.
Microcontroladores PIC ©ATE-Universidad de Oviedo

14

Módulo de Conversión A/D

Tiempo de conversión y Tiempo de adquisición
Fijo: 12 TAD
El interruptor de muestreo se “abre” al cabo de 100ns de GO=1 Fin de conversión

caso de los PIC16F87x y en versiones “antiguas”

2 TAD

Depende de Rs externa
Interruptor de muestreo cerrado para “alcanzar” el nuevo valor a convertir

T. de conversión

T. de adquisición

GO/DONE ← 0
Interruptor abierto Inicio de conversión Interruptor cerrado

A partir de aquí es posible una nueva conversión

GO/DONE ← 1 SS RSS CHOLD VSS
CONDICIÓN a cumplir: Int. abierto Int. cerrado t

SS RSS

CHOLD VSS

T muestreo > T conversión + 2TAD +T adquisición

Desde el fin de conversión hasta que se vuelve a cerrar el interruptor transcurren 2TAD 15

Microcontroladores PIC

©ATE-Universidad de Oviedo

Módulo de Conversión A/D

Tiempo de conversión y Tiempo de adquisición
Fijo: 12 TAD
El interruptor de muestreo se “abre” al cabo de 100ns de GO=1

caso de los PIC16F87xA

Depende de Rs externa
Interruptor de muestreo cerrado para “alcanzar” el nuevo valor a convertir

T. de conversión

T. de adquisición

SS

RSS CHOLD VSS
Fin de conversión: Se cargan ADRESH:ADRESL Se pone GO/DONE a “0” Se levanta el flag ADIF

SS

RSS CHOLD VSS
V analógica

A partir de aquí se podría lanzar una nueva conversión porque ya se ha alcanzado el valor de la tensión a convertir

Inicio de conversión

GO/DONE ← 1
CONDICIÓN a cumplir:

V condensador t t. conversión t. adquisición

T muestreo > T conversión + T adquisición

Microcontroladores PIC

©ATE-Universidad de Oviedo

16

Módulo de Conversión A/D

Ejemplo: Configuración para conversión de la tensión analógica presente en el canal 3 (RA3/AN3)…

Registro ADCON1 (9Fh)
ADFM 1 PCFG3 0 PCFG2 0 PCFG1 1 PCFG0 0

bit 7 bit 3-0

ADFM: Selección de formato del resultado
1 = Ajuste a la derecha
PCFG3: AN7 PCFG0 RE2 0000 0001 0010 0011 0100 0101 011x 1000 1001 1010 1011 1100 1101 1110 1111 A A D D D D D A D D D D D D D AN6 RE1 A A D D D D D A D D D D D D D AN5 RE0 A A D D D D D A A A A D D D D AN4 RA5 A A A A D D D A A A A A D D D

0 = Ajuste a la izquierda
AN3 RA3 A VREF+ A VREF+ A VREF+ D VREF+ A VREF+ VREF+ VREF+ VREF+ D VREF+ AN2 RA2 A A A A D D D AN1 RA1 A A A A A A D A A A A A A D D AN0 RA0 A A A A A A D A A A A A A A A

PCFG3:PCFG0: Configuración de las entradas al módulo A/D

VREFA A VREFVREFVREFD VREF-

Microcontroladores PIC

©ATE-Universidad de Oviedo

17

Módulo de Conversión A/D

Registro ADCON0 (1Fh)
… y reloj TAD a partir de la red RC interna ADCS1 1 ADCS0 1 CHS2 0 CHS1 1 CHS0 1 GO/DONE 0 ADON 1

bit 7-6

ADCS1:ADCS0: Selección del reloj para la conversión A/D
00 = fOSC / 2 01 = fOSC / 8 10 = fOSC / 32 11 = fRC

bit 5-3

CHS2:CHS0: Selección del canal de conversión
000 = Canal 0 100 = Canal 4 001 = Canal 1 101 = Canal 5 010 = Canal 2 110 = Canal 6 011 = Canal 3 111 = Canal 7

bit 2

GO/DONE: Estado de la conversión
Si ADON=1: 1 = Conversión en progreso 0 = Conversión finalizada

bit 0

ADON: Bit de encendido del convertidor A/D
1 = Módulo A/D encendido 0 = Módulo A/D apagado 18

Microcontroladores PIC

©ATE-Universidad de Oviedo

Módulo de Conversión A/D

Módulo A/D cuando el micro entra en modo dormido (SLEEP)
* El módulo A/D puede funcionar durante el modo dormido si se selecciona como reloj para la conversión el RC interno (ADCS1:ADCS0 = 11). * Si se elige como reloj el RC, el módulo A/D espera 1 ciclo de instrucción antes de iniciar la conversión. Esto permitiría la ejecución de la instrucción SLEEP que se coloque a continuación, esto eliminaría todo posible ruido de conmutación (debido al paso de normal a dormido) durante la conversión. * Cuando se haya completado la conversión, el bit GO/DONE se pondrá a “0” y el resultado se cargará en los registros ADRESH y ADRESL. Si la interrupción del conversor A/D está habilitada (ADIE y PEIE a “1”) el dispositivo se “despertará”. Si no estuviera habilitada, el módulo A/D se apagará aunque el bit ADON siga a “1”. * Si la fuente de reloj para la conversión no es la RC interna, una instrucción SLEEP provocará que la conversión que se esté ejecutando se aborte y que el módulo A/D se apague aunque el bit ADON siga a “1”.
Microcontroladores PIC ©ATE-Universidad de Oviedo

19

Módulo de Conversión A/D

Efectos de un RESET sobre el módulo A/D
Un RESET del dispositivo provoca que los registros del módulo A/D se inicialicen a los valores indicados en la tabla. Por tanto, un RESET provoca que el módulo A/D se apague y que cualquier conversión que se estuviera realizando cuando se produce el RESET se aborte. Todos los pines asociados al módulo A/D pasan a ser entradas analógicas. Los valores acumulados en ADRESH:ADRESL no se modifican por un Power-On-Reset. El valor que contendrán los registros ADRESH:ADRESL tras un POR serán desconocidos inicialmente.

Microcontroladores PIC

©ATE-Universidad de Oviedo

20

Módulo de Conversión A/D

Ejemplo sencillo de uso del modulo A/D (1 solo canal e interrupciones)
; ; ; ; ; ; ; ; ; ; ; ; ; ; Este es un programa ejemplo de uso del conversor A/D en un PIC16F877, donde se usa un solo canal (CH0) y se usan interrupciones El conversor A/D se configura como sigue: Vref = +5V interna. A/D Osc. = RC interna Canal A/D = CH0 Se puede usar como Hardware para probar este ejemplo la tarjeta PICDEM 2. El programa convierte el valor del potenciometro conectado a RA0 en 10 bits, de los que los 8 bits más significativos se muestran en los leds conectados al PORTB. include <P16F877.INC> equ 20h ORG goto ; Variable de almacenamiento temporal 0x00 start ; Vector de Reset ; Rutina de interrupción A/D: ; muestra valor en los leds del PORTB service_int btfss PIR1,ADIF retfie movf ADRESH,W movwf PORTB bcf PIR1,ADIF call SetupDelay call SetupDelay bsf ADCON0,GO retfie ; ¿Interrupcion del modulo A/D? ; Si no retornamos ; Cojo los 8 bits altos de la conversión ; los muestro en los LEDS del PORTB ; Reseteo el flag ; Delay de adquisición ; mayor de 20 us ; lanzo una nueva conversión ; retorno, habilito GIE

; TEMP ; ; ; ; ; start

org 0x04 ; Vector de interrupción goto service_int org 0x10 movlw 0FFh movwf PORTB bsf STATUS,RP0 movwf TRISA clrf TRISB bcf STATUS,RP0 call InitializeAD call SetupDelay bsf ADCON0,GO goto loop

; PORTB = 11111111b ; Banco 1 ; PORTA son entradas ; PORTB son salida ; Banco 0 ; Delay para Tad ; Inicia conversión A/D

; InitializeAD, inicializa el modulo A/D. ; Selecciona CH0 a CH3 como entradas analógicas, reloj RC y lee el CH0. ; InitializeAD bsf STATUS,RP0 ; Banco 1 movlw B'00000100' ; RA0,RA1,RA3 entradas analogicas movwf ADCON1 ; Justificado a la izquierda ; 8 bits mas significativos en ADRESH bsf PIE1,ADIE ; Habilitamos interrupciones A/D bcf STATUS,RP0 ; Banco 0 movlw b’11000001’ ; Oscilador RC, Entrada analógica CH0 movwf ADCON0 ; Modulo A/D en funcionamiento bcf PIR1,ADIF ; Limpio flag interrupción bsf INTCON,PEIE ; Habilito interrupciones de perifericos bsf INTCON,GIE ; Habilito interrupciones globales return ; Esta rutina es un retardo software de más de 10us si ; se usa un oscilador de 4MHz que se usa para asegurar ; un tiempo de adquisición de más de 20 us mediante una doble llamada ; antes de lanzar una nueva conversión. SetupDelay SD movlw 3 movwf TEMP decfsz TEMP, F goto SD return END ; Carga Temp con 3 ; Bucle de retardo

loop ;

Microcontroladores PIC

©ATE-Universidad de Oviedo

21

Módulo de Conversión A/D

Ejemplo de uso del módulo A/D (conversión de 8 canales secuencialmente) (1)
;************************************************************************** ; ; Programa de ejemplo de manejo del conversor A/D ; para realización de conversiones secuenciales de los 8 canales ; analógicos disponibles en un PIC16F877 y almacenamiento de los ; resultados de la conversión en una pila circular de 16 posiciones ; (dos para cada canal) ; Se supone una Fosc de 8 MHz ; ; Autor: Francisco Fernandez Linera ; ;************************************************************************** list p=PIC16F877 include "p16f877.inc" TEMP ADTABLE EQU EQU ORG goto bsf movlw movwf 0x20 0x30 0x00 START STATUS,RP0 ; Pasamos al Banco 1 b'10000000' ; Definimos todos los pines como analógicos ADCON1 ; referencia de 5V ; y resultado ajustado a la derecha ; 8 bits menos significativos en ADRESL ; 2 bits más significativos en ADRESH STATUS,RP0 ; Volvemos al Banco 0 b'10000001' ; Oscilador: Tad=32*Tosc=4us, A/D encendido ADCON0 ; y seleccion inicial en RA<0> (canal CH0) ;Definimos MCU a utilizar ;Incluimos fichero de etiquetas ; posición auxiliar temporal ; posicion inicial de la pila para guardar resultados de lasconversiones

; START

bcf movlw movwf

Microcontroladores PIC

©ATE-Universidad de Oviedo

22

Módulo de Conversión A/D

Ejemplo de uso del modulo A/D (conversión de 8 canales secuencialmente) (2)
movlw movwf new_ad call bsf LOOP btfsc goto ADTABLE FSR delay_adq ADCON0,GO ADCON0,GO_DONE LOOP ; colocamos el puntero del dir. indirecto (FSR) ; apuntando a la primera posicion de la tabla ; espero el tiempo de adquisicion ; lanzo una conversión ; espero a que finalice la conversión

bsf STATUS,RP0 ; guardo el resultado de la conversión en la pila movf ADRESL,W ; primero los 8 bits menos significativos movwf INDF ; que están en ADRESL (en el banco 1) incf FSR ; Se incrementa el puntero de direcciones RAM bcf STATUS,RP0 ; Volvemos al banco 0 movf ADRESH,W ; para recoger ahora los 2 bits más significativos movwf INDF ; los guardamos en la siguiente posición apuntada por FSR incf FSR ; incrementamos de nuevo FSR movlw 0x08 ; Incrementamos el número de canal a convertir addwf ADCON0 ; para lo cual sumamos 1 al bit 3 de ADCON0 btfss ADCON0,6 ; miro si ya he convertido los 8 canales, el bit 6 sería 1 goto new_ad ; si no convierto otro, nueva conversión bcf ADCON0,6 ; en caso contrario, vuelvo a poner Tad=32*Tosc (b6=0) movlw ADTABLE ; de nuevo el puntero del dir. indirecto movwf FSR ; apuntando a la primera posicion de la tabla goto new_ad ; y vuelvo a convertir, empezando por el canal 0 ;*********************************** Temporización del tiempo de adquisición ************************************* delay_adq movlw 8 ; bucle del tiempo de adquisición movwf TEMP ; 18,5 useg incluyendo call y return adq nop ; 1 ciclo decfsz TEMP,F ; decremento y comparación con cero goto adq ; si no hemos llegado a cero, repetimos return ; si ya llegamos a cero, retornamos

Microcontroladores PIC

©ATE-Universidad de Oviedo

23