T19 Adc

Download as pdf or txt
Download as pdf or txt
You are on page 1of 11

Tutorial 19 ADC

El módulo ADC dispone de 10 entradas para el PIC18F4550, convirtiendo una señal de


entrada analógica correspondiente a un número digital de 10 bits.

Características:

• Bits de resolución, 10.


• Canales multiplexados, 13.
• Señal de reloj configurable.
• Tiempo de adquisición programable (0 a 20 TAD).
• Rango de voltaje de conversión configurable mediante voltaje de referencia externo.

El módulo tiene cinco registros:

• A / D Registro de resultado alto (ADRESH)


• A / D Registro de resultado bajo (ADRESL)
• A / D Registro de Control 0 (ADCON0)
• A / D Registro de Control 1 (ADCON1)
• A / D Registro de control 2 (ADCON2)

Registro ADCON0: Registro de control A/D 0

bit 7-6 Unimplemented: Read as ‘0’


bit 5-2 CHS3:CHS0: Analog Channel Select bits
0000 = Channel 0 (AN0)
0001 = Channel 1 (AN1)
0010 = Channel 2 (AN2)
0011 = Channel 3 (AN3)
0100 = Channel 4 (AN4)
0101 = Channel 5 (AN5)(1,2)
0110 = Channel 6 (AN6)(1,2)
0111 = Channel 7 (AN7)(1,2)
1000 = Channel 8 (AN8)
1001 = Channel 9 (AN9)
1010 = Channel 10 (AN10)

Dr. Oscar L Pérez Castañeda Microcontroladores 1


1011 = Channel 11 (AN11)
1100 = Channel 12 (AN12)
1101 = Unimplemented(2)
1110 = Unimplemented(2)
1111 = Unimplemented(2)
bit 1 GO/DONE: A/D Conversion Status bit
When ADON = 1:
1 = A/D conversion in progress
0 = A/D Idle
bit 0 ADON: A/D On bit
1 = A/D converter module is enabled
0 = A/D converter module is disabled

Registro ADCON1: Registro de control A/D 1

bit 7-6 Unimplemented: Read as ‘0’


bit 5 VCFG0: Voltage Reference Configuration bit (VREF- source)
1 = VREF- (AN2)
0 = VSS
bit 4 VCFG0: Voltage Reference Configuration bit (VREF+ source)
1 = VREF+ (AN3)
0 = VDD
bit 3-0 PCFG3:PCFG0: A/D Port Configuration Control bits:

Dr. Oscar L Pérez Castañeda Microcontroladores 2


Note 1: The POR value of the PCFG bits depends on the value of the PBADEN Configuration bit. When
PBADEN = 1, PCFG<3:0> = 0000; when PBADEN = 0, PCFG<3:0> = 0111.
2: AN5 through AN7 are available only on 40/44-pin devices.

Registro ADCON2: Registro de control A/D 2

bit 7 ADFM: A/D Result Format Select bit


1 = Right justified
0 = Left justified
bit 6 Unimplemented: Read as ‘0’
bit 5-3 ACQT2:ACQT0: A/D Acquisition Time Select bits
111 = 20 TAD
110 = 16 TAD
101 = 12 TAD
100 = 8 TAD
011 = 6 TAD
010 = 4 TAD
001 = 2 TAD
000 = 0 TAD(1)
bit 2-0 ADCS2:ADCS0: A/D Conversion Clock Select bits
111 = FRC (clock derived from A/D RC oscillator)(1)
110 = FOSC/64
101 = FOSC/16
100 = FOSC/4
011 = FRC (clock derived from A/D RC oscillator)(1)
010 = FOSC/32
001 = FOSC/8
000 = FOSC/2
Note 1: If the A/D FRC clock source is selected, a delay of one T CY
(instruction cycle) is added before the A/D
clock starts. This allows the SLEEP instruction to be executed before
starting a conversion.

Dr. Oscar L Pérez Castañeda Microcontroladores 3


TIEMPO DE ADQUISICIÓN (TAD)
El tiempo para convertir un bit se llama T AD. Según el fabricante, el tiempo de adquisición en
los PIC de gama alta está entre: 0.8 us - 25 us, basado en el periodo del oscilador (T OSC) y
VREF 3 V. TAD = 1 us máximo, basado en módulo RC interno.
Cuando se utiliza el periodo del oscilador, se ve que el tiempo mínimo es 0.8 us. El T AD puede
ser configurado con los bits ACQT2:ACQT0 para obtener diferentes valores del T AD como
se presenta en la tabla 1.

Tabla 1. Configuración del


TAD.

ADCS2:ADCS0: Bits de selección de la señal de reloj del convertidor A/D.

Tabla 2. Selección de
la señal de reloj del ADC.

FRC, en la tabla 2, se refiere que utiliza el módulo del oscilador RC interno y FOSC a la
frecuencia del cristal externo.

Dr. Oscar L Pérez Castañeda Microcontroladores 4


Una forma práctica de obtener TAD y su correspondiente frecuencia de oscilación es mediante
los datos de la tabla 3.

Tabla 3. Relación TAD y frecuencia de oscilación.

Cuando se utiliza el oscilador interno RC, viene prefijado y cumple con el valor mínimo.

Pasos para conversión


1.- Configurar como canales A/D las líneas que vayan a ser utilizadas (bits
PCFG3:PCFG0 del registro ADCON1).
• Configurar los voltajes de referencia VREF+ y VREF- (bits VCFG0 y VCFG1 del
registro ADCON1).
• Configurar el reloj de conversión TAD (bits ADCS2:ADCS0 de registro ADCON2).
• Configurar el tiempo de adquisición (bits ACQT2:ACQT0 del registro ADCON2).
• Configurar el modo de almacenamiento de la conversión (bit ADFM del registro
ADCON2).
2.- Activar del convertidor (bit ADON del registro ADCON0).
3.- Seleccionar el canal (bits CHS3:CHS0 del registro ADCON0).
4.- Generar el retardo de espera del tiempo de adquisición (en caso de no usar el
tiempo de adquisición automático).
5.- Iniciar la conversión poniendo a 1 el bit GO/DONE del registro ADCON0.
6.- Esperar el final de la conversión (comprobación del bit GO/DONE hasta que se
ponga a 0).
7. Leer el resultado de la conversión de los registros ADRESH y ADRESL.
8. Procesar matemáticamente el valor obtenido de la conversión analógica digital.

Dr. Oscar L Pérez Castañeda Microcontroladores 5


Funciones del CCS para el módulo AD
En el compilador CCS las funciones para manejar el convertidor AD son:

• setup_adc(mode); donde mode, configura el módulo del convertidor A/D


correspondientes a los bits 7:6 del registro ADCON0. Los posibles argumentos se
indican en la tabla 4.

Tabla 4. TAD vs. Frecuencias de operación del dispositivo.

• setup_adc_ports(value); value: definición de las entradas analógicas correspondientes


a los bits 3:0 del ADCON1 (ver tabla 2.1).
• set_adc_channel(channel); donde channel, selecciona el canal analógico
correspondiente a los bits 5:2 del registro ADCON0 (ver tabla 2.2).
• Value=read_adc(); lectura del resultado del adc, donde value es un entero de 16 bits.

La directiva utilizada determina el número de bits del ADC. Por ejemplo #device 18F4550,
debe incluir la indicación del número de bits del convertidor, así: #device adc = 10. Esta
directiva trabaja con los datos presentados en la tabla 5.

Tabla 5. Relación directiva y número de bits para el ADC.

read_adc() permite tres modos de funcionamiento:

Dr. Oscar L Pérez Castañeda Microcontroladores 6


Ejemplo 1.
Diseñar un circuito con su correspondiente código, utilizando el PIC18F4550 que muestre el
voltaje de entrada analógico en el pin AN0. El voltaje de entrada debe mostrarse en un LCD.
El voltaje analógico debe variar entre 0-5 V.

Solución
La resolución de un ADC de 10 bits, para un voltaje de referencia de 5V es:

Resolución = VREF/(2n – 1) = 5 / (210 – 1) = 0.004887586

El valor ya convertido se puede obtener con la fórmula:

valor_conversion= valor_leido * Resolución

Programa CCS
#include <18f4550.h>
#device adc = 10 //Define el ADC para 10 bits.
#fuses XT, NOWRT, NOPUT, NOWDT, NOLVP //Configuración de fusibles.
#use delay (clock=4000000) //FOSC = 4MHz.
#include <lcd.c> //Incuye el LCD para mostrar el votaje de entrada.
#include <stdlib.h> //Archivo de cabecera para algunas funciones como printf.
#byte port_b = 0xF81

void main(){
float valor_leido, valor_convertido;
float resolucion;
resolucion = 5/1023; //5V voltaje máximo y 1023porque el ADC es de 10 bits.
set_tris_b(0x00);
port_b = 0x00;
setup_adc_ports(AN0); // Habilita entrada analógica AN0.
setup_adc(ADC_CLOCK_INTERNAL); //Utiliza el reloj interno, 32 KHz para el ADC.
set_adc_channel(0); //Habilita el canal 0 del ADC.

lcd_init(); //Inicializa el LDC.


while(TRUE){
output_low(pin_B0);
delay_ms(100);
output_high(pin_B0);
delay_ms(100);

Dr. Oscar L Pérez Castañeda Microcontroladores 7


valor_leido = read_adc(); //El valor analógico de AN0.
valor_convertido = valor_leido * resolucion;//Convierte el valor analógico leido.
lcd_gotoxy(1,1);
printf(lcd_putc,"ADC = %6.3f", valor_leido);//Muestra el valor digital
lcd_gotoxy(1,2);
printf(lcd_putc,"Voltaje = %6.3f", valor_convertido);//Muestra el valor convertido.
}// Fin del WHILE
}

