lunes, 21 de octubre de 2013

pic controlador de garga solar

  Les presento un controlador de carga basado en microcontrolador pic16f877a y su programa hecho en lenguaje c

// * NOMBRE DEL PROYECTO
//   CONTROLADOR SOLAR
// *
//     (R) DAVALY SUCHILQUITONGO
// * DESCRIPCION
//    CONTROLA EL NIVEL DE CARGA CUANDO LLEGA A
//    A LA CARGA MAXIMA UN RELAY SE DESACTIVA
// * CONFIGURACION DE PRUEBA
//     MCU:             PIC16F877A
//     Dev.Board:       DRAGON
//     Oscillator:      HS, 04.0000 MHz
//     Otros Modulos:   GLCD EN PUERTOS B Y D
//     SW:              mikroC v7.0
// * NOTAS:
//     EL RELAY SE CONECTA EN EL PUERTO RC0





unsigned char ch;
unsigned int adc_rd;
long tlong;

 void porcentaje() {                      // crear funcion de porcentaje
  adc_rd  = ADC_read(2);                 // toma valor del puerto ra2
  Glcd_Set_Font(cha8x8, 8, 8, 32);       // asignar tipo de letra
  tlong = (long)adc_rd * 5000;           // covertir la lectura de adc a voltios
  tlong = tlong / 1023;                  // 0..1023 -> 0-5000mV
  ch     = tlong / 1000;
  Glcd_Write_Char(48+ch,7,4,1);
  ch    = (tlong / 100) % 10;
  Glcd_Write_Char(48+ch,14,4,1);
  Glcd_Write_Char(46,21,4,1);
  ch    = (tlong / 10) % 10;
  Glcd_Write_Char(48+ch,28,4,1);
  Glcd_Write_Char('V', 35, 4, 1);
  tlong = (long)(adc_rd-88) * 5000;           // porcentaje
  tlong = tlong / 1023;
  ch     = tlong / 1000;
  Glcd_Write_Char(48+ch,98,7,1);
  ch    = (tlong / 100) % 10;
  Glcd_Write_Char(48+ch,106,7,1);
  ch    = (tlong / 10) % 10;
  Glcd_Write_Char(48+ch,112,7,1);
  Glcd_Write_Char(37,120,7,1);
  Glcd_Set_Font(FontSystem5x8, 5, 8, 32);       //cambio de tipo de letra
  Glcd_Write_Text("Carga de Bateria",1,7,1);
  if (adc_rd >= 290)
           {
           PORTC.F0=1;  //5 v en rc0
           }
           else
           {
           PORTC.F0=0;   //0 v en rc0
           }
     if (adc_rd <= 250)
           {
           Glcd_Write_Text("50",1,6,1);
           }
           else
          
           {
          Glcd_Write_Text("60",1,6,1);
           }
           if (adc_rd >= 260)
           {
           Glcd_Write_Text("60",1,6,1);
           }
           else
           {
          Glcd_Write_Text("70",1,6,1);
           }
           if (adc_rd >= 270)
           {
           Glcd_Write_Text("70",1,6,1);
           }
           else
           {
          Glcd_Write_Text("80",1,6,1);
           }
           if (adc_rd >= 280)
           {
           Glcd_Write_Text("80",1,6,1);
           }
           else
           {
          Glcd_Write_Text("90",1,6,1);
           }
}


  void main() {
  INTCON = 0;                                 // apagar interrupciones
//  ANSEL  = 0x04;
  TRISA  = 0x04;
 // ANSELH = 0;
  ADCON1     = 0x82;
  TRISA      = 0xFF;
  TRISC      = 0;
  TRISC      = 0;
  Glcd_Init(&PORTB, 0, 1, 2, 3, 5, 4, &PORTD); //configurar GLCD
  Glcd_Image( solar );                    //imprimir el fondo
  Delay_ms(800);
  ADCON1     = 0x82;                      // configurar voltaje como referencia
  TRISA      = 0xFF;
  TRISA = 0xFC;                           // asignando puerto a como entrada

  while (1) {
   adc_rd  = ADC_read(3);
   Glcd_Set_Font(cha8x8, 8, 8, 32);       //cabio de tipo de letra
   tlong = (long)adc_rd * 5000;           // covertir la lectura de adc a voltios
   tlong = tlong / 1023;
   ch     = tlong / 1000;
   Glcd_Write_Char(48+ch,81,5,1);
   ch    = (tlong / 100) % 10;
   Glcd_Write_Char(48+ch,88,5,1);
   Glcd_Write_Char(46,95,5,1);
   ch    = (tlong / 10) % 10;
   Glcd_Write_Char(48+ch,102,5,1);
   Glcd_Write_Char('V', 110, 5, 1);
   porcentaje();                         //ejecutar funcion
   Delay_ms(500);                        // esperar 1 milisegundo
  }
}//~!                                      // ir a while 1

No hay comentarios:

Publicar un comentario