81 7 CONVERTIDOR ANALÓGICO DIGITAL La familia PIC18 USB posee un convertidor Analógico Digital de 10 bits con 10 entradas en dispositivos de 28 pines y 13 entradas en dispositivos de 40/44 pines. Los siguientes pasos se deben seguir para realizar una conversión A/D: 1. Configurar el módulo: Configurar pines analógicos. Configurar voltajes de referencia. Seleccionar el canal a muestrear: Canal0(AN0) a Canal12(AN12). Ajustar el reloj de conversión (T AD ). Ajustar el tiempo de adquisición. Activar el módulo A/D. 2. Configurar la interrupción A/D (opcional). 3. Iniciar la conversión. 4. Esperar a que termine de convertir, ya sea: Por medio de sondeo del bit GO/DONE. Esperando que se genere una interrupción. 5. Leer el resultado del A/D 6. Repetir el procedimiento para la siguiente conversión. Veamos más a detalle cada uno de estos pasos. 7.1 Configurar el módulo 7.1.1 Configurar pines analógicos Como ya se explicó anteriormente, los pines denominados ANx, pueden ser analógicos o pueden ser digitales. Si queremos usar un pin ANx como canal del ADC debemos configurarlo como entrada en su respectivo pin TRIS y como analógico usando los bits PCFG del registro ADCON1 (Figura 7-1), de acuerdo a la Figura 7-2.
82 Figura 7-1. Registro ADCON1 [8] Por ejemplo si queremos usar solo el Canal0 (AN0) podemos configurarlo como analógico de la siguiente manera: ADCON1bits = 14; Figura 7-2. Configuración de pines ANx [8]
83 7.1.2 Configurar voltajes de referencia Una conversión A/D siempre se hace usando un voltaje como referencia. Los PIC18 permiten seleccionar entre 2 voltajes de referencia distintos: 1. La alimentación positiva y negativa (V DD y V SS ). 2. El voltaje en los pines V REF+ (RA3/AN3) y V REF- (RA2/AN2). Esta selección se hace por medio de los bits VCFG del registro ADCON1 (Figura 7-1), de acuerdo a la Figura 7-3. Figura 7-3. Voltajes de referencia Por ejemplo si se desean usar los pines V REF+ y V REF- como voltajes de referencia y el canal 0 como entrada analógica se puede hacer de la siguiente manera: ADCON1bits = 0x3E; 7.1.3 Seleccionar el canal a muestrear El ADC tiene hasta 13 entradas analógicas pero solamente una se puede usar a la vez, entonces debemos especificar que Canal vamos a digitalizar. Para configurar esto, se usan los bits CHS3-CHS0 del registro ADCON0 como se muestra en la Figura 7-4. Siguiendo con el ejemplo anterior, si queremos digitalizar el canal0 (previamente ya se configuró como entrada analógica AN0) podemos configurarlo de la siguiente manera: ADCON0 = 0; En la Figura 7-5 se muestra un diagrama del módulo ADC resaltando los canales de entrada.
84 Figura 7-4. Selección del canal a muestrear [8] Figura 7-5. Modulo ADC [8]
85 7.1.4 Ajustar el reloj de conversión (T AD ) El proceso completo de digitalización de un voltaje analógico consiste de 2 pasos: la adquisición (muestreo) y la conversión. La adquisición toma un tiempo para que se cargue un capacitor que mantiene el voltaje constante durante el proceso de conversión. El proceso de conversión tiene una duración de 11 periodos del ADC denominados T AD, de acuerdo al fabricante T AD debe durar mínimo 0.7µs y máximo 25µs. Esta duración debe ser especificada en el programa. La duración de T AD se configura en los bits ADCS2-ADCS0 del registro ADCON2, vea la Figura 7-6. Para una frecuencia de oscilación de 48MHz configurar los bits ADCS2-ADCS0 en F OSC /64 para dar un T AD de 48 10 64 6 1 = 1.33µ s 7.1.5 Seleccionar el tiempo de adquisición El tiempo de adquisición también se debe configurar en función de T AD, el fabricante especifica que el tiempo de adquisición debe ser mínimo 2.45µs. Este tiempo de adquisición se configura en los bits ACQT2-ACQT0 del registro ADCON2 (Figura 7-6). Por ejemplo para que la adquisición dure 2 T AD y configuramos T AD como se menciona en el tema anterior, sería: ADCON2 = 0x8E; El último bit del registro ADCON2 (ADFM) se usa para configurar la alineación del resultado. Como el resultado de la digitalización 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.
86 7.1.6 Activar el módulo A/D El módulo ADC se activa por medio del bit ADON del registro ADCON0: ADCON0bits.ADON = 1; // módulo activado, listo para iniciar Figura 7-6. Registro ADCON2 [8] 7.2 Funciones para uso del ADC El lenguaje C18 de Microchip proporciona las funciones necesarias para la configuración y el uso del ADC de los PIC18. En la Tabla 7-1 se muestran estas funciones y una breve descripción.
87 Tabla 7-1. Funciones de la librería adc.h [7] La función BusyADC regresa un valor entero indicando si el ADC está ocupado realizando una conversión (regresa 1) o si no está ocupado (regresa 0). La función CloseADC se usa para deshabilitar el módulo ADC y la interrupción asociada. La función ConvertADC inicia una conversión, previamente se debe activar y configurar el módulo por medio de la función OpenADC. Para saber si ya termino de convertir, podemos usar la función BusyADC o bien esperar que se genere una interrupción. La función ReadADC regresa el valor digital resultado de la conversión en un tipo int. La función SetChanADC se usa para seleccionar o cambiar el canal de entrada a digitalizar. Ejemplo: SetChanADC( ADC_CH0 ); 7.2.1 Función OpenADC Esta función es la más compleja, ya que recibe muchos parámetros de entrada para configurar todo lo antes explicado. La Figura 7-7 muestra el prototipo y los argumentos de la función OpenADC.
88 Figura 7-7. Función OpenADC [7]
89 Ejemplo 7-1. Uso de ADC El siguiente ejemplo demuestra el uso del módulo ADC. En este ejemplo se realizan conversiones del canal 0 cada 100ms y se muestra el valor digital en el display LCD. Este código lo puede probar con el diagrama de la Error! No se encuentra el origen de la referencia.. Figura 7-8. Prueba de ADC /* Uso del módulo ADC * Se programa el Timer0 para producir una interrupción cada 100ms * en la cual se realiza una conversión 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
90 } **/ // Prototipos de función de interrupción 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 módulo 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 interrupción de ADC ADC_VREFPLUS_VDD & // Referencia+ VDD ADC_VREFMINUS_VSS, // Referencia- VSS 14 ); // AN0 como pin analógico // Habilitación global de interrupciones INTCONbits.GIE = 1; } while(1) { } // Vector de Interrupción #pragma code high_vector=0x1008 void high_interrupt (void) { _asm GOTO rsi_tmr0 _endasm }
91 #pragma code /****** RSI de TIMER0 *****/ #pragma interrupt rsi_tmr0 void rsi_tmr0 (void) { ConvertADC(); // Inicia conversión while(busyadc()); // Espera a que termine de convertir 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 interrupción INTCONbits.TMR0IF = 0; Programa 7-1. Uso de ADC
92 7.3 Sensor de Temperatura Un sensor de temperatura es un dispositivo diseñado para responder a cambios en temperatura o medir temperatura absoluta. Actualmente se usan 5 tipos de sensores de temperatura cuyas salidas pueden ser medidas eléctricamente: 1. Termopares. 2. RTDs (resistance temperature detectors). 3. Termistores. 4. Sensores integrados. 5. Sensores infrarrojos. 7.3.1.1 Sensor LM35 En este curso usaremos el sensor LM35, el cual es un sensor de temperatura integrado con una precisión calibrada de 1ºC. Puede medir temperaturas en el rango que abarca desde -55º a + 150ºC. La salida es lineal y cada grado centígrado equivale a 10 mv en la salida. Características Precisión de ~1,5ºC (en el peor caso), 0.5ºC garantizados a 25ºC. No linealidad de ~0,5ºC (peor caso). Baja corriente de alimentación (60uA). Amplio rango de funcionamiento (desde -55º a + 150ºC). Bajo costo. Baja impedancia de salida. El voltaje de salida es proporcional a la temperatura, en la escala Celsius. No necesita calibración externa y es de bajo costo. Funciona en el rango de alimentación comprendido entre 4 y 20 voltios.
93 Como ventaja adicional, el LM35 no requiere de circuitos adicionales para su calibración externa cuando se desea obtener una precisión 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 calibración inherente hace posible una fácil instalación en un circuito de control. Figura 7-9. LM35 PRÁCTICA 6. Termómetro Digital con display LCD Diseñe un termómetro digital que obtenga la temperatura de un LM35 y la muestre en grados centígrados y grados Farenheit en un display LCD.