SoloCodigo
Programación Específica => Microcontroladores => Programación en C => Mensaje iniciado por: farmada en Lunes 6 de Febrero de 2006, 17:28
-
Gente:
Estoy teniendo problemas para visualizar la temperatura en un LCD tomando como referencia un LM35 en Ra0. El display funciona perfectamente pero no se realmente la rutina read_adc() que me tira ( binario, hex, ? ).
Yo estoy implementando estas lineas que les paso a continuacion pero me muestra en el display cualquier cosa. Ya chequee el LM35 con un tester y varia perfectamente como dice el datasheet 10 mV/C. Les paso el codigo.
#include <16F877.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=10000000)
#include <LCD2.h>
int medicion;
float temper, paco;
int i, value, min, max;
main() {
setup_port_a( ALL_ANALOG );
setup_adc( ADC_CLOCK_INTERNAL );
set_adc_channel( 0 );
lcd_init(); //Inicia LCD
while (1)
{
setup_adc( ADC_CLOCK_INTERNAL );
delay_us (20);
medicion=read_adc (); //Hace conversión AD
setup_adc (adc_off); //Apaga ADC
temper=(medicion*5)256;
lcd_gotoxy(1,1);
printf(lcd_putc,"%03.1f",temper);
delay_ms (1000);
}
}
Desde ya muchas gracias.
-
Hola Farmada! En primer lugar, prueba declarar la variable medición como "long"; las variables int son de 8 bits, mientras que el ADC es de 10 bits.
No creo que haga falta la linea donde configuras el AD dentro del while, ya lo haces al principio.
Tampoco veo que inicies la conversión... Debes poner a 1 el bit 2 de ADCON0, y esperar a que este bit vuelva a 0. Entonces se completó la conversión. No se exactamente como trabaja la función read_adc()...
Bueno, prueba y nos cuentas!
Saludos
-
Huquen:
Muchas gracias por el aporte que has dado. Mira ya cambie totalmente el programa
y mide bastante bien, el problema es que tengo que medir temperaturas negativas y si bien estoy definiendo las variables como "signed int" y "signed long" las cuales manejan signo. Por el lado del LM35 lo subi de masa unos 1,25 V por lo que si mido con el tester pueo ver perfectament las temperaturas negativas lo cual no es asi con el programa. No se si el problema esta en la funcion Read_Adc().
Les paso el programa por si a alguno se le ocurre algo. Tendia que poder medir de -20ª a -7" C.
#include<16F877.h>
#device ADC=10
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=10000000)
#use rs232(baud=19200,parity=N,xmit=PIN_C4,rcv=PIN_C5)//,ERRORS,stream = PORT1)
#include<stdio.h>
#include<STDLIB.h>
#include <LCD2.h>
#zero_ram
signed int value;
signed long Value1;
void main()
{
lcd_init();
set_tris_d(0x00);
output_d(0x00);
pepe = 30;
setup_adc(ADC_CLOCK_INTERNAL);
setup_adc_ports(ALL_ANALOG);
set_adc_channel(2);
while(1)
{
value = read_adc();
delay_us(10);
value1 = (5 * value * (100/1023)); // Convierto la medicion a ºC.
lcd_gotoxy(1,1);
printf(lcd_putc,"Temperatura: %3.0Ld", value1);
delay_ms(1000);
}
}
-
Hola Farmada! Bien, al levantar la masa en 1.25V tendrás 1.25V (a la salida del LM35) para 0ªC. Es decir el display, para 0 Celsius, te mostrará 125 con monedas; según la formula que usas.
Entonces, al valor que calcules tendrás que restarle 125 y obtienes la temperatura.
Como puedes ver, estas sin problemas dentro del rango que quieres medir :)
Concejo: trata que los 1.25V sean lo mas estable posible, y (lógico) no dependiente de la temperatura...
Es más, si tu aplicación es delicada, puedes corregir cualquier desviación midiendo con el micro entre masa y la pata común del sensor ;)
Saludos :hola: