Autor Tema: Termómetro digital LM35 + 7segmentos + 16F88  (Leído 13747 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado vicent

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 144
    • Web de Vicent
Termómetro digital LM35 + 7segmentos + 16F88
« 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.

Desconectado SavageChicken

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 931
Re: Termómetro digital LM35 + 7segmentos + 16F88
« Respuesta #1 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)
No hay preguntas tontas...
Solo hay tontos que no preguntan.

Desconectado vicent

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 144
    • Web de Vicent
Re: Termómetro digital LM35 + 7segmentos + 16F88
« Respuesta #2 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.

Desconectado Mario

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 873
Re: Termómetro digital LM35 + 7segmentos + 16F88
« Respuesta #3 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).
La buena administración es utilizar el sentido común y la regla de oro; aunque el sentido común no es tan común como quisiéramos que fuera y, quien tiene el oro, hace las reglas.
George Terry

"A loser will defeat a genius with hard work"
Rock Lee

Desconectado julianjulia

  • PIC10
  • *
  • Mensajes: 5
Re: Termómetro digital LM35 + 7segmentos + 16F88
« Respuesta #4 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

Desconectado reiniertl

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1187
Re: Termómetro digital LM35 + 7segmentos + 16F88
« Respuesta #5 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

Desconectado vicent

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 144
    • Web de Vicent
Re: Termómetro digital LM35 + 7segmentos + 16F88
« Respuesta #6 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.

Desconectado julianjulia

  • PIC10
  • *
  • Mensajes: 5
Re: Termómetro digital LM35 + 7segmentos + 16F88
« Respuesta #7 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

Desconectado SavageChicken

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 931
Re: Termómetro digital LM35 + 7segmentos + 16F88
« Respuesta #8 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)
No hay preguntas tontas...
Solo hay tontos que no preguntan.

Desconectado reiniertl

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1187
Re: Termómetro digital LM35 + 7segmentos + 16F88
« Respuesta #9 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

Desconectado Rulo

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 168
Re: Termómetro digital LM35 + 7segmentos + 16F88
« Respuesta #10 en: 22 de Febrero de 2007, 14:45:33 »

       Pues yo de error veo esto...

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

           Deberia ser

          ------------>  grados_temperatura /= 200;
                                                            ?????'''

Desconectado reiniertl

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1187
Re: Termómetro digital LM35 + 7segmentos + 16F88
« Respuesta #11 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

Desconectado vicent

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 144
    • Web de Vicent
Re: Termómetro digital LM35 + 7segmentos + 16F88
« Respuesta #12 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.

Desconectado soymoe

  • PIC18
  • ****
  • Mensajes: 456
    • El blog de Moe
Re: Termómetro digital LM35 + 7segmentos + 16F88
« Respuesta #13 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?
« Última modificación: 06 de Enero de 2011, 20:50:53 por soymoe »

Desconectado shinjiik

  • PIC10
  • *
  • Mensajes: 1
Re: Termómetro digital LM35 + 7segmentos + 16F88
« Respuesta #14 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