Problema con Termometro digital usando PIC18F4610 y LM35DZ

Hola a todos!

Estoy intentando hacerme un Termometro digital con 3 display de 7 seg utilizando un LM35DZ y un PIC18F4610.... pero tengo un problema... DEsde el Proteous el sistema anda perfecto, pero cuando arme la plaqueta el LM35 me mide cualquier temperatura y fluctua mucho su valor(Por ejemplo me marca 39 grados cuando no debe de estar haciendo mas de 22 aprox.).

Alguna idea? Estoy usando el conversor AD del mismo PIC (Adjunto codigo C).

Para realizar este experimento me base en otro Termetro que encontre en la red ... el odigo es sensillo.

Adjunto codigo y equema del proteous.

Saludos y muchas gracias!
Nacho
 

Adjuntos

  • yyy_318.h
    361 bytes · Visitas: 29
  • yyy_792.c
    1.2 KB · Visitas: 34
Si, eso mismo me paso al principio, me di cuenta proque el lm35 levanto un monton de temperatura. Luego de eso y fuera del circuito conecte el lm35 y me daba unos 220mv/250mv que serian unos 22/25 grados C...lo cual me parecio bien como temp ambiente...pero cuando lo conecto al circuito y mido el lm el misom tira 350mv/390mv lo cual me llamo mucho la atensión...

Alguna idea? se me ocurrio que podia llegar a tener ruido enel circuito y eso afecte la medicion puede ser?

gracias!
Nacho
 
Bueno, si lo mediste fuera del circuito y daba los valores bien, entonces el problema es el circuito al que se conecta el LM35.
Tendrías que poner un esquemático que incluya los componentes entre el LM35 y el conversor AD del pic.
Podría llegar a ser el offset de algún operacional (si es FET, si es bipolar no influye), corrientes de polarización, no sé, tendrías que poner el esquema para no especular en el aire.

Saludos
 
Disculpá pero no está, está el archivo .c y el .h y nada más. Probá subirlo nuevamente, y sí, lo más recomendable es poner una imagen (un print screen-> al paint y listo) porque los usuarios del foro usan distintos programas para esquemáticos y simulación.
 
Bueno, el circuito es simple, no tiene ningun operacional. Si fuera cuestión de ruido creo que la lectura no cambiaría tanto, y en el programa se hace un promedio de 200 muestras!. Además la salida del LM35 va directo al CAD, si la salida estuviera cargada por ahí el LM35 tendría que disipar potencia y habría autocalentamiento, pero no es el caso. Más aún la hoja de datos dice que el autocalentamiento es menor a 0.08ºC

Para eliminar el ruido eléctrico como sospechoso creo que le podrías poner un filtro antes de la entrada al CAD, un resistor serie y un capacitor, por decir algo, 100 Kohm y 100 nf.
Por otro lado, el LM35 está puesto al aire?, es decir, no está colocado sobre algun cuerpo sólido?. Por ahí al estar al aire la temperatura medida es más cambiante. Un sólido es masa térmica, en cierta forma es un filtro.

Problema de software.... si anda en el proteus no debería ser un problema del programa.

Resolución del CAD? (y que la tensión sea muy chica y sea afectada por ruido, tolerancia CAD, resolución CAD, etc), tenemos el LM35 que da 10mv/ºC, a temperatura ambiente sería 25ºC x 10 mV = 250 mV.
Es una tensión baja, pero no tanto para que el ruido afecte la medición del CAD (5V / 1024 = poco menos de 5mV, no me fije el error del CAD, pero no creo que se pase de 3 LSB = 15 mV).

Pusiste capacitores en las alimentaciones del PIC y del LM35? (entre alimentación y GND). Si el CAD toma la referencia de tensión de la alimentación del PIC y no es estable puede afectar la medición.

Bueno, mucha divagación por ahora, comentanos si tuviste algún avance (o retroceso :eek: ).
Saludos
 
Muchas gracias!
Voy a hacer las pruebas. El LM35 esta puesot al aire, probe poniendolo sobre algun solido y la temperatura se ajusta a la temp del solido pero luego comienza a variar.
No tengo puestos capacitores en la alimentacion, solo un 7805...deberia armar algun filtrito no?

saludos
nacho
 
Si, capacitores para cada integrado, y el RC para la salida del LM35 nunca está demás.
Estaba mirando la página de microchip para ver la hoja de datos de tu pic, pero no figura ningún pic18f4160, en el circuito dice pic18f4610, corregí eso en el título del post para que no haya confusión.

Che, ahora que veo el circuito.... no deberían ir resistencias en serie para los display de 7 segmentos?, no las pusiste?.
De ser así le estás pidiendo más corriente al PIC de la que puede dar, y podés quemar al PIC. Tene en cuenta que según la hoja de datos (página 313) la corriente máxima que puede dar/consumir cada terminal es de 25 mA.
Y además entre todos los pines no se tiene que proveer más de 200 mA, ni consumir más de 200 mA.

A ver si es eso...
 
Ya corregi el titulo, gracias no me habia dado cuenta del error.

Nop, no puse ninguna resistencia para los display.. ups! El circuito, como menciones, fue una adaptacion de uno que ya existia y que encontre en la web. Ahora cuando llegue a mi casa paso el url original de donde saque el esquema.
En el esquema original no figuraba resistencia ni circuito RC para el LM35 ni los displays.

Saludos y gracias
Nacho
 
Bueno, mi humilde opinión es que hay que respetar y cumplir las condiciones de trabajo que se dan en la hoja de datos del PIC.

Conectando directamente la salida del pic al display tenemos una corriente aproximada de:

(5V - 2V) / 25ohms = 120 mA

Claro que no van a salir 120 mA por la salida del PIC, porque la tensión de salida baja conforme aumenta la corriente.
Pero es jugarse a algo que no se conoce, si uno no sabe cual es exactamente la curva de carga de los pines del PIC, entonces lo mejor es no arriesgarse no?.

Por otro lado lo que digo es colocar una resistencia de 200 ohms o 120 ohms (dependerá de la caída de tensión del led) en serie, no es complicado de hacer.

Otra cosa a considerar es el manejo de la corriente total del PIC.
En el circuito se manejan 21 segmentos (3x7) en simultáneo, conduciendo una corriente (si se limita adecuadamente con las resistencias) de 20 x 21 mA = 420 mA. Claro, esto suponiendo que se muestra 888 en el display (todos los segmentos encendidos)

Pero fijate que la hoja de datos del PIC dice que la corriente máxima que pueden proveer en simultáneo todos los puertos es de 200mA.
Es decir, no habría que encender más de 10 segmentos a la vez.

Eso lo podrías arreglar por software haciendo que los displays no estén todos encendidos a la vez, controlando D1, D2 y D3. Mejor dicho, habría que hacer que solo 1 display esté encendido en cualquier instante.
Otra opción podría ser que en vez de manejar 20 mA por segmento reducirlo digamos a 15 mA, o, si todavía se pueden ver los números, 10 o 12 mA.

Otra cosa que podrías hacer es que los puertos en vez de proveer corriente tomen corriente (que la corriente entre a los pines del pic y no que salga) para 1 o 2 display's. Lo tendría que ver.
----------------------------------------------------------------------------
Hagamos una cosa, en definitiva lo que estoy diciendo es que te anda mal por el consumo de corriente, y que eso afecta la alimentación del PIC, lo que a su vez afecta el resultado de la conversión AD.
No podés probar el circuito sin usar los display 7 segmentos?. ¿Tenés un depurador estilo ICD2 a mano para ver los resultados que da la conversión AD con los display's apagados, y compararla con la que da con los display's encendidos?.

Si no tenés un depurador, igual podés dejar D1, D2, D3 = 0 (para que las salidas del PIC no manejen corriente), y medir con el tester la salida que da (es engorroso, habría que ver cuales segmentos están encendidos y rearmar el número, y además habría que medir todo a la vez).

¿Tenés un osciloscopio a mano?, podríamos usar una salida pwm que de un ancho de pulso proporcional a lo que mide el CAD.

O si utilizás un enlace RS-232 con la PC también se podría ver ahí.

O por software se podría hacer que si la lectura se aparte más de +/- 2ºC se encienda un led que nos indique lectura inestable.
---------------------

Bueno, seguro que esto te va a marear más que una botella de vodka cuando lo leas. Pero estaría bueno hacer esa comprobación: comparar la lectura del CAD con los displays encendidos contra la lectura con los displays apagados.

Saludos
 
Excelente información! Voy a proseguir con todo lo que me decis.
No posee osciloscopio, pero voy a hacer lo que me decis de desconectar los displys y medir las salidas.

Muchas gracias!
 
