Sari la conținut
ELFORUM - Forumul electronistilor

Incarcator NiCd cu PIC12F675


UDAR

Postări Recomandate

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

Link spre comentariu
  • Răspunsuri 2
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • UDAR

    2

Zile populare

Top autori în acest subiect

Imagini postate

Vizitator 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

Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări