Saludos colegas.
Estoy diseñando un sensor de temperatura con un PIC y el integrado LM35. En principio no he tenido mayores problemas, pero obtengo un comportamiento que creo que es un poco extraño, los datos que se leen varían bastante, por ejemplo leo cada 500 ms la temperatura, e imprime 20º, al siguiente 21º, luego 22º. No creo que sea normal que la temperatura ambiente varié 2º en un segundo.
El circuito lo alimento con 5 voltios extraídos de la fuente del ordenador, pongo el famoso condensador de 100µF cerca a la alimentación del micro, y la salida del LM35 la llevo al pin AN0 del micro para realizar con este la conversión análogo-digital.
Ajunto el código para mayor claridad:
¿Es normal este comportamiento?
¿Algo que deba chequear?
Saludos y Muchas Gracias por su tiempo y colaboración.
Estoy diseñando un sensor de temperatura con un PIC y el integrado LM35. En principio no he tenido mayores problemas, pero obtengo un comportamiento que creo que es un poco extraño, los datos que se leen varían bastante, por ejemplo leo cada 500 ms la temperatura, e imprime 20º, al siguiente 21º, luego 22º. No creo que sea normal que la temperatura ambiente varié 2º en un segundo.
El circuito lo alimento con 5 voltios extraídos de la fuente del ordenador, pongo el famoso condensador de 100µF cerca a la alimentación del micro, y la salida del LM35 la llevo al pin AN0 del micro para realizar con este la conversión análogo-digital.
Ajunto el código para mayor claridad:
Código:
#include <16F887.h>
#device adc=10
#fuses XT,NOWDT,PUT,MCLR,NOPROTECT
#use delay(clock = 4000000)
#use rs232(BAUD=9600,XMIT=PIN_C6,RCV=PIN_C7,BITS=8,PARITY=N)
unsigned int8 temperatura=0;
#int_rda
void isr_rda( void ){
int8 r = getchar();
if( r == 'r')
putchar(temperatura);
}
#int_timer1
void isr_timer1( void ){
int16 adc_ = read_adc();
unsigned int8 temp = adc_*(5.0/10.23)+0.4;
//printf( "%ud\n\r", temp );
if( temp!= temperatura ){
temperatura = temp;
putchar(temperatura);
}
}
void main(void){
set_tris_b(0x00);
setup_adc_ports( sAN0 ); //AN0 analogo y VDD como referencia.
setup_adc( ADC_CLOCK_INTERNAL );
set_adc_channel( 0 );
setup_timer_1( T1_INTERNAL | T1_DIV_BY_8 );
set_timer1(3036);
enable_interrupts(INT_TIMER1);
//enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
while(1);
}
¿Algo que deba chequear?
Saludos y Muchas Gracias por su tiempo y colaboración.