TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: ramirez en 14 de Junio de 2009, 13:20:32

Título: Resolución ADC
Publicado por: ramirez en 14 de Junio de 2009, 13:20:32
Buenas tardes llevo bastantes horas buscando por el foro sobre el tema de la resolución sobre el convertidor AD,he visto bastantes cosas pero no he sacado ninguna conclusión para lo que estoy haciendo. Como veis en el archivo adjunto existen dos LM35, cuyos valores quiero ver en el LCD, tengo una tensión de referencia de 1.5 V, ya que es la tensión máxima cuando el LM35 está a 150 ºC (no se si esto es correcto), pues como podeis ver elsensor del canal 0, es el valor de lectura directo, y sino se trata con ninguna ecuación, obtengo un valor de 308.0 ¿Qué signigica este valor?, por lo que he leido en el foro debería ser el valor 1023, ya que es el valor máximo, pero como veis no corresponde.

Con el segundo sensor multiplico por la resolución, pero tampoco es el valor óptimo ¿Que es lo que ocurre?

De nuevo os doy a todos las gracias de antemano por vuestra amabilidad
Título: Re: Resolución ADC
Publicado por: MLO__ en 14 de Junio de 2009, 13:31:41
Hola.

1024 sera el valor que vas a obtener cuando el sensor este a 150°C.

El valor que obtienes es el valor de la conversion digital segun la siguiente ecuacion:
Res = \frac{V_{ref}}{2^{n}}
con n= numero de bits del conversor

Para saber que voltaje tienes, multiplicas el 308 * Res.

El valor de la conversion es un int16.

Saludos

EDITO: Revisando tu codigo, veo que primero configuras a A3 como un Vref y luego seteas todas las entradas como analogicas. Quita la ultima configuracion de los canales analogicos.
Título: Re: Resolución ADC
Publicado por: MLO__ en 14 de Junio de 2009, 13:37:05
Hola.

Mira que si tienes un valor de Vref = 5, tendras una resolcion de: 0,0048828125 ... si el valor resultante de la conversion es 308, el voltaje analogico es 308 * 0,0048828125 = 1.5v.

Es decir, como configuras todas las entradas analogicas, el PIC toma como Vref 5 voltios y no 1.5 voltios como tu quieres.

Saludos
Título: Re: Resolución ADC
Publicado por: sycho en 14 de Junio de 2009, 13:44:26
No puedes tener una Vref+ de 1.5v. Mirate la pagina 174 del datasheet:
Por tanto no vas a conseguir la máxima resolución cumpliendo especificaciones a menos que intercales un amplificador.
Título: Re: Resolución ADC
Publicado por: MLO__ en 14 de Junio de 2009, 13:52:41
 :shock: :shock:

Habra que trabajarlo a 2 volts.
Título: Re: Resolución ADC
Publicado por: sycho en 14 de Junio de 2009, 14:11:34
Habra que trabajarlo a 2 volts.
No, si Vref- es Vss (GND), Vref+ tiene que ser como minimo 2.5v. La limitación que aparece en el datasheet es doble, o más bien triple, pero Vref- no nos preocupa en éste caso.
La máxima sensibilidad (bits/volt) se conseguiría con Vref- =0.5v y Vref+ = 2.5v pero me temo que empezar en 0.5v no te vale para el LM35
Título: Re: Resolución ADC
Publicado por: ramirez en 14 de Junio de 2009, 19:03:10
Muchas gracias a todos por vuestras respuestas, efectivamente, tomando una Vref=5 V, todo pasa como me contais. Todo lo que he aprendido lo he hecho a través del foro y en el ejemplo que he puesto lo entiendo todo excepto "#define A_ANALOG_RA3_REF 0x83"
",¿qué significa esto exactamente?, tiene algo que ver con:
Citar
EDITO: Revisando tu codigo, veo que primero configuras a A3 como un Vref y luego seteas todas las entradas como analogicas. Quita la ultima configuracion de los canales analogicos.
¿qué quieres decir con esto?

