Jump to content
ELFORUM - Forumul Electronistilor
Sign in to follow this  
UDAR

Incarcator NiCd cu PIC12F675

Recommended Posts

Am început azi testele ”live” la încărcătorul din titlu. Tema de proiectare a fost : intrare 5V, iesire - două celule NiCd, curent de incarcare nominal 3A, terminarea încărcării prin sesizarea delta negativ, terminarea de protecție prin - depășirea tensiunii maxime, depăsirea temperaturii maxime, depășirea timpului maxim de încărcare. Pornește prin introducerea bateriei sau apariția tensiunii de alimentare cu bateria pusă , se oprește prin scoaterea bateriei sau , evident, întreruperea alimentării. Face încărcare de menținere dacă bateria este lăsată mai mult timp în aparat. Nu permite curent invers. Semnalizează cu LED-uri starea procesului precum și erorile.

Cam asta, pe scurt . Atașez codul - în faza asta, unele chestii vor dispărea și unele valori ( timpi, etc ) se vor modifica. De asemenea atașez schema.

 

const unsigned int Ugol = 840, Umin = 480 , Umax = 700 ,  Temp_max =  500, Time_test = 240, Timer_max = 2000, Time_rest = 20;// Ugol = 4,2V ; Umin = 2,4V/ ;   Umax = 3,5V ;   Temp_max corespunde la circa 1,65V  ;// Time_test = 4min = 100ms*2400 , Timer_max = 100min = 3s*2000, Time_rest = 60min = 250ms*14400const char Minime = 4;char j, k, msg, nr_min, osc ;unsigned int i, timer, Ucrt, Umas, U_max_crt, temp;unsigned int tensiune (char );void main() {  asm                           {                    // Calibrez oscilatorul   bsf STATUS, RP0;   call 0x3FF  ;   movwf OSCCAL;   bcf STATUS, RP0;  }        OPTION_REG = 0;  INTCON = 0;  TRISIO = 3;  ANSEL = 3;  WPU = 0;  ADCON0 = 129;  GPIO = 0;     while (1)                      {    Umas = Ugol;    msg = 0;    while (Umas >= Ugol)         {                    // testez daca tensiunea pe baterie < Ugol = daca exista baterie pusa     Umas = tensiune(0);                              // Aici fac masurarea    }                                                      // Testez cum masoara   - pare-se ca bine -    while (Umas < Umin)           {                    // testez daca U element > 1,2V  , daca nu fac o incarcare de test      for (i=0; i<Time_test ; i++)        {            // incarc timp de maxim 4 minute cu I/5       GPIO.B2 = 1;       Delay_ms(20);       GPIO.B2 = 0;       Delay_ms(80);       Umas = tensiune(0);       if (Umas  > Ugol)          {                    // testez daca nu s-a extras bateria intre timp        msg = 6;                                       // incarcator in gol        break;       }       if (Umas > Umax)           {                    // testez daca  bateria nu are impedanta excesiv de marita        msg = 1;                                       // baterie defecta        break;       }      }      break;    }         Delay_ms(1000);                                   // Odihna inaintea masuratorii          Umas = tensiune(0);                               // testez daca U element > 1,2V   la sfarsitul inc_test          if (Umas < Umin)  msg=1;                          // daca nu , Eroare 1 , baterie defecta     else                            {     GPIO.B2 = 1;                                      // Incarc 30 secunde pentru a evita delta negativ fals      for (i=0;i<120;i++)            {       Umas = tensiune(0);        if (Umas > Ugol)             {         msg =6;         break;        }       Delay_ms ( 250);      }      GPIO.B2 = 0;    }      timer = 0;      U_max_crt = 0;      nr_min = 0;          while (msg==0)                 {                    // bucla principala de incarcare   - ies cu o valoare msg > 0      GPIO.B2 = 1;      Umas = tensiune(0);                               //  Masor tensiunea      if (Umas > Umax) msg = 2;                         //  Compar cu maximul admisibil   ; ies cu Eroare 2            if (Umas > U_max_crt)        {                    //  Compar cu maximul curent        GPIO.B5 = 1;                                    // Test. Semnalizez MAXIM        Delay_ms(100);        GPIO.B5 = 0;        nr_min = 0;      }      else                        {                     // Constat inceputul scaderii        GPIO.B4 = 1;                                    // Test. Semnalizez MINIM        Delay_ms(100);        GPIO.B4 = 0;        nr_min ++;        if (nr_min >= Minime) msg = 5;                  // Confirm scaderea  , ies cu Ready      }            U_max_crt = Umas;            temp = tensiune(1);                               // Masor temperatura      if (temp < Temp_max) msg = 3;                     // Compar cu Temp_max ; sensul este inversat  ; ies cu Eroare 3            Delay_ms(3000);                                   // Vreau masuratori relativ rare pentru a depista o tendinta certa      timer ++;      if (timer >= Timer_max) msg = 4;                  // Verific daca nu a expirat timpul   ; ies cu Eroare 4                                                        // Sfarsitul buclei principale de incarcare    }    if (msg==5)                     {                   // Am iesit cu ready  = Bucla de mentinere        GPIO.B2 = 0;                                    // Pentru orice eventualitate !        GPIO.B4 = 1;                                    // Aprind LED-ul verde        timer = 0;        Umas = 0;      while ((Umas < Ugol)&&(timer < Time_rest ))  {    // Timp de odihna de 1 ora         Delay_ms(250);         timer ++;         Umas = tensiune(0);                            // Masor sa detectez scoaterea bateriei      }      while (Umas < Ugol)                          {    // Trec la regim de trickle charge   cu I/60 ( 50 mA)          GPIO.B2 = 1;          Delay_ms(5);          GPIO.B2 = 0;          Delay_ms(295);          Umas = tensiune(0);                           // Masor sa detectez scoaterea bateriei      }            msg=0;                                            // S-a scos bateria      GPIO.B4 = 0;    }    if (msg==1)                    {                    // Am iesit cu Eroare 1          = Bucla de afisare a Erorii 1        GPIO.B2 = 0;                                    // Pentru orice eventualitate !        GPIO.B5 = 1;                                    // Aprind LED-ul rosu  continuu        Umas = 0;      while (Umas < Ugol)          {                    // Astept scoaterea bateriei        Delay_ms(250);        Umas = tensiune(0);                             // Masor sa detectez scoaterea bateriei      }    }    if (msg > 1 & msg < 5)         {                    // Am iesit cu Eroare 2-3-4        = Bucla de afisare a Erorilor 2-3-4    ---De corectat inapoi        GPIO.B2 = 0;                                    // Pentru orice eventualitate !      while (Umas < Ugol)          {                    // Astept scoaterea bateriei        for (i=0; i<msg; i++)      {                    // Pulsez ledul rosu de 'msg' ori         GPIO.B5  = 1;         Delay_ms(250);         Umas = tensiune(0);                            // Masor sa detectez scoaterea bateriei         if (Umas>= Ugol) break;         GPIO.B5 = 0;         Delay_ms(250);        }        k = 8-msg;        for (i=0; i<k; i++)        {                     // Fac pauza diferenta pana la 2 secunde         Umas = tensiune(0);                             // Masor sa detectez scoaterea bateriei         if (Umas>= Ugol) break;         Delay_ms(500);        }      }    }     if (msg > 5) GPIO = 0;                               // Baterie lipsa = totul oprit  }                                                       // sfarsit while (1)}                                                         // sfarsit main() unsigned int tensiune (char x) {  j = 0;  Ucrt = 0;  while (j<64)                  {   Ucrt += ADC_Read(x);   Delay_us(10);   j ++;  }  Ucrt = Ucrt>>6;  return Ucrt; }

PS1. E în mikroC

PS2. Este primul ( mai serios ) în C.

post-14234-139829749725_thumb.jpg

Share this post


Link to post
Share on other sites

Guest sory7633

vad ca te pricepi bine la programare nu ai putea sa-mi prog un pi12f629 pentru un regulator de turatie dacai-ti dau schema Mi-am luat un prog de la un baiat dar cred ca nu scrie si 12f629 si nici nu sprea stiu sa bag hexul poti sa ma ajuti

Share this post


Link to post
Share on other sites

Cat de bine mă pricep ... am scris mai sus. Este primul meu proiect mai ”serios” în C. Dar dacă pot să te ajut , cu plăcere.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.