EL módulo conversor A/D (c) Domingo Llorente 2010 1 Características del conversor A/D Ocho entradas de señal analógica. (5 para el 16F876x) Resolución de la conversión de 10 bits. (0-1024) Distintas fuentes de tensión de referencia seleccionadas por software. Capacidad para operar en el modo Sleep. Los registros asociados al módulo son: • PORTA,TRISA,PORTE y TRISE: Definición de pines de entrada • INTCON,PIE1 y PIR1: Manejo de interrupciones • ADCON0,ADCON1,ADRESH y ADRESL: Control del conversor (c) Domingo Llorente 2010 2 Registros asociados al conversor A/D (I) El registro ADCON0 sirve para: a) Seleccionar la señal de reloj del conversor, en funcion de Fosc El tiempo empleado en la Conversion viene dado por la expresion: TACQ= TAMP+TC+TCOFF Tiempo empleado en la conversión ~= 20us (*) Nota: Fosc = Frecuencia del oscilador. (*) Dato del datasheet de Microchip para el pic 16F877x (c) Domingo Llorente 2010 3 Registros asociados al conversor A/D (II) b) Seleccionar el canal analógico para realizar la conversión c) Iniciar/parar la conversión d) Encender/Apagar el conversor b c d (c) Domingo Llorente 2010 4 Registros asociados al conversor A/D (III) El registro ADCON1 sirve para: a) Seleccionar la justificación del resultado de la conversión. ADFM = 1 : Los seis bits más significativos del registro ADRESH se leen como ‘0’. ADFM = 0 : Los seis bits menos significativos del registro ADRESL le leen como ‘0’ (c) Domingo Llorente 2010 5 Registros asociados al conversor A/D (IV) b) Configurar las entradas analógicas (c) Domingo Llorente 2010 6 Interrupción del conversor (I) Para habilitar la interrupción del conversor hay que: a) Poner a uno los bits GIE y PEIE del registro INTCON (c) Domingo Llorente 2010 7 Interrupción del conversor (II) b) Poner a uno el bit ADIE del registro PIE1 c) Cada vez que se finalice una conversión se pondrá a uno la bandera ADIF del registro PIR1. (c) Domingo Llorente 2010 8 Conexión de las entradas analógicas en la placa de ampliación Para usar la entrada analógica de RA0 hay que poner el puente JP9 en pos. ANL0. Para usar la entrada analógica de RA3 hay que poner el puente JP8 en pos. ANL3. JP8 JP9 ANL0 ANL3 (c) Domingo Llorente 2010 9 Configuración del conversor en CCS (I) Para configurar la entrada del conversor se utilizan la función: setup_adc_ports( VALOR ); Donde VALOR puede ser: NO_ANALOG, Ninguna entrada analógica ALL_ANALOGS, Todas las entradas analógicas AN0, Configura RA0 como única entrada analógica AN0_AN1_AN3, Configura RA0, RA1 y RA3 como entradas analógicas Para fijar la señal de reloj utilizada en la conversión se utiliza: setup_adc(ADC_CLOCK_INTERNAL); // Reloj interno para la conv. Otros valores posibles son: ADC_OFF, Para parar el conversor ADC_CLOCK_DIV_32, Utiliza un divisor por 32 de la Fosc. Nota: La lista completa de valores se puede consultar en el archivo: 16F877A.h (c) Domingo Llorente 2010 10 Configuración del conversor en CCS (II) Para leer el valor analógico hay seguir los siguientes pasos: 1º) Fijar el canal a leer: set_adc_channel(0); // Canal AN0 seleccionado 2º) Esperar, al menos 20us: delay_us(20); // Retardo para asegurar la conversión 3º) Guardar el valor leído en una variable de 16 bits: valor_leido=read_adc(); Adicionalmente, si queremos pasar a voltios la lectura obtenida: voltios=5.0*valor_leido/1024.0; Nota: No olvidar declarar las variables: int16 valor_leido; float voltios; (c) Domingo Llorente 2010 11 Ejemplo de programa Diseñar un programa que esté, constantemente leyendo la entrada analógica ANL0 y mostrando en el LCD de la placa el valor leído y su valor en voltios. (c) Domingo Llorente 2010 12 Solución en CCS (I) Comenzamos utilizando el asistente “PIC Wizard” Luego creamos la carpeta para nuestro proyecto y damos un nombre al archivo con extensión .pjt (c) Domingo Llorente 2010 13 Solución en CCS (II) Elegir: Pic: PIC17F877A Frecuencia del oscilador: 4Mhz Fuses: Crystal osc <=4Mhz Memoria de programa: No protegida (c) Domingo Llorente 2010 14 Solución en CCS (III) En la pestaña de “Analog” configurar: • Resolución: 1024 (10bits). • Fuente de reloj para la conversión: Internal • La entrada analógica: A0 (c) Domingo Llorente 2010 15 Solución en CCS (IV) En la pestaña “Code” podemos ver el código que se añadirá en nuestro programa. (c) Domingo Llorente 2010 16 Solución en CCS (V) El compilador nos genera la siguiente plantilla. (c) Domingo Llorente 2010 17 Solución: (c) Domingo Llorente 2010 18 Resumen Para realizar un programa con la interrupción externa habilitada: 1º.- Antes de la función main(); declarar una varialbe de 16bits. int16 valor_leido; 2º.- En la función main() configurar el conversor: setup_adc_ports( AN0 ); setup_adc(ADC_CLOCK_INTERNAL); 3º.- Seleccionar la entrada y hacer la lectura: set_adc_channel(0); // Canal AN0 seleccionado delay_us(20); // Retardo para asegurar la conversión valor_leido=read_adc(); // Lectura del conversor (c) Domingo Llorente 2010 19