ELFORUM - Forumul Electronistilor

## 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. ##### Share on other sites 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 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.

## 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. ×   Pasted as rich text.   Paste as plain text instead

Only 75 emoji are allowed.

×   Your previous content has been restored.   Clear editor

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

×

×

• #### Activity

×
• Create New...