Escolar Documentos
Profissional Documentos
Cultura Documentos
81
2. Configurar la interrupcin A/D (opcional). 3. Iniciar la conversin. 4. Esperar a que termine de convertir, ya sea: Por medio de sondeo del bit GO/DONE. Esperando que se genere una interrupcin.
ADC
82
Por ejemplo si queremos usar solo el Canal0 (AN0) podemos configurarlo como analgico de la siguiente manera: ADCON1bits |= 14;
ADC
83
Por ejemplo si se desean usar los pines VREF+ y VREF- como voltajes de referencia y el canal 0 como entrada analgica se puede hacer de la siguiente manera: ADCON1bits = 0x3E;
ADC
84
ADC
85
= 1.33s
ADCON2 = 0x8E;
El ltimo bit del registro ADCON2 (ADFM) se usa para configurar la alineacin del resultado. Como el resultado de la digitalizacin es de 10 bits, este se almacena en 2 registros: ADRESL (parte baja) y ADRESH (parte alta), de tal manera que con el bit ADFM configuramos si queremos que el resultado quede justificado a la izquierda o justificado a la derecha.
ADC
86
ADC
Tabla 7-1. Funciones de la librera adc.h [7]
87
La funcin BusyADC regresa un valor entero indicando si el ADC est ocupado realizando una conversin (regresa 1) o si no est ocupado (regresa 0).
La funcin ConvertADC inicia una conversin, previamente se debe activar y configurar el mdulo por medio de la funcin OpenADC. Para saber si ya termino de convertir, podemos usar la funcin BusyADC o bien esperar que se genere una interrupcin.
La funcin SetChanADC se usa para seleccionar o cambiar el canal de entrada a digitalizar. Ejemplo:
SetChanADC( ADC_CH0 );
ADC
88
ADC
89
Figura 7-8. Prueba de ADC /* Uso del mdulo ADC * Se programa el Timer0 para producir una interrupcin cada 100ms * en la cual se realiza una conversin del ADC y se muestra en LCD */ #include <p18cxxx.h> #include <timers.h> #include <adc.h> #include <stdlib.h> #include "lcd.h" /** REMAPEO PARA BOOTLOADER **/ extern void _startup (void); #pragma code REMAPPED_RESET_VECTOR = 0x1000 void _reset (void) { _asm goto _startup _endasm
ADC
} **/
90
// Prototipos de funcin de interrupcin void rsi_tmr0(void); // Variables Globales #pragma udata int valorADC; char strADC[7]; char strClean[] = "
";
// Inicio de programa #pragma code void main() { char cadena[] = "Probando ADC"; // configura LCD OpenLCD( FOUR_BIT & LINES_5X7); //Envia cadena "Probando LCD" putsLCD(cadena); // Activa timer0 de 16 bits, conteo de Tcy con prescaler de 1:64 OpenTimer0 (TIMER_INT_ON & T0_SOURCE_INT & T0_16BIT & T0_PS_1_64); WriteTimer0(0xB6C2); // Configura y activa el mdulo ADC OpenADC( ADC_FOSC_64 & // TAD = FOSC/64 ADC_RIGHT_JUST & // Resultado justificado a la derecha ADC_2_TAD, // Tiempo de adq 2 TAD ADC_CH0 & // Selecciona Canal0 (AN0) ADC_INT_OFF & // Sin interrupcin de ADC ADC_VREFPLUS_VDD & // Referencia+ VDD ADC_VREFMINUS_VSS, // Referencia- VSS 14 ); // AN0 como pin analgico // Habilitacin global de interrupciones INTCONbits.GIE = 1; while(1) { } }
// Vector de Interrupcin #pragma code high_vector=0x1008 void high_interrupt (void) { _asm GOTO rsi_tmr0 _endasm }
ADC
91
#pragma code /****** RSI de TIMER0 *****/ #pragma interrupt rsi_tmr0 void rsi_tmr0 (void) { ConvertADC(); // Inicia conversin // Espera a que termine de convertir while(BusyADC()); valorADC = ReadADC(); // Lee resultado de ADC // Convierte resultado a cadena itoa(valorADC,strADC); // Envia cadena a display LCD SetDDRamAddr(0x40); putsLCD(strADC); putsLCD(strClean); // Reinicia el Timer0 WriteTimer0(0xB6C2); // Limpia la bandera de interrupcin INTCONbits.TMR0IF = 0; } Programa 7-1. Uso de ADC
ADC
92
Precisin de ~1,5C (en el peor caso), 0.5C garantizados a 25C. No linealidad de ~0,5C (peor caso). Baja corriente de alimentacin (60uA). Amplio rango de funcionamiento (desde -55 a + 150C). Bajo costo. Baja impedancia de salida.
El voltaje de salida es proporcional a la temperatura, en la escala Celsius. No necesita calibracin externa y es de bajo costo. Funciona en el rango de alimentacin comprendido entre 4 y 20 voltios.
ADC
93
Como ventaja adicional, el LM35 no requiere de circuitos adicionales para su calibracin externa cuando se desea obtener una precisin del orden de 0.25 C a temperatura ambiente, y 0.75 C en un rango de temperatura desde 55 a 150 C. La baja impedancia de salida, su salida lineal y su precisa calibracin inherente hace posible una fcil instalacin en un circuito de control.