T19 Adc
T19 Adc
T19 Adc
Características:
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.
Cuando se utiliza el oscilador interno RC, viene prefijado y cumple con el valor mínimo.
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.
Solución
La resolución de un ADC de 10 bits, para un voltaje de referencia de 5V es:
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.
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.
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.
5
valor convertido=valor leido∗( ∗100)=valor leido∗0.489
1023
Programa CCS
#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