Escalar un lm35 temperatura con un microcontrolador

#22
sinceramente no aclaro mucho mi duda...

es muy basica mi pregunta: el lm35 capta por aproximacion verdad?
 

Fogonazo

Exorcista & Moderador eventual
#23
.....es muy basica mi pregunta: el lm35 capta por aproximacion verdad?
:eek:pss:

Yo entendí que querías conocer de que manera censa la temperatura internamente.

Puede captar por proximidad, pero deberás lograr que no halla pérdidas de calor (Gradiente térmico) entre el elemento calefactor y el sensor, si no es así la temperatura detectada será irreal
Es mejor si esta inmerso en el elemento caliente o acoplado mecánica/térmicamente al elemento caliente.
 
Última edición:
#25
Hola gente del foro. Como andan? bueno les cuento que yo recien pude terminar de hacer mi termometro digital de 10 bit de resolucion, pero tengo un pequeno error, que no se si es por culpa mia, o es error que introduce el ADC. (Los errores los veo en simulador Proteus, no en vida real)

Pensando que el lm35 mide hasta 150 C, entregando 1500mv decidi poner en el ADC la tension Vref+ a 1,5V, pensando que de esta forma iva a mejorar la precicion, agraeceria que me confirmara si esto es correcto.

Luego para hacer el calculo lo que hice: ValorADC=ValorADC/((0.01*1024)/1.5)
Es esto correcto?

El problema surge que cuando pongo por ejemplo en el simulador, 56 C el display me muestra 56.2.

Bueno espero haber aportado suficiente informacion como para que les sea facil ayudarme. Muchas gracias a todos
Saludos
Gonzalo
 
#26
Pensando que el lm35 mide hasta 150 C, entregando 1500mv decidi poner en el ADC la tension Vref+ a 1,5V, pensando que de esta forma iva a mejorar la precicion, agraeceria que me confirmara si esto es correcto.
Es correcto, solo asegurate de que no vaya a entrar un voltaje mayor a 1.5V en el Convertidor o existe riezgo de quemarlo

Luego para hacer el calculo lo que hice: ValorADC=ValorADC/((0.01*1024)/1.5)
Es esto correcto?

El problema surge que cuando pongo por ejemplo en el simulador, 56 C el display me muestra 56.2.
Vpaso=1.5/1024=1.46484mV
560/1.46484mV=322.2941..... pasos del convertidor

Si no usas todas las decimales en tu programa entonces tendras errores de redondeo, lo recomendable es usar voltajes de referencia que sean mutiplos de las potencias de 2 para que los calculos sean mas simples, por ejemplo si usas 2048 tendras:

Vpaso 2.048/1024= 2mV
560/2mV=280 pasos del convertidor
 
#27
Chico3001 muchas gracias por tu ayuda y por responder.
Hice las modificaciones que me sugeriste, pero aun asi el error del digito decimal persiste. Te muestro el codigo que estoy usando, a ver si me podes ayudar a descubrir donde esta el error. Yo hice algunas pruebas y me parece que el error esta en el resultado que entrega el ADC mas que en el calculo. Lo que hice fue sacar por el lcd directamente la varriable ValueADC, sin hacerle ninguna modificacion, ni primedio, ni nada. La mande al lcd tal cual me la entrega el ADC, y en proteus puse en el lm35 100 C y el lcd mostraba 500.1 (Vref=2.048V)

Bueno espero que me puedan dar una mano en esta. Igual ya estoy muy agradecido
Saludos
Gonzalo

PHP:
void temperatura(void)
{ 
	float ValueADC;
	float temp[5];
	float temprom;
	char tempres[10];
	
	adc_init(); //Inicializacion de ADC

	lcd_puts("Temperatura:");
	lcd_goto(64);
	lcd_puts("Obteniendo Datos");
		
		DelayBigMs(500);
		for(char i=0; i<5; i++)
		{
		//procesando();
		ADRESH=0b00000000;// no se si sera necesaro hacer esto pero por las dudas
		ADRESL=0b00000000;
		GODONE = 1;			// Inicia conversión
		
		while(GODONE);			// Espera a fin de converción
		ValueADC = 0;
		
		ValueADC = (ADRESH<<8)+ADRESL;	// Reune el valor en una varible
		
		ValueADC = ValueADC/((0.01*1024)/2.048); 
		temp[i]= ValueADC; //se obtienen 5 muestras oara mejor precicion, luego se saca el promedio
		
		}
		
		temprom = (temp[0] + temp[1] + temp[2] + temp[3] + temp[4])/5;
		sprintf(tempres,"%4.1f", ValueADC);
		lcd_goto(64);
		lcd_puts("                ");
		lcd_goto(64);
		lcd_puts(tempres);lcd_puts(" C");
		
		DelayBigMs(450);
		lcd_clear();
		
		ADON=0;//apago el modulo ADC
 
Última edición por un moderador:
#28
Posiblemente el error esta en esa formula tan rara, intenta probando con esta modificacion:

PHP:
void temperatura(void)
{ 
	float ValueADC;
	float temp[5];
	float temprom;
	char tempres[10];
	
	adc_init(); //Inicializacion de ADC

	lcd_puts("Temperatura:");
	lcd_goto(64);
	lcd_puts("Obteniendo Datos");
		
		DelayBigMs(500);
		for(char i=0; i<5; i++)
		{
		//procesando();
		GODONE = 1;			// Inicia conversión
		
		while(GODONE);			// Espera a fin de conversión
		
		ValueADC = (ADRESH<<8)+ADRESL;	// Reune el valor en una varible		
		ValueADC = ValueADC*2			// solo se multiplica por el Vpaso
		temp[i]= ValueADC; //se obtienen 5 muestras oara mejor precicion, luego se saca el promedio
		
		}
		
		temprom = (temp[0] + temp[1] + temp[2] + temp[3] + temp[4])/5;
		sprintf(tempres,"%4.1f", temprom);
		lcd_goto(64);
		lcd_puts("                ");
		lcd_goto(64);
		lcd_puts(tempres);lcd_puts(" C");
		
		DelayBigMs(450);
		lcd_clear();
		
		ADON=0;//apago el modulo ADC
 
Última edición:
#29
Chico3001, hice la modificación que me recomendaste pero los problemas continuan. Multiplicando por 2, el lcd me muestra a 100 C, una temperatura de 1002.0 C, es decir que la escala esta mal. Probe multiplicando por 2mv (0,002V) y ya queda muy chica. Bueno, el error de escala seria lo de menos. El tema es que el error en los decimales, persiste, osea en la precisión. En lugar de 100C obtengo 100.2 C. Como te dije en el mensaje anterior, realice algunas pruebas, enviando solamente el error que entregaba el ADC al lcd y incluso ahí hay error, por eso digo que quizas, el problema este en el ADC. Tenes alguna sugerencia para mi? ya se me están acabando los recursos.
Muchas gracias por responder. Saludos
 
#30
No veo donde puede estar el error, al menos en la rutina que pusiste... solko se me ocurre que el problema este en alguna otra parte del codigo, o sea por hardware...
 
#31
Gracias Chico de todas formas, ya vere que hago. Si se te ocurre alguna idea, te lo agradeceria. Saludos

Chico, teoricamente, si yo conecto la Vref a la entrada del ADC en lugar del LM35, y mostrando en pantallla solo el valor que entrga el ADC, me deberia mostrar 1024 no? por que a mi me muestra 1023. A que se debera esto?

Creo que ya descubri a que se debia el error. Parece que Proteus anade un error a proposito en sus mediciones como para darle mas veracidad. conecte un voltimetro (virtual) al lm35 en el proteus, y cuando este decia 10C el voltimetro indicaba 111mv en lugar de 110.

Utilizando 10 bits de rsolucion, y con una VREF=2.048, cual es la precicion que puedo lograr que el lcd me muestre?
Como seria el calculo, asi decido que VREF me conviene usar
Gracias
Gonzalo
 
Última edición:
Arriba