.::USANDO EL ADC::.

MATPIC.COM

USANDO EL ADC

USANDO EL ADC

 

La conversión analógica-digital (CAD) consiste en la transcripción de señales analógicas en señales digitales, con el propósito de facilitar suprocesamiento (codificación, compresión, etc.) y hacer la señal resultante (la digital) más inmune al ruido y otras interferencias a las que son más sensibles las señales analógicas.

Para esta práctica se usará el PIC16F870 y un sensor de temperatura LM35. El resultado de la temperatura medida se mostrará en un LCD de 16x2.

Para el caso de los PICs, es necesario asignar ciertos valores a un par de registros.

ADCON0: controla la operación del módulo A/D.

ADCON1: configuración de las funciones de los pines de los puertos del A/D (analógicos o digitales, uso o no de voltaje de referencia externo). Por ejemplo:

ADCON0 = %11000001 significa:

ADCON1 = %00001110 significa:

Bit 7-6: clock del ADC es RC.

Bit 5-3: canal analógico 0. (AN0.)

Bit 2: bit de estado de conversión. 0 significa que la conversión no está en progreso.

Bit 1: no se usa.

Bit 0: 1 significa inicio de operación del módulo A/D.

Bit 7: 1 es justificación a la izquierda.

Bit 6-4: no se usan.

Bit 3-0: solo un canal analógico, V de referencia + es VDD y V de referencia – es VSS.

La función del compilador que lee el dato del pin de ADC es ADCIN, cuya sintaxis es:

ADCIN canal, variable

Antes de usar esta función, es necesario asignar la dirección de los pines de entrada analógica con la función TRIS.

 

Varios DEFINEs pueden también ser utilizados. Los valores por defecto se muestran abajo:

DEFINE ADC_BITS 8 ' Fije el número de BITS en el resultado (8, 10 o 12)

DEFINE ADC_CLOCK 3 'Fije EL CLOCK (RC = 3)

DEFINE ADC_SAMPLEUS 50 ' Fije el tiempo de muestreo en microsegundos

Para el caso de la resolución del ADC, se usa la siguiente fórmula:

Para el caso de trabajar con 8 bits y un voltaje de 5 voltios como referencia se tendrá:

Es decir, el ADC irá de 0 V a 5 V con pasos de 19.53 mV.

El valor leído por ADCIN (para el caso de 8 bits irá de 0 a 255 y para el caso de 10 bits irá de 0 a 1024) debe ser multiplicado por la resolución para obtener el valor analógico que se está leyendo. Por ejemplo:

Valor = ADCIN x ADC_resolución

Veamos un ejemplo usando 8 bits y un voltaje de referencia de 5 V:

' DEFINICIÓN DE REGISTROS PARA EL LCD

DEFINE LCD_DREG PORTB 'UTILIZAR 4 BITS DEL PUERTO B PARA TX DE DATOS

DEFINE LCD_DBIT 4     'DESDE EL BIT B.4 AL BIT B.7

DEFINE LCD_RSREG PORTB'UTILIZAR EL REGISTRO  DE CONTROL/DATOS EN EL PUERTO D

DEFINE LCD_RSBIT 1    'EN EL BIT B.1

DEFINE LCD_EREG PORTB 'UTILIZAR EL ENABLE EN EL PUERTO B

DEFINE LCD_EBIT 2     'EN EL BIT B.2

DEFINE OSC 4

; PARÁMETROS DEL ADC

DEFINE ADC_BITS 8 ; NÚMERO DE BITS

DEFINE ADC_CLOCK 3 ; USAR CLOCK INTERNO DEL AD

DEFINE ADC_SAMPLEUS 50 ; TIEMPO DE MUESTREO EN 50US

; VARIABLES

RES VAR WORD ; RESULTADO DE LA CONVERSIÓN

TEMP1 VAR BYTE ; TEMPERATURA C

TRISA = 1 ; RA0 (AN0) COMO ENTRADA

TRISB = 0 ; PORTB SALIDA (ADC)

PAUSE 500 ; PAUSA DE INICIALIZACIÓN DEL LCD

; INICIAR CONVERSIÓN A/D

ADCON1 = %00001110 ; ESTABLECER SOLO UN CANAL COMO ANALÓGICO

; VOLTAJE DE REFERENCIA ES VDD

ADCON0 = %11000001 ; RELOJ DEL A/D, SELECCIONA CANAL AN0

; INICIAR EL A/D

LCDOUT $FE, 1 ; BORRAR LCD

INICIO:

; INICIAR CONVERSIÓN

  ADCIN 0, RES ; LEER EL CANAL A0

  TEMP1 = 2 * RES ;2 VIENE DE->19.53

  LCDOUT $FE,2,"TEMP = ",DEC TEMP1,$DF,"C" ; MOSTRAR RESULTADO  

  PAUSE 500 ; PAUSA 0.5 SEGUNDOS

  GOTO INICIO

END

Figura 1. ADC de 8 bits.

Nótese en el código que TEMP1 = 2 * RES significa que se redondea el valor de 19.53 a 2.

Trabajando con el ADC de 10 bits tenemos la siguiente resolución:

Es decir, irá de 0 V a 5 V con pasos de 4.88 mV. ADCIN irá en este caso de 0 (0 voltios leídos) a 1024 (5 voltios leídos).

Usando 10 bits de resolución se puede usar una lectura decimal de la temperatura:

' DEFINICIÓN DE REGISTROS PARA EL LCD

DEFINE LCD_DREG PORTB 'UTILIZAR 4 BITS DEL PUERTO B PARA TX DE DATOS

DEFINE LCD_DBIT 4     'DESDE EL BIT B.4 AL BIT B.7

DEFINE LCD_RSREG PORTB'UTILIZAR EL REGISTRO  DE CONTROL/DATOS EN EL PUERTO D

DEFINE LCD_RSBIT 1    'EN EL BIT B.1

DEFINE LCD_EREG PORTB 'UTILIZAR EL ENABLE EN EL PUERTO B

DEFINE LCD_EBIT 2     'EN EL BIT B.2

DEFINE OSC 4

; PARÁMETROS DEL ADC

DEFINE ADC_BITS 10 ; NÚMERO DE BITS

DEFINE ADC_CLOCK 3 ; USAR CLOCK RC DEL AD

DEFINE ADC_SAMPLEUS 50 ; TIEMPO DE MUESTREO EN 50US

; VARIABLES

RES VAR WORD ; RESULTADO DE LA CONVERSIÓN

VAL VAR WORD

TEMP1 VAR byte ; TEMPERATURA C

TRISA = 1 ; RA0 (AN0) COMO ENTRADA

TRISB = 0 ; PORTB SALIDA (ADC)

PAUSE 500 ; PAUSA DE INICIALIZACIÓN DEL LCD

; INICIAR CONVERSIÓN A/D

ADCON1 = %10001110 ; ESTABLECER SOLO UN CANAL COMO ANALÓGICO

; VOLTAJE DE REFERENCIA ES VDD

ADCON0 = %11000001 ; RELOJ DEL A/D, SELECCIONA AN0

; INICIAR EL A/D

LCDOUT $FE, 1 ; BORRAR LCD

INICIO:

; INICIAR CONVERSIÓN

  ADCIN 0, RES ; LEER EL CANAL A

  TEMP1 = 488 * RES ; 1024*488=499712;

  VAL = DIV32 10 

  LCDOUT $FE,1,"TEMP = ",DEC VAL DIG 3,DEC VAL DIG 2,".",DEC VAL DIG 1, DEC VAL DIG 0,$DF,"C" ;

  PAUSE 500 ; PAUSA 0.5 SEGUNDOS

  GOTO INICIO

END

La siguiente figura muestra el código en funcionamiento:

Figura 2. ADC con 10 bits de resolución.

Con un voltaje de referencia externo usando un diodo zener de 2.5 V se tendrá:

Sabiendo que el LM35 da 10 mV por grado centígrado, usando un voltaje de referencia externo nos da una lectura más precisa del valor de la temperatura.

Es necesario definir el registro ADCON1 de esta manera:

ADCON1 = %00001010

De este modo, se establece al pin RA3 (AN3) como el voltaje de referencia positivo a Vss como el voltaje de referencia negativo.

' DEFINICIÓN DE REGISTROS PARA EL LCD

DEFINE LCD_DREG PORTB 'UTILIZAR 4 BITS DEL PUERTO B PARA TX DE DATOS

DEFINE LCD_DBIT 4     'DESDE EL BIT B.4 AL BIT B.7

DEFINE LCD_RSREG PORTB'UTILIZAR EL REGISTRO  DE CONTROL/DATOS EN EL PUERTO D

DEFINE LCD_RSBIT 1    'EN EL BIT B.1

DEFINE LCD_EREG PORTB 'UTILIZAR EL ENABLE EN EL PUERTO B

DEFINE LCD_EBIT 2     'EN EL BIT B.2

DEFINE OSC 4

; PARÁMETROS DEL ADC

DEFINE ADC_BITS 8 ; NÚMERO DE BITS

DEFINE ADC_CLOCK 3 ; USAR CLOCK INTERNO DEL AD

DEFINE ADC_SAMPLEUS 50 ; TIEMPO DE MUESTREO EN 50US

; VARIABLES

RES VAR WORD ; RESULTADO DE LA CONVERSIÓN

TEMP1 VAR BYTE ; TEMPERATURA C

TRISA = 1 ; RA0 (AN0) COMO ENTRADA

TRISB = 0 ; PORTB SALIDA (ADC)

PAUSE 500 ; PAUSA DE INICIALIZACIÓN DEL LCD

; INICIAR CONVERSIÓN A/D

ADCON1 = %00001010 ; ESTABLECER SOLO UN CANAL COMO ANALÓGICO

; VOLTAJE DE REFERENCIA ES RA3

ADCON0 = %11000001 ; RELOJ DEL A/D, SELECCIONA AN0

; INICIAR EL A/D

LCDOUT $FE, 1 ; BORRAR LCD

INICIO:

; INICIAR CONVERSIÓN

  ADCIN 0, RES ; LEER EL CANAL A

  TEMP1 = RES ;2 VIENE DE->19.53

  LCDOUT $FE,2,"TEMP = ",DEC TEMP1,$DF,"C" ; MOSTRAR RESULTADO

  PAUSE 500 ; PAUSA 0.5 SEGUNDOS

  GOTO INICIO

END

El resultado se muestra en la siguiente figura:

Figura 3. ADC con 8 bits de resolución y Vref externo.

Descarga el código de esta simulación:

©2017 MATPIC

Prohibida cualquier copia parcial o total del contenido de esta web