SoloCodigo

Programación Específica => Microcontroladores => Mensaje iniciado por: underwol2 en Sábado 10 de Julio de 2010, 20:35

Título: control de temperatura en galpon
Publicado por: underwol2 en Sábado 10 de Julio de 2010, 20:35
los códigos fueron bajados de Internet  solo los e modificado y acondicionado  al proyecto
tengo que grabar en la EEPROM interna del pic 16f877a  el resultado de la variable  CAMBIO
cuya función es incrementar y decrementar el duty  
si hay algún tipo de corte de energía  vuelva  al ultimo dato guardado en la EEPROM interna del pic
se pretende con esta variable es controlar la intensidad de dos bombillos (focos) en serie para mantener el galpón a determinada temperatura  para pollitos de un día de nacidos
hasta el momento  e logrado el control a través de ccp1 (PWM) el control de estos bombillos (focos) y tomar la temperatura a través del lm35

gracias por las ayudas

el código y les dejo un adjunto para simularlo


#include <16F877A.h>
#device adc=10
#use delay(clock=8000000)
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOBROWNOUT               //No brownout reset
#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
#define LCD_TYPE 2
#include <lcd.c>
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

int x=0, y=0,z=0,a1=0,variador=0,ciclo2=0,vent=0;
float read1=0,temp=0,ciclo=0,porc=0,dc2=0,temper,medicion;
long dc=0,rev=0,vel=0;//pulso=0,pulso2=0;
int1 a=0,b=0,c=0,n=0,cambio=0;
#int_TIMER0
TIMER0_isr()   //timer en cada segundo
{
       
a=1;           //esta variable es para que en el while infinito mande los datos por    
               //tx cada segundo solamente
if(y==0&&b==0) //este if sirve para el encendido, b es para limitarlo a 15seg y
{              //si es 1 es encendido
x+=1;          //cada segundo se incrementa en 1

if(x<30)       //al llegar a los 15 segundos el ciclo de trabajo es igual al 50%
{
dc+=10.1;      //dc y dc2 son del mismo valor siempre pero son de diferente tipo de
dc2+=10.1;     //variable, una long y otra float
               //este incremento es para que en el encendido de 15seg se valla incrementando  
               //la velocidad en forma de rampa
}
else
{
dc=970.0; //en caso de que pasen los 15seg el ciclo de trabajo es igual al 99% /en porcentage 970.0 es 99%
dc2=970.0;   //para que arranque con 99% prenda las luses de los pollos silo pongo a 100% no arranca el incremento es de 5%

b=1;          //b es la variable que nos permite salir del ciclo de encendido
}
}

if(c==1)      //esta parte es para el apagado    
{
if(n==0)      
{
porc=dc/15;   //esto es para saber que porcentaje se decrementa cada segundo durante el  
n=1;          //apagado del motor
}

z+=1;          //z es para contar los 15seg de apagado
dc-=porc;      //es el decremento que hace
dc2-=porc;

if(z>=15)      //ya que pasaron los 15seg del apagado se reinician todas las variables
{              //para asi poder volverla a prender en forma de rampa
y=0;
b=0;
z=0;
dc=0;
dc2=0;
ciclo=0;
c=0;
x=0;
porc=0;
n=0;
}
}
}

#int_EXT //interrupcion externa para encendido y apagado
EXT_isr()
{

y=0;

if(b==1)
y+=1;

if(b==1&&y==2)
{
c=1;
}
}


void main()
{
   lcd_init();//Inicia LCD
   setup_adc_ports(RA0_RA1_RA3_ANALOG);
   setup_adc(ADC_CLOCK_DIV_8);
   setup_psp(PSP_DISABLED);
   setup_spi(FALSE);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32);
   setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1);
   setup_timer_2(T2_DIV_BY_16,255,1);  
   setup_ccp1(ccp_pwm);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   enable_interrupts(INT_TIMER0);
   enable_interrupts(INT_TIMER1);
   enable_interrupts(INT_EXT);
   enable_interrupts(GLOBAL);
   set_tris_b(0xff);
                 
   lcd_putc(" Termometron"); //Saca texto
   lcd_putc(" con LM35");     //Saca texto
   delay_ms(2000);
   lcd_putc("f");            //Limpia pantalla
   lcd_putc("TEMP:n"); //Saca texto
   
while(1)
{
if(input(pin_b2)&&cambio==0)  //decrementa el duty
{
ciclo2=ciclo;
if(b==1&&y==1)  //solo si ya alcanzo el 50%
{
delay_ms(100);  //demorar el rebote
if(ciclo>10)     //decrementa en 5% // el ciclo lo tenia en 10
{
dc-=51.15;
dc2-=51.15;
}
if(ciclo2<=10&&b==1&&y==1)  //limite menor del 0%
{
ciclo=10;
dc=0.0;  //esto seria el porcentage que quedara como minimo
dc2=0.0;  //para mas porcentage sedebe colocar en ambas iguales ejem 100.5
}
}
}

if(input(pin_b1)&&cambio==0)  //incrementa el duty
{
ciclo2=ciclo;
if(b==1&&y==1) //solo si ya alcanzo el 50% del ciclo de trabajo
 {
delay_ms(100); //demorar el rebote
if(ciclo<99)
{
dc+=51.15;     //aumenta en 5%  
dc2+=51.15;
}
if(ciclo2>=99&&b==1&&y==1) //limite maximo del ciclo de trabajo
ciclo=99;
 }
}

ciclo=dc2/10.23;    //para saber a cuanto equivale cada 1%
a1=temper;/*con temper se le pasa la variable a a1 ya que nose pude tener en int
y float lavariable temper en embas int y float da error */
variador=ciclo;

if(a==1)        //se hace 1 en el timer interno
{
printf("$%i|/%i",a1,variador); //manda datos por tx
a=0;                               //la iguala a cero para esperar a que pase un segundo mas
}
setup_adc (adc_clock_internal);
set_adc_channel (1);   //Elige canal a medir RA0
delay_Ms (1);
medicion=read_adc ();  //Hace conversión AD
setup_adc (adc_off);   //Apaga ADC
lcd_gotoxy(6,1); //Acomoda cursor LCD
lcd_putc(" ");   //Limpia ese sector de pantalla
lcd_gotoxy(6,1); //Acomoda cursor LCD
temper=medicion*(0.48875); //Pasa binario a °C
printf(lcd_putc," %02.1f xdfC n %i%% ",temper,variador);
set_pwm1_duty(dc);  //porciento del ciclo de trabajo



}

}