Termometro digital en C

que tal foro como estan ?
bueno lo que pasa es que quiero hacer un termometro digital con barrido estoy utilizando un mc9s08se8 freescale motorola como microcontrolador, Transistores NPN y un LM35 como sensor de temperatura, tmabien un Driver ULN2803 y display Anodo comun

lo que pasa es que quiero hacer un termometro mas o menos exacto programandolo en C el microcontrolador esto es lo que llevo del programa, hasta ahoar solo es un convertidor analogico digital

PHP:
#include <hidef.h> /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */
void main(void){    PTADD = 0x00;  
PTAPE = 0xFF;  PTBDD = 0xFF;  // Initialise ADC:  ADCCFG = 0x00;
// 8-bit mode, short sample  ADCSC2 = 0x00;   // Software trigger  APCTL1 = 0x01;  
// Channel 0 input  EnableInterrupts;    for( ; ; ) {    __RESET_WATCHDOG();    ADCSC1 = 0x00;   
// Start conversion on channel 0  
while (ADCSC1_COCO == 0); 
// Wait until conversion is complete    PTBD = ADCRL;  }}
}

no se si alguien me pudiera ayudar para ese convertidor analogico digital imprimir lo que me diga en un display con barrido muchas gracias de antemano a todos ...
 
Última edición por un moderador:
Yo quiero hacer lo mismo.

Quiero hacer un termometro digital con un pic 16f877a y un LM35. La presicion de 0,1 y que vaya de 00.1 a 99.9 mostrando los valores por un LCD 16x2

Este es mi codigo.

//

ADC=read_adc();
conv= (float)ADC;
conv=(conv*0.005850)/(0.01);
lcd_gotoxy(1,1);
printf(lcd_putc, "temp %3.1f C"conv);

//

Estoy utilizando un tamaño de paso de 1.5v

Mi problema es que la presicion es de 0.6 y nunca llega a 99.9 sino a 100.0

Me gustaria que alguien me ayudara en ajustar la presicion a 0.1! Gracias!
 
Para convertir el valor medido por el ADC a temperatura usas (conv*0.005850)/(0.01) suponiendo que conv aumente en 1 la temperatura aumentaría en 0.585 °C aprox. 0.6°C, para poder aumentar la precisión necesitas poner a la salida del LM35 un AO como amplificador no inversor, para calcular la ganancia ves cual es la máxima temperatura que vas a medir, calculas el voltaje de salida del LM35 y ves por cuanto hay que multiplicarlo para llegar al Vref+ del micro. Debes considerar que si el AO lo alimentas con 5V la salida del mismo nunca va a llegar a ese voltaje.
 
2ek9.png


Ahi esta listo :D! La parte del amplificador claro! Jajajajaja dure un buen rato en eso.

Al inicio entre 0 y 10v tiene un error de precisión de 0.2 y 0.3, luego a medida que sube el voltaje la precision se logra de 0.1

Espero a alguien le sirve :)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Ahora me pondre a trabajar en lo que seria el sensor que muestre lo que tiene que mostrar, que ya deberia xd
 
Subrayo lo que puso arriba Sebastian1989:

Debes considerar que si el AO lo alimentas con 5V la salida del mismo nunca va a llegar a ese voltaje.

Esto quiere decir que si alimentás al operacional con por ej. 12v y a la salida tenés más de 5v, podés dañar al ADC del uC.

Por otro lado, no existen las resistencias de 13,425k, usá valores comerciales cuando diseñás.
 
:LOL: eso fue para la presicion, seria un potenciometro de presicion de 20k o 2 en serie de 10k.

Por otro lado me di cuenta que cometi un error, al amplificar la señal consegui lo que queria. convertir 1mV en 10mV, pero con esto alcanze mi TOPE de 5v en 50ºC.

Luego me mate la cabeza pq dije "QUE DIANTRES HAGO? UN AMPLIFICADOR QUE REDUSCA LA SEÑAL?"

Y no, la solucion fue muy sencilla.

Tengo un numero de 1024 Cambios y quiero que haya un cambio cada 1mV.

1mV * 1024 = 1.024Volts == TAMAÑO DE PASO .... Listo.

Claro sin ninguna operacion matematica cada 1mV el registro sumara 1.

entonces la rutina quedaria:

//
ADC=read_adc();
conv= (float)ADC;
conv=conv*0.1;
//

Y listo, ya se tiene un cambio cada 1mV y se lleva a la presicion de 0.1ºC.

El tope maximo del termometro seria 102.4ºC

Aunque me contre con que en el 0 Absoluto del LM35 marca 1.12mV entonces esto hace que haya un error de precision en mi termometro durante unos 40º... ya no le dare mucha importancia :LOL:

Muchas gracias a los que aportaron y me ayudaron! Ahora continuare con mi proyecto y luego lo publico :p!!!

Aca dejo la imagen y arriba obvio esta la rutina.

g4pu.png
 
:LOL: eso fue para la presicion, seria un potenciometro de presicion de 20k o 2 en serie de 10k.

¿Un potenciómetro de precisión para un LM35?

Amigo la cosa es bastante más sencilla de lo que pensas, si el ADC puede bancarse 5v máximo, el LM35 te garantiza que podés ver variaciones de 10mV por c/ºC y si tu temperatura máxima es de 40ºC:

[LATEX]V_{ADC-max}=5v \rightarrow Ganancia=\frac{V_{ADC-max}}{10mV/C.40C}=12,5 veces[/LATEX]

En valores comerciales el no inversor quedará con R1=1kOhm y R2=10kOhm (por ejemplo), dando una ganancia de 11 y un margen de 0,6v antes de llegar a los 5v del ADC.

Luego al medir con el ADC deberá hacer esta cuenta:

[LATEX]Temperatura=\frac{N_{Adc}.\frac{V_{Adc-ref}}{1024 cuentas}}{10mV/C.Ganancia}=N_{Adc}0,04438 C/cuentas[/LATEX]

En estas condiciones tu ºT máxima a medir será de 45ºC.
 
Muchas gracias por la ayuda! Realmente aprendi bastante hoy de converitdores y amplificadores en cuanto a practica se refiere.

Ahora lo que me esta rompiendo el coco es que quiero ahora, agregarle a este sensor de temperatura una salida PWM con un lazo de corriente de 4 a 20mA.

Ya implemente el lazo de corriente que aca mismo encontre. Fuente de Corriente

Ahora lo que no se muy bien es como usar el PWM.

Por teoria se que el Pic 16f877a tiene 2 el CCP1 y el CCP2.

Supongo que debo usar solo 1 de ellos 2. Asi que uso el CCP1 y a continuacion dejo lo que seria mi nueva rutina.
ADC=read_adc();
conv= (float)ADC;
conv2=conv*0.1;
lcd_gotoxy(1,1);
printf(lcd_putc, "temp %3.1f C"conv2);
setup_timer_2(T2_DIV_BY_1,61,16);
setup_ccp1(CCP_PWM);
setup_ccp2(CCP_PWM);
set_pwm1_duty(conv2);
set_pwm2_duty(0);

Explicando lo que quiero hacer en pocas palabras es:

Para un valor de 0.0ºC == Corriente igual 4mA
Para un Valor de 99.9ºC == Corriente igual 20mA

Entonces ya con el lazo de corriente funcional, espero que alguien pueda ayudarme con lo que seria el arreglo final de la rutina para el PIC.

Entonces, ahora se que para un valor de 0ºC de entrada en pocas palabras el pulso de salida del PWM seria tambien de 0, ahi es donde debo agregar un convertidor sumador, sumando entonces los 4mA que necesito y empezando asi lo que seria el recorrido de 4 hasta 20mA.

Espero alguien pueda guiarme un poco mejor y ayudarme en lo que se pueda.

Anexo diagrama del lazo de corriente

4jwa.png


Salu2
 
Sobre lo anterior.

Repito la idea del potenciómetro de precisión, le estas pidiendo demasiado a ese pobre LM35, nunca vas a conseguir una resolución de 0,1ºC por un tema de linealidad (ver hojas de datos).

Otra gran error es no tener en cuenta la resolución del ADC que es de 4,8mV (con 5v con Vref) y hacer la conversión sin usar amplificador.

Te recomiendo que veas esos errores antes de seguir con el proyecto.
 
Ya cambie la resolucion del ADC.

Use:

Vref a 1.027v

Resolucion de aproximadamente 1mV

Cada 1mV hay un cambio de 1 en el termometro, para logra la precision lineal de 0.1
agregue la linea: "conv2=conv*0.1;" y ahi quedo listo el termometro de preciosion 0.1 de 00.0 a 99.9.


Lo que no se, o ignoro es si puedo usar ese Vref
 
Ya cambie la resolucion del ADC.

Use:

Vref a 1.027v

Resolucion de aproximadamente 1mV

Cada 1mV hay un cambio de 1 en el termometro, para logra la precision lineal de 0.1
agregue la linea: "conv2=conv*0.1;" y ahi quedo listo el termometro de preciosion 0.1 de 00.0 a 99.9.


Lo que no se, o ignoro es si puedo usar ese Vref

Creo que zener de referencia de 1.024v podés llegar a encontrar, pero deberías ver lo que dice la hoja de datos del uC.

Pero sigo insistiendo, mirá la hoja de datos el LM35, ¿qué dice respecto a la linealidad?

Otra cosa a tener en cuenta, si vas a trabajar con esos niveles de tensión, el ruido puede molestar y mucho.
 
La temperatura es directamente proporcional al voltaje xd


Edit: Respecto al ruido, pues jajajaja espero a la hora de implementarlo no encontrarme con ese problema, pero muchas gracias por ese detalle!
 
Última edición:
Bueno, ya tengo lo que seria bien configurado el PWM. Tengo una salida de 1 a 5v pero cuando le pongo una resistencia de 250ohms para medir los 4 a 20ma o cuando pongo el circuito ya armado mas arriba en este tema, sufre una caida de tension muy alta y nunca marca mas de 4mA y jamas pasa siquiera los 3Volts.

Espero alguien pueda ayudarm.

Anexo la imagen del circuito

ej1.png
 
Ya cambie la resolucion del ADC.

Use:

Vref a 1.027v

Resolucion de aproximadamente 1mV

Cada 1mV hay un cambio de 1 en el termometro, para logra la precision lineal de 0.1
agregue la linea: "conv2=conv*0.1;" y ahi quedo listo el termometro de preciosion 0.1 de 00.0 a 99.9.


Lo que no se, o ignoro es si puedo usar ese Vref

Si se puede usar ese Vref... pero yo recomendaria mas 2048 o incluso 4196mV asi te separas mas del ruido y solo haces divisiones entre 2 que son 2 corrimientos a la izquierda...

Lo puedes implementar con un TL431

http://www.fairchildsemi.com/ds/TL/TL431A.pdf
 
Buenas tardes a todos y todas! Un saludo desde Venezuela.

Estoy con este proyectito de Microcontroladores y Instrumentacion juntos. Consiste en un medidor de temperatura universal que involucra el ya conocido LM35, que pase a travez de un PIC 16F877A y produsca una salida de 4 a 20mA. Dichos valores, de corriente y temperatura deben mostrarse por una LCD. La precisión debe ser de 0.1, partiendo de 00.0 a 99.9.

Ya esta realizado lo que seria el sensor de temperatura y la salida de 1 a 5Volts.

Estoy usando un Vref = 1.027Volts y un tamaño de paso de 1mV.

El programa en pocas palabras se resume en lo que a continuacion anexo:

ADC=read_adc();
conv= (float)ADC;
conv2=conv*0.1;
lcd_gotoxy(1,1);
printf(lcd_putc, "temp %3.1f C"conv2);
DUTY= conv2 + 25;
set_pwm1_duty(DUTY);

Usando un divisor de timer2 de 125. Esto me estaria dando la salida de 1 a 5V.

A continuacion anexo imagen del circuito.

ej1.png


Entonces el problema radica en que cuando anexo este otro circuito al filtro de R=1k y C=1000uF se produce lo que no se si es una perdida de voltaje o que. pase de producir 1 a 5v a siquiera llegar a 3v :s

El circuito que estoy usando para pasar de 4 a 20mA es el siguiente:

4jwa.png


Espero alguien pueda ayudarme a solucionar este problema que realmente no se le ha dado una solucion exacta en el foro.

Salu2

EDIT: Lo mismo ocurre si le coloco una resistencia de 250 Ohms en paralelo a el capacitor de 1000uF.
 
Y Esta listo el sensor de temperatura! pasaba que como antes del opam habia una carga (las resistencias de 10 y 39k, estas se consumian todo el voltaje y jamas entraba el voltaje que era al opam.

El circuito final es el siguiente.

b09r.png
 
me pareció interesante lo que comentaban...
yo tengo un caso similar...
hice un termómetro con pic 16F88; todo funciona correctamente en la simulación y los códigos.
ahora el detalle es cuando lo armo tal cual como dejaré en la imagen el circuito, al probar en el protoboard no funciona como debería de funcionar...
según el lcd me muestra una temperatura ambiente de 15ºC luego al poner el sensor cerca de una lámpara incadescente, no sube mucho que digamos la temperatura; cuando en realidad pues el calor que irradia dicha lámpara es mayor, a lo que se muestra en el lcd.
he aquí les adjunto el circuito y el código...
el pic funciona con oscilador interno...
los códigos están echo en mikroc compiler...
 

Adjuntos

  • Código.png
    Código.png
    18.7 KB · Visitas: 72
  • Termometro.png
    Termometro.png
    46 KB · Visitas: 95
¿Y si en vez de imágenes, subes tu proyecto completo dentro de un archivo comprimido (Winzip o WinRAR)?
Los proyectos de mickroC usan varias configuraciones y librerías que es necesario saber. :rolleyes:
 
Última edición por un moderador:
aquí está el archivo rar del termometro...
como les dije el detalle está en la parte práctica es ahí donde no cambia mucho la temperatura al calentar el ambiente...
probe con termometro normal y me daba una temperatura de 40ºC...
mientras el que hice me daba una temperatura de 17ºC...
 

Adjuntos

  • lm135.rar
    94.3 KB · Visitas: 30
Atrás
Arriba