Diagrama del circuito.

Ejemplo 2.
Diseñar un circuito que lea la temperatura ambiente utilizando el sensor de temperatura
LM35 conectado a un PIC18F4550. La temperatura deberá mostrarse en un LCD en grados
centígrados.

Solución
El sensor de temperatura LM35 es un dispositivo de tres pines (Vcc, OUT y GND) con un
voltaje de salida relacionado linealmente con la temperatura en grados centígrados. La salida
del LM35 tiene un factor de escala lineal +10mV/ºC, de acuerdo a la tabla 6.

Dr. Oscar L Pérez Castañeda Microcontroladores 8


Voltaje de salida Temperatura
(mV) (ºC)
10 1
100 10
200 20
370 37
Tabla 6. Relación de temperatura-voltaje para el LM35.

En la tabla 7 se muestran algunas características del LM35 de acuerdo a su hoja de datos.

• Calibrated Directly in °Celsius (Centigrade)


• Linear + 10 mV/°C Scale Factor
• 0.5°C Ensured Accuracy (at +25°C)
• Rated for Full −55°C to +150°C Range
• Suitable for Remote Applications
• Low Cost Due to Wafer-Level Trimming
• Operates from 4 to 30 V
• Less than 60-μA Current Drain
• Low Self-Heating, 0.08°C in Still Air
• Nonlinearity Only ±¼°C Typical
• Low Impedance Output, 0.1 Ω for 1 mA Load
Tabla 7. Características eléctricas del LM35.

La lectura del ADC da un valor entero entre 0 y 1023 (10 bits de resolución), 0 para 0V y
1023 para 5V. Así que la resolución = 5/1023. Y para obtener el valor de conversión final se
debe considerar el factor de conversión lineal del LM35 que es de 10mV/ °C = 0.01V/°C.
Como la salida del LM35 es del orden de mV, y su factor es de 0.01V/°C, entonces para
obtener el valor de una unidad de voltaje, se debe multiplicar por 100, ya que los valores que
entrega el ADC están en el rango (0-1023) y son enteros más el 0.

Dr. Oscar L Pérez Castañeda Microcontroladores 9


Entonces,
valor_convertido = valor_leido * resolución * 100

5
valor convertido=valor leido∗( ∗100)=valor leido∗0.489
1023

Programa CCS

// Sensor de temperatura LM35 y el PIC18F4550


// Los resultados se muestran en un LCD.

#include <18F4550.h>
#fuses XT, NOWRT, NOPUT, NOWDT, NOLVP //Configuración de fusibles.
#device ADC=10
#use delay(clock = 4MHz)
#include <lcd.c>

char temperatura[] = " 00.0 C"; //Mensaje base del LCD para la temperatura
unsigned int16 valor_leido, valor_convertido;
float resolucion = 0.00489; // 5/1023
float ajuste_FC = 100;//Ajuste del Factor de Conversión, ya que el FC= 0.01 LM35
void main(){
setup_adc(ADC_CLOCK_INTERNAL);// Reloj del ADC interno.
setup_adc_ports(AN0); // Configura el pin AN0 como entrada analógica
set_adc_channel(0); // Selecciona el canal 0 (AN0)
lcd_init(); // Inicializa el LCD
lcd_putc('\f'); // Limpia el LCD
lcd_gotoxy(3, 1); // Posiciona el cursor del LCD en la columna 3 renglón 1
printf(lcd_putc, "Temperatura:");
temperatura[5] = 223; // Esribe el símbolo de grados (°)
while(TRUE){
delay_ms(1000);
valor_leido = read_adc();//Lee la entrada AN0 analógica, salida del LM35.
valor_convertido = valor_leido * resolucion * ajuste_FC; //Conversión
if (valor_convertido > 99)
temperatura[0] = 1 + 48; // La unidad de las centenas
else
temperatura[0] = ' '; // El espacio en blanco en el lugar de las centenas.
temperatura[1] = (valor_convertido / 10) % 10 + 48; //El dígito de las decenas
temperatura[2] = valor_convertido % 10 + 48; //Dígito de las unidades

Dr. Oscar L Pérez Castañeda Microcontroladores 10


lcd_gotoxy(5, 2); // Posiciona el cursor del LCD en la columna 5 renglón 2
printf(lcd_putc, temperatura); // Escribe en el LCD el resultado
}
}

Diagrama del circuito

Dr. Oscar L Pérez Castañeda Microcontroladores 11

You might also like