Gracias a todos de nuevo
Título: Re: Resolución ADC
Publicado por: Suky en 14 de Junio de 2009, 19:25:11
Como seguramente sabes el módulo conversor A/D lo puedes configurar con todas las entradas analógicas y Vref+=Vdd y Vref-=Vss, o solo algunas entradas analógicas y utilizando el pin A3 como Vref+ externa, aparte de otras combinaciones. Con esas lineas seleccionas una u otra, por eso te han indicado que borres una de las 2 según como lo implementes.
Título: Re: Resolución ADC
Publicado por: ramirez en 14 de Junio de 2009, 19:42:42
Al final he dejado el código como sigue y funciona correctamente, eliminado la línea: "#define A_ANALOG_RA3_REF 0x83" (que aún sigo sin saber como trabaja) ¿creeis que ya está correcto del todo?

Gracias de nuevo por vuestra colaboración.

#include "16f876.h"
#device adc=10
#fuses NOLVP,XT,NOWDT,NOPROTECT,PUT
#use delay(clock=4000000)
#define use_portb_lcd TRUE
#include "lcd.c"
#use fast_io(A)
#use fast_io(B)


void main(void){

float temp1,temp2;

setup_adc_ports(RA0_RA1_ANALOG_RA3_REF);
setup_adc_ports(all_analog);
setup_adc(ADC_CLOCK_INTERNAL);

  set_tris_a(0xFF);   //todos como entrada sondas de temperatura y vref
  set_tris_b(0x00);  //todos como salida datos lcd


   while(true){

delay_ms(50);
     set_adc_channel(0);
     delay_us(20);
     temp1=read_adc();
     temp1=temp1*0.0048828*100;

delay_ms(50);
     set_adc_channel(1);
     delay_us(20);
     temp2=read_adc();
     temp2=temp2*0.0048828*100;
     

delay_ms(50);
     lcd_init();
     lcd_gotoxy(1,1);   //me posiciono en la linea 1 en el primer caracter
     printf(lcd_putc,"T1=%2.0f",temp1); //Escribo temperatura del sensor1
     delay_ms(500);


     lcd_gotoxy(1,2);
     printf(lcd_putc,"T2=%2.1f",temp2); //Escribo temperatura del sensor2
     delay_ms(500);



  }
    }
Título: Re: Resolución ADC
Publicado por: jhozate en 14 de Junio de 2009, 19:51:51
pueden explicarme esta linea printf(lcd_putc,"T1=%2.0f",temp1), exactamente q quiere decir %2.0f  yo estoy haciendo lo mismo y lo que puse fue PRINTF( lcd_putc "Temp= %3u C", P );  en mi caso entiendo que lo quiere decir es q se representara un entero sin signo de 3 cifras
Título: Re: Resolución ADC
Publicado por: Suky en 14 de Junio de 2009, 20:04:37
"#define A_ANALOG_RA3_REF 0x83"
Esta linea le indica al compilador que donde encuentre el texto A_ANALOG_RA3_REF lo reemplace por el valor numérico 0x83. Este valor lo trabaja la función setup_adc_ports();
Borra de tu programa la linea setup_adc_ports(RA0_RA1_ANALOG_RA3_REF);como te lo han indicado, ya que no tiene sentido porque su configuracion es reemplazada por la linea setup_adc_ports(all_analog);

Título: Re: Resolución ADC
Publicado por: Suky en 14 de Junio de 2009, 20:07:02
pueden explicarme esta linea printf(lcd_putc,"T1=%2.0f",temp1), exactamente q quiere decir %2.0f  yo estoy haciendo lo mismo y lo que puse fue PRINTF( lcd_putc "Temp= %3u C", P );  en mi caso entiendo que lo quiere decir es q se representara un entero sin signo de 3 cifras

La indicación "%2.0f" indica que la variable a mostrar es float y que se mostrará 2 dígitos en la parte entera y 0 en la parte decimal.
Título: Re: Resolución ADC
Publicado por: jhozate en 14 de Junio de 2009, 20:14:52
gracias por la aclaracion :-/