Termostato electronico con pic18f452

Saludos.

Mi duda es la siguiente, estoy armando un circuito para un termostato de incubadora, estoy usando un LM35 y el pic 18F452.

El problema es que no logro mantener una temperatura media, o al menos, hacer que los cambios en el control de la temperatura no sean tan rapidos.

Tengo 2 condiciones en el programa, la primera, que si la temperatura es menor a 37.7 grados, el pic da una salida a un transistor para que encienda el rele y por ende la fuente de calor.

La segunda condicion dice que si la temperatura llega a 39 grados o mas, se apaga la fuente de calor, y el programa debe esperar a que la temperatura baje hasta los 37.7 grados para que vuelva a iniciar el ciclo.

Todo parece funcionar bien, la cosa es que cuando llega a los 39 grados y se apaga el rele, se vuelve a encender casi de forma instantanea, un par de segundos y se enciende y apaga y asi. Sinceramente no creo que se puedan perder casi 2 grados en solo un par de segundos y mas si el ambiente ya se encuentra tibio. Ya intente colocar el sensor a mayor distancia para compensar un poco la perdida de temperatura pero aun asi observo el mismo resultado.

No se si sera cosa del programa o algo en mi conexion. Entre cada condicion del programa he puesto retardos (delay_ms) para que el cambio a la condiciones no sea tan rapido pero ni asi.

Espero su respuesta y ayuda.

Gracias.

pd: anexo parte del codigo de mi programa por si va por ahi el error.



if (t2>39)///activacion de cooler para regular temperatura a nivel ideal
goto b;
delay_ms(300);

delay_ms(300);

if( t2<37)///temperatura ideal de la incubadora alcanzada, off del cooler
output_high(pin_b0);///lampara encendida mientras permanezca temp. ideal o menor
delay_ms(300);
goto a;

delay_ms(300);
goto temp;///fin de ciclo de la temperatura
delay_ms(300);
b:
output_high(pin_b1);/// activacion del cooler para bajar la temperatura
output_low(pin_b0);///lampara apagada mientras cooler reestablece temp.
output_high(pin_b4);///pin de verificacion
delay_ms(500);
goto temp;
delay_ms(300);
a:
output_low(pin_b1);/// off del cooler, temperatura alcanzada
output_low(pin_b4);/// off pin de verificacion
delay_ms(500);
goto temp;


}
 
Hola,

Yo hice el mismo circuito pero con un 16f88. Me pasaba lo mismo que describes, y el problema era ruidos eléctricos que afectan la entrada del conversor A/D del Pic. La solución fue filtrar con un condensador de 10uf la salida del LM35, e igualmente filtrar la alimentación del pic con varios condensadores en paralelo entre VCC y GND, asi: 470uf, 100nf, 220uf, 100nf, 100uf, 10nf, 10uf, 10nf, 1uf, espaciados 1/2 centímetro (lo hice aparte de la placa principal), esto es para formar un filtro LC con las pistas del PCB.

También puede ser que este mal tu programa, lo revisaría pero no entiendo el C.

Saludos.
 
gracias por tu comentario. ya habia colocado un capacitor a la salida del sensor pero sin mucho cambio. lo del ruido es verdad y en otros proyectos me ha pasado, intentare tu solucion. yo no entiendo ensamblador si no lo traducia al otro lenguajr.
 
como estas, mi programa es muy parecido al tuyo. estoy haciedno un invernadero pero con assembler. la verdad estoy empezando a utilizar el lenguaje c y me gustaria ver tu programa y si te sirve el mio con mucho gusto te lo envio. en cuanto a tu problema definitivamente es el ruido. yo tenia el mismo problema y de esa forma lo corregi. Como no cumplo las Normas me editaron el mensaje @ Politicas.com
 
Última edición por un moderador:
Hola! Yo haría un filtrado por software y aumentaría el tiempo de respuesta del controlador. Para eso por ejemplo tomaría 10 muestras por segundo y calcularía la media:

Código:
t1=0;
for (i=0;i<10;i++) {
t1+=read_adc();
delay_ms(100);
}
t1/=10;

Con esto quitas un poco el ruido eléctrico y obtienes una muestra por segundo. Luego si quieres filtrar más el ruido y retrasar un poco la respuesta del sistema respecto a las variaciones de temperatura puedes usar una media ponderada.

Código:
t2=(x*t2+y*t1)/(x+y)
if (t2>38) {
//parar calentador
}
if (t2>39) {
//arrancar el enfriador
}
if (t2<37) {
//parar el enfriador
}
if (t2<36) {
//arrancar el calentador
}

Cuanto mayor sea x con respecto a y, más lento será el regulador y menos propenso al ruido.

Por otro lado, si quieres reducir el ruido del todo utiliza un sensor digital y no el LM35, por ejemplo un DS18S20+ de Maxim, va muy bien y es muy fácil conseguir un sample.
 
Atrás
Arriba