Ardogan,

Estuve viendo 1 alternativa y es utilizar solo el puerto B para enviar las seniales de nro del display activar de a uno los catodos.


El codigo seria asi
Código:
      output_b (dig[temp%10]);
      output_high (PIN_A3);            
      delay_ms (2); 
      temp = (long)(temp/10);
      output_b(dig[temp%10]);
      output_high (PIN_A2);
      delay_ms (2);
      temp = (long)(temp/10);
      output_b(dig[temp%10]);
      output_high (PIN_A1);
      delay_ms (2);

Esto lo vi en otros programas que usan display de 7 segmentos. Con esta estructura solo usaria 7 pines + las resitencia de 220ohm.

Lo intente simular pero los 3 display simepre me muestran el mismo nro. No se si esto es un efecto del simulador o cuando arme el circuito me va a pasar los mismo.

Del circuito que publique la unica modificacion es que los puertos C y D no se usan mas y los pines de los display 1 y 2 se unen a sus respectivos de B.

Saludos
Nacho
 
Ese código que publicaste me imagino que estará dentro de algún bucle repitiéndose no?.
Tené cuidado de no destruir el valor de la variable temp (que sea siempre el mismo al empezar el bucle).
 
Sip, ese fragmento de codigo reemplazaria al codigo orignal.

Completo el codigo seria asi.
Código:
long  temp =0;
   setup_adc_ports(AN0);
   setup_adc(ADC_CLOCK_INTERNAL);
   set_tris_a (0x01);

   FOR (;;)
   {
      output_b (dig[temp%10]);
      output_high (PIN_A3);            
      delay_ms (2); 
      temp = (long)(temp/10);
      output_b(dig[temp%10]);
      output_high (PIN_A2);
      delay_ms (2);
      temp = (long)(temp/10);
      output_b(dig[temp%10]);
      output_high (PIN_A1);
      delay_ms (2);
      grados_temperatura=0;
           
      FOR (i = 0; i<200; i++) //Tomas 200 muestras y las sumas en grados_temperatura
      {      
         grados_temperatura += read_adc ();
      }

      grados_temperatura = grados_temperatura / 200; //aqui calculas el promedio de 200 muestras;
      temp = (long) (( (long) grados_temperatura *4.88) / 10); // 5000mV / 1024 (10 bits) muestras posibles
      temp -= 2 ;     
   }

El problema es que en la simulacion con el proteous siempre se ve en los todos los display el ultimo digito, por ejemplo temp = 123 ..entonces se ve 333


saludos y muchas gracias
nacho
 
Me parece que te estás olvidando de poner a 0 el pin del dígito para desactivarlo antes de encender el siguiente. De lo contrario tenés encendidos los 3 en simultáneo


Código:
      output_b (dig[temp%10]);
      output_high (PIN_A3);           
      delay_ms (2);
      output_low (PIN_A3);
      temp = (long)(temp/10);
      output_b(dig[temp%10]);
      output_high (PIN_A2);
      delay_ms (2);
      output_low (PIN_A2);
      temp = (long)(temp/10);
      output_b(dig[temp%10]);
      output_high (PIN_A1);
      delay_ms (2);
      output_low (PIN_A1);
      grados_temperatura=0;
 
Bien, ahi hice la prueba... el codigo final no quedo lindo pero por ahora cumple su funcion.

Quedo asi
Código:
output_b (0x00);
      output_high (PIN_A3);
      output_low  (PIN_A2);
      output_low  (PIN_A1);
      output_b (dig[temp%10]);
      delay_ms (3);

      temp = (long)(temp/10);
      output_b (0x00);
      output_low  (PIN_A3);
      output_high (PIN_A2);
      output_low  (PIN_A1);      
      output_b(dig[temp%10]);
      
      delay_ms (3);

      output_b (0x00);
      output_low  (PIN_A3);
      output_low  (PIN_A2);
      output_high (PIN_A1);
      
      temp = (long)(temp/10);

      output_b(dig[temp%10]);
      delay_ms (4);

Desde la simulacion se dibujan independietemente cada digito, pero parpapeda mucho...supongo que sera por la emulacion que no es perfecto.

Lo intente probar el el protoboard pero demasiados cables dando vueltas y hacen mucho ruido, voy a armarme el pcb y probarlo directamente.

Te comento los resultados.

Muchas gracias!
Saludos
Nacho
 
Atrás
Arriba