(Convertidor Analgico/Digital) TEMA 4 PROF. LUIS ZURITA RESOLUCIN Prof. Luis Zurita Microcontroladores II VOLTAJES DE REFERENCIA EXTERNOS El convertidor A/D puede seleccionar como tensin de referencia la interna VDD y Tierra. Para referencias externas, se introducen por: RA3/AN3/VREF+ y RA2/AN2/VREF- Las siguientes limitaciones aplican: El mximo voltaje aplicado a VREF+ (RA3/AN3) ser El mximo voltaje aplicado a VREF+ (RA3/AN3) ser VDD+0,3V y el mnimo VDD-2,5V. Sobre el voltaje aplicado a VREF- (RA2/AN2) la mnima tensin ser VSS-0,3V y la mxima (VREF+) - 2V. Por ejemplo, si la tensin de alimentacin es de 5V, la tensin en RA3/AN3 no podr exceder de 5V. Por lo que el mximo voltaje en VREF- ser de 3V. Prof. Luis Zurita Microcontroladores II REGISTROS RELACIONADOS AL MDULO A/D ADCON0: Registro de control 0. (Banco 0). ADCON1: Registro de control 1. (Banco 1). ADRESH: Guarda la parte alta del Resultado de ADRESH: Guarda la parte alta del Resultado de la conversin. (Banco 0). ADRESL: Guarda la parte baja del Resultado de la conversin. (Banco 1). Prof. Luis Zurita Microcontroladores II Seleccin del reloj de conversin A/D El tiempo de conversin A/D por bit se define como TAD. La conversin A/D requiere mnimo 12TAD por 10-bits de conversin. La fuente del reloj de conversin A/D es seleccionado por software, mediante los bits ADCON0 <7:6>. Las cuatro opciones posibles para TAD son: ADCS 1:0 PERODO 0 0 2TOSC 0 1 8TOSC 1 0 32TOSC 1 1 RC interno (2-6 s) Prof. Luis Zurita Microcontroladores II Tiempo de adquisicin (T ACQ ) Es el tiempo necesario para que se cargue el condensador de retencin interno, con la tensin de entrada. Este proceso de carga del condensador depende de distintos factores, entre otros, la impedancia de la fuente de tensin de entrada (el fabricante recomienda que se site por debajo de 10 fabricante recomienda que se site por debajo de 10 kohm. El tiempo de adquisicin dentro de los mrgenes tpicos es de aproximadamente 20s. La adquisicin no comienza hasta que no acabe la conversin. Por lo que se debe esperar un T ACQ tras una conversin , para seleccionar un nuevo canal o luego de encender el mdulo AD. Prof. Luis Zurita Microcontroladores II Tiempo de conversin (T AD ) Es el tiempo necesario para obtener el valor digital de la tensin analgica de entrada. Este tiempo depende de la fuente de reloj que se seleccione para la conversin. Prof. Luis Zurita Microcontroladores II Para un control adecuado de conversiones A/D, el reloj de conversin A/D (TAD) deben ser seleccionados para asegurar un tiempo mnimo TAD de 1,6 s. La siguiente tabla muestra los tiempos de TAD derivada de las frecuencias de funcionamiento del dispositivo y de la fuente de reloj A/D de reloj seleccionado. Prof. Luis Zurita Microcontroladores II CICLOS DE CONVERSIN Prof. Luis Zurita Microcontroladores II FORMATO DE RESULTADOS Prof. Luis Zurita Microcontroladores II Prof. Luis Zurita Microcontroladores II Prof. Luis Zurita Microcontroladores II Prof. Luis Zurita Microcontroladores II A/D en C En el compilador C las funciones para manejar el convertidor A/D son las siguientes: setup_adc(modo); Donde modo, determina la configuracin del mdulo A/D correspondiente a los bits 7:6 del ADCON0. setup_adc(modo); ADCON0(1Fh) ADC_OFF 00000000 ADC_OFF 00000000 ADC_CLOCK_INTERNAL 11000000 ADC_CLOCK_DIV_2 00000000 ADC_CLOCK_DIV_8 01000000 ADC_CLOCK_DIV_32 10000000 setup_adc_ports(valor); Valor: definicin de las entradas analgicas correspondiente a los bits 3:0 del ADCON1. Prof. Luis Zurita Microcontroladores II PCFG3 PCFG0 AN7 RE2 AN6 RE1 AN5 RE0 AN4 RA5 AN3 RA3 AN2 RA2 AN1 RA1 AN0 RA0 setup_adc_ports(valor); 0000 A A A A A A A A ALL_ANALOG 0001 A A A A VREF+ A A A AN0_AN1_AN2_AN4_AN5_AN6_AN7_VSS_VREF 0010 D D D A A A A A AN0_AN1_AN2_AN3_AN4 0011 D D D A VREF+ A A A AN0_AN1_AN2_AN4_VSS_VREF 0100 D D D D A D A A AN0_AN1_AN3 0101 D D D D VREF+ D A A AN0_AN1_VSS_VREF 011X D D D D D D D D NO_ANALOGS 011X D D D D D D D D NO_ANALOGS 1000 A A A A VREF+ VREF- A A AN0_AN1_AN4_AN5_AN6_AN7_VREF_VREF 1001 D D A A A A A A AN0_AN1_AN2_AN3_AN4_AN5 1010 D D A A VREF+ A A A AN0_AN1_AN2_AN4_AN5_VSS_VREF 1011 D D A A VREF+ VREF- A A AN0_AN1_AN4_AN5_VREF_VREF 1100 D D D A VREF+ VREF- A A A_ANALOG_RA3_RA2_REF 1101 D D D D VREF+ VREF- A A AN0_AN1_VREF_VREF 1110 D D D D D D D A AN0 1111 D D D D VREF+ VREF- D A AN0_VREF_VREF set_adc_channel(canal) Canal: seleccin del canal analgico correspondiente a los bits 5:3 del ADCON0. A/D en C 0(AN0) 1(AN1) 2(AN2) 3(AN3) 4(AN4) 5(AN5) 6(AN6) 7(AN7) Prof. Luis Zurita Microcontroladores II valor= read_adc(); Lectura del resultado donde valor es un entero de 16 bits, segn la directiva #DEVICE ADC= empleada. Esta directiva trabaja segn la tabla: A/D en C DEVICE 8 bit 10 bit 11 bit 16 bit ADC=8 00-FF 00-FF 00-FF 00-FF ADC=10 x 0-3FF x x ADC=11 x x 0-7FF x ADC=16 0-FF00 0-FFC0 0-FFE0 0-FFFF Prof. Luis Zurita Microcontroladores II Por ejemplo, el fichero 16F877.h incluye como primera directiva #device PIC16F877. Para incluir la informacin del tipo de conversor A/D se debe aadir #device adc=10. READ_ADC() admite tres modos de funcionamiento: A/D en C READ_ADC() admite tres modos de funcionamiento: ADC_START_AND_READ Si no se indica nada es la opcin por defecto. Permite iniciar y leer el convertidor. ADC_START_ONLY Slo inicia la conversin. ADC_READ_ONLY Slo lee los registros del convertidor. Prof. Luis Zurita Microcontroladores II En el siguiente ejercicio, se medir un canal analgico que ingresa por RA0 y se muestra su valor en digital y en voltaje en una pantalla LCD. #include <16f877a.h> #device ADC=10 #fuses setup_adc(ADC_CLOCK_INTERNAL); setup_adc_ports(ALL_ANALOG); lcd_init(); while(TRUE){ set_adc_channel(0); delay_ms(100); valor=read_adc(); p=0.004883*valor; A/D en C. Ejercicio 1. Lectura de un canal. #fuses XT,NOWDT,NOPROTECT,NOLVP #use delay(clock=4000000) #use fast_IO(c) #include <lcd.c> int16 valor=0; float p; void main(){ p=0.004883*valor; lcd_gotoxy(1,1); printf(lcd_putc,"\fA/DValor=%4LU\n",valor); printf(lcd_putc,"Voltaje=%g",p); } } Prof. Luis Zurita Microcontroladores II A/D en C. Ejercicio 1. Lectura de un canal. Prof. Luis Zurita Microcontroladores II En el siguiente ejercicio, se medirn dos canales analgicos (RA0 y RA1), el primero ser el valor de una variable que se desea medir y el segundo ser el set point. Si la variable est por encima del set point se activa un A/D en C. Ejercicio 2. Lectura de dos canales. Si la variable est por encima del set point se activa un led rojo. En caso contrario se activa un led verde. Prof. Luis Zurita Microcontroladores II #include <16f877.h> #device ADC=10 #fuses XT,NOWDT,NOPROTECT,NOLVP #use delay(clock=4000000) #use fast_IO(C) #include <lcd.c> int16 valor=0; long setpoint=0; A/D en C. Ejercicio 2. Lectura de dos canales. long setpoint=0; float p; float psp; void main(){ set_tris_c(0); setup_adc(ADC_CLOCK_INTERNAL); setup_adc_ports(ALL_ANALOG); lcd_init(); output_C(0); Prof. Luis Zurita Microcontroladores II while (TRUE){ set_adc_channel(0); delay_ms(10); valor=read_adc(); p=0.004883*valor; printf(lcd_putc,"\fSENSOR=%g\n",p); set_adc_channel(1); delay_ms(10); setpoint=read_adc(); psp=0.004883*setpoint; A/D en C. Ejercicio 2. Lectura de dos canales. Continuacin. psp=0.004883*setpoint; printf(lcd_putc,"SPOINT=%g\n",psp); if(p>=psp){ output_high(PIN_C0); output_low(PIN_C1);} else{ output_low(PIN_C0); output_high(PIN_C1); } delay_ms(50); } } Prof. Luis Zurita Microcontroladores II A/D en C. Ejercicio 2. Lectura de dos canales. Prof. Luis Zurita Microcontroladores II En este ejercicio se plantea disear un termmetro basado en una NTC modelo NTCSA0WB203, con una beta de 4050 y una resistencia a 25C de 20 k. A/D en C. Ejercicio 3. Termmetro con una NTC NTSA0WB203 Estas caractersticas se pueden ajustar as como la temperatura a medir en el men de edicin del componente. Prof. Luis Zurita Microcontroladores II Modificacin de los valores de la NTC en Proteus Cambiar por 25C Prof. Luis Zurita Microcontroladores II La NTC se linealiza mediante una resistencia R1 de 10 k, el valor de la tensin de la NTC(VT) se puede obtener mediante las siguientes ecuaciones (temperatura en k): A/D en C. Ejercicio 3. Termmetro con una NTC NTSA0WB203 Prof. Luis Zurita Microcontroladores II #include "16f877.h" #device adc=10 #fuses XT,NOWDT #use delay(clock=4000000) #include <math.h> //Se incluye para los clculos matemticos #include <lcd.c> A/D en C. Ejercicio 3. Termmetro con una NTC NTSA0WB203 void main() { float tv,tr,temp,y; //Variables de ecuacin int16 value; lcd_init(); setup_adc_ports(ALL_ANALOG); setup_adc( ADC_CLOCK_INTERNAL ); set_adc_channel( 0 ); delay_us(10); Prof. Luis Zurita Microcontroladores II while(true) { value = Read_ADC(); tv = 5.0 * value / 1024.0; tr = tv * 10000.0 / (5.0 - tv); A = log(tr/20000.0); y = (1.0/298.15) + (A *(1.0/4050.0)); A/D en C. Ejercicio 3. Termmetro con una NTC NTSA0WB203 y = (1.0/298.15) + (A *(1.0/4050.0)); temp=1.0/y; temp = temp -273.15; printf(lcd_putc,"\fTEMPERATURA\n"); printf(lcd_putc,"\nT = %04.2fC", temp); } } Prof. Luis Zurita Microcontroladores II A/D en C. Ejercicio 3. Termmetro con una NTC NTSA0WB203 Prof. Luis Zurita Microcontroladores II