Autor Tema: Resolución ADC  (Leído 3633 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado ramirez

  • PIC16
  • ***
  • Mensajes: 195
Resolución ADC
« 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

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Resolución ADC
« Respuesta #1 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.
« Última modificación: 14 de Junio de 2009, 13:34:24 por MLO__ »
El papel lo aguanta todo

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Resolución ADC
« Respuesta #2 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
El papel lo aguanta todo

Desconectado sycho

  • PIC16
  • ***
  • Mensajes: 195
Re: Resolución ADC
« Respuesta #3 en: 14 de Junio de 2009, 13:44:26 »
No puedes tener una Vref+ de 1.5v. Mirate la pagina 174 del datasheet:
  • La diferencia entre Vref+ y Vref- tiene q ser como mínimo de 2v.
  • Vref+ tiene que ser como minimo AVdd-2.5v, por tanto si tienes Vdd de 5v Vref+ tiene que ser como mínimo de 2.5v
Por tanto no vas a conseguir la máxima resolución cumpliendo especificaciones a menos que intercales un amplificador.

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Resolución ADC
« Respuesta #4 en: 14 de Junio de 2009, 13:52:41 »
 :shock: :shock:

Habra que trabajarlo a 2 volts.
El papel lo aguanta todo

Desconectado sycho

  • PIC16
  • ***
  • Mensajes: 195
Re: Resolución ADC
« Respuesta #5 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
« Última modificación: 14 de Junio de 2009, 14:14:32 por sycho »

Desconectado ramirez

  • PIC16
  • ***
  • Mensajes: 195
Re: Resolución ADC
« Respuesta #6 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

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Resolución ADC
« Respuesta #7 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.
No contesto mensajes privados, las consultas en el foro

Desconectado ramirez

  • PIC16
  • ***
  • Mensajes: 195
Re: Resolución ADC
« Respuesta #8 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);



  }
    }

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: Resolución ADC
« Respuesta #9 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
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Resolución ADC
« Respuesta #10 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);

No contesto mensajes privados, las consultas en el foro

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Resolución ADC
« Respuesta #11 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.
No contesto mensajes privados, las consultas en el foro

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: Resolución ADC
« Respuesta #12 en: 14 de Junio de 2009, 20:14:52 »
gracias por la aclaracion :-/
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA


 

anything