UDAR Postat Februarie 1, 2014 Partajează Postat Februarie 1, 2014 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. Link spre comentariu
Vizitator sory7633 Postat Februarie 2, 2014 Partajează Postat Februarie 2, 2014 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
UDAR Postat Februarie 2, 2014 Autor Partajează Postat Februarie 2, 2014 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. Link spre comentariu
Postări Recomandate
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 contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum