TODOPIC

Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: vicent en 19 de Febrero de 2007, 11:04:17

Título: Termómetro digital LM35 + 7segmentos + 16F88
Publicado por: vicent en 19 de Febrero de 2007, 11:04:17
Hola a todos!

Tengo un pequeño proyecto hecho de un termómetro digital con un pic 16F88, un sensor LM35 y 3 displays 7 segmentos para mostrar la información.
El termómetro funciona, pero hay rangos de temperatura en los que se ralla.
Os pongo el esquema y el código a ver si me podéis echar una mano.

Aquí tenéis el .h que no me deja adjuntarlo
Código: [Seleccionar]
#include <16F88.h>
#device adc=10

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz
#FUSES PUT                      //Power Up Timer
#FUSES MCLR                     //Master Clear pin enabled
#FUSES BROWNOUT                 //Reset when brownout detected
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOPROTECT                //Code not protected from reading
#FUSES FCMEN                    //Fail-safe clock monitor enabled
#FUSES IESO                     //Internal External Switch Over mode enabled

#use delay(clock=4000000)


Muchas gracias a todos.
Un saludo. Au.
Título: Re: Termómetro digital LM35 + 7segmentos + 16F88
Publicado por: SavageChicken en 19 de Febrero de 2007, 15:16:44
Hola.

   Te aconsejo que intentes usar un simulador.
   El tema consiste en que imites las condiciones en donde el termometro falla y veas que es lo que hace tu programa en esas circunstancias, creo que si sabes el rango de temperatura en el que segun tu el termómetro "se ralla" puedes simular las condiciones que se dan en las entradas del PIC y entonces ver el patrón que sigue el programa que has realizado.
   Espero esto te ayude.

Salud  8)
Título: Re: Termómetro digital LM35 + 7segmentos + 16F88
Publicado por: vicent en 19 de Febrero de 2007, 16:22:09
Gracias por el consejo.

Me extraña que falle, el código es muy simple.
He visto que hay varios simuladores, ¿me aconsejáis alguno en concreto para este proyecto?

Un saludo. Au.
Título: Re: Termómetro digital LM35 + 7segmentos + 16F88
Publicado por: Mario en 20 de Febrero de 2007, 04:10:28
Hola.
Supongo que "se ralla" es similar a que no funciona correctamente.

Antes de empezar con la simulación te recomendaría que quitaras el sensor y pusieras voltaje variable para que simules la temperatura de manera rápida, de esta forma tendrás una mejor idea de qué es lo que falla, el termómetro o el programa.

Puedes simular con un programa que se llama Proteus o cualquier otro en su defecto (que tenga capacidad de simular PICs).
Título: Re: Termómetro digital LM35 + 7segmentos + 16F88
Publicado por: julianjulia en 21 de Febrero de 2007, 17:50:14
Con ese micor y en C no he echo nada, pero en asm sí, de todas formas tu problema puede ser que el tiempo del conversor sea demasiado rapido y te aconsejaria poner un condensador de 1 microfaradio en el sensor para estabilizar la señal y los tiempos de acceso al conversor adc sean más lentos. un saludo te adjunto mi pagina con mis proyectos.


www.jr.es.mw
www.jr.3a2.com
Título: Re: Termómetro digital LM35 + 7segmentos + 16F88
Publicado por: reiniertl en 21 de Febrero de 2007, 18:19:07
El problema de tu código está en que no haces un filtrado de la señal y es por eso que no te muestra un valor estable de temperatura, a continuación te muestro el código que considero debes mejorar:

Código: C++
  1. i++;
  2.       if(i == 10)
  3.       {
  4.         grados_temperatura = (long)read_adc();
  5.         i = 0;
  6.       }

Como puedes ver solamente tomas una muestra cada cierto tiempo y esa no es una buena práctica, ya que cualquier ruidito o una simple variación en la señal que entrega el sensor puede afectarte el código. Una solución es poner un filtro a la entrada del PIC cómo ya te especificaron, sin embargo eso todavía no resuelve el problema de la mejor forma. Es bueno además ponerle un filtro por software, cómo hacerlo:

Registras un montón de mediciones del conversor y las promedias, este método es sencillo pero eficaz, puedes mejorarlo calculando el valor modal o aplicando promedios por mínimos cuadrados, pero creo que con este simple método bastaría. Prueba lo siguiente:

Código: C++
  1. for(;;)
  2.    {
  3.  
  4.      //Movi el calculo de la temperatura para el final del ciclo
  5.  
  6.       output_b(dig[temp%10]);
  7.       output_high(PIN_A4);
  8.       delay_ms(2);
  9.  
  10.       temp = (long)(temp/10);
  11.       output_b(dig[temp%10]);
  12.       output_high(PIN_A3);
  13.       delay_ms(2);
  14.  
  15.       temp = (long)(temp/10);
  16.       output_b(dig[temp%10]);
  17.       output_high(PIN_A2);
  18.       delay_ms(2);
  19.  
  20.  
  21.       for(i=0; i<200;i++)  //Tomas 200 muestras y las sumas en grados_temperatura
  22.        {
  23.          grados_temperatura+= read_adc();
  24.        }
  25.       grados_temperatura =/ 200; //aqui calculas el promedio de 200 muestras
  26.  
  27.       temp = (long)(((long)grados_temperatura*4.88)/10); // 5000mV / 1024 (10 bits) muestras posibles
  28.       temp -= 2 ; //Le restamos 2 grados de error
  29.    }
  30. }

Tendrás que probar para ver si las 7seg no se apagan antes de que tomes las 200 muestras, si es así entonces puedes reducir el número de muestras o implementar el sistema de otra forma.

saludos reiniertl
Título: Re: Termómetro digital LM35 + 7segmentos + 16F88
Publicado por: vicent en 21 de Febrero de 2007, 21:52:34
Muchas gracias a todos por molestaros en contestar.

reiniertl, efectivamente, era eso que dices. El caso es que lo pensé cuando lo programé, pero creía que no hacía falta hacerlo así, ya he visto que estaba equivocado.

Si pongo un condensador de 1uF electrolítico, apenas se nota diferencia, baja un grado la temperatura, pero nada más. ¿Me aconsejáis dejarlo de todas formas?

Ya funciona perfectamente, creo.

Por cierto, hay un pequeño error de sintaxis en el código de reiniert, supongo que será por las prisas.
Un minipunto para quién lo encuentre, jejejej.

Un saludo. Au.
Título: Re: Termómetro digital LM35 + 7segmentos + 16F88
Publicado por: julianjulia en 22 de Febrero de 2007, 08:08:29
vamos a ver yo tengo puesto uno de 4 microfaradios, por otro lado yo en C no se, pero yo lo tengo echo en Asm y sólo pillo una muestra, lo que pasa que como dije anteriormente el pic que utilizo hay que configurar muy bien el conversor adc para no tener errores, os adjunto el ASM. (hay parte del codigo que uso para otros proyectos)
de todas formas no te deberia bajar un grado la temperatura con el condensador, un saludo
Título: Re: Termómetro digital LM35 + 7segmentos + 16F88
Publicado por: SavageChicken en 22 de Febrero de 2007, 08:53:49
Citar
Por cierto, hay un pequeño error de sintaxis en el código de reiniert, supongo que será por las prisas.
Un minipunto para quién lo encuentre, jejejej.

Lo encontre!!!!!  :-/ :-/

En el cálculo del 3º dígito dice:

      temp = (long)(temp/10);
      output_b(dig[temp%10]);


Y enrealidad debiera dividirse por 100.


Gane, Gane, Ganeeeeee!!!!!!
jajajajajaja :-/ :-/ :-/ :-/ :-/ :D :D :D :D

Salud  8)
Título: Re: Termómetro digital LM35 + 7segmentos + 16F88
Publicado por: reiniertl en 22 de Febrero de 2007, 10:14:13
Efectivamente, puedes dejar el capacitor pero sería bueno que pongas un amplificador seguidor de voltaje entre el capacitor y el sensor de tempertaura. La idea es buefferear la señal del sensor porque entre capacitor y el conversor AD le pueden estar robando un poco de corriente y haya una caída de tensión que te provoque la bajada de temperatura. De todos modos si resuelves con promediar las temperaturas y no te hace falta tomar una sola muestra (puedes tomar las muestras y no se afecta el funcionamiento del equipo), entonces quita el capacitor y todo lo demás y deja que el programa se encargue de todo lo demás. Por otro lado la temperatura no es una variable que cambia bruscamente en la mayoría de las aplicaciones y te puedes dar el lujo de hacer este tipo de filtraje. Si fuese una cámara digital, por ejemplo, la cosa se pondría fea.

Por cierto si hay algún error en el código que sea dentro del for() porque lo demás lo dejé como estaba. De todos modos si hay errores hay que correjirlos, donde quiera que estén.

Saludos Reinier
Título: Re: Termómetro digital LM35 + 7segmentos + 16F88
Publicado por: Rulo en 22 de Febrero de 2007, 14:45:33

       Pues yo de error veo esto...

          ------->    grados_temperatura =/ 200;

           Deberia ser

          ------------>  grados_temperatura /= 200;
                                                            ?????'''
Título: Re: Termómetro digital LM35 + 7segmentos + 16F88
Publicado por: reiniertl en 22 de Febrero de 2007, 14:59:41
Sin lugar a dudas mi mano izquierda se está volviendo más rápida que la derecha, al menos en el teclado. Aunque soy derecho:  :mrgreen: :mrgreen: :mrgreen:

Gracias por la aclaración  :-) :-) :-)

Reinier
Título: Re: Termómetro digital LM35 + 7segmentos + 16F88
Publicado por: vicent en 23 de Febrero de 2007, 01:32:08
El amplificador no se lo voy a poner, para lo que necesito, un par de grados de temperatura no me suponen un problema, acepto hasta unos 5 grados de error.
Como bien comentas, con promediar las temperaturas, tengo suficiente.

Savage, ese error que dices tu, no es error de sintaxis, es error lógico (¿?) en todo caso. De todas formas, eso no era, eso está bien.
rulo, efectivamente, el error era ese. Yo no me dí cuenta hasta que me chivó el compilador, jejeje.

Muchas gracias a todos los que me habéis ayudado.

Un saludo. Au.
Título: Re: Termómetro digital LM35 + 7segmentos + 16F88
Publicado por: soymoe en 01 de Diciembre de 2010, 21:51:31
Yo estoy haciendo lo mismo en asm. Alguien tiene la rutina para el calculo de la temperatura hecha en assembler?
Título: Re: Termómetro digital LM35 + 7segmentos + 16F88
Publicado por: shinjiik en 31 de Mayo de 2011, 00:05:04
Hola, actualmente estoy trabajando con un micro 877A midiendo 4 variables analógicas, el problema es que el LM35 presenta ruido al hacer la conversion AD, ya proble solo conectando el sensor y midiendo y aparentemene el sensor es estable. No sé si alguien podría ayudarme con eso. Ya intenté tomar las medidas 6 veces y promediarlas, pero aun asi no obtengo buenos resultados. Gracias
Título: Re: Termómetro digital LM35 + 7segmentos + 16F88
Publicado por: Suky en 31 de Mayo de 2011, 00:15:43
Estas esperando el tiempo adecuado entre cambios de entradas analógicas? Prueba agregándolo una resistencia de 1k entre el LM35 y el pin del microcontrolador.


Saludos!
Título: Re: Termómetro digital LM35 + 7segmentos + 16F88
Publicado por: soymoe en 31 de Mayo de 2011, 11:20:50
Yo pondria un AO no inversor para amplificar la salida del LM35 y elevarla a 5v a fondo de escala, con eso eliminarias las fluctuaciones debidas a los ruidos y la poca salida del LM35.
Título: Re: Termómetro digital LM35 + 7segmentos + 16F88
Publicado por: rivale en 31 de Mayo de 2011, 15:52:57
puedes usar un AO en configuracion de seguidor, en mi experiecnia he visto que el ruido del lm35 se presenta cuando tienes lejos el sensor del pic, pruedes probar poniendo un filtro pasivo para que te elimine el ruido. a mi me ha funcionado bien