Jump to content
ELFORUM - Forumul electronistilor

Încărcător acumulatori NI-MH cu Arduino Uno


Recommended Posts

Bună seara! Doresc să construiesc încărcătorul pentru acumulatori NI-MH de la adresa:

https://arduinoelectronics.wordpress.com/2012/04/20/smart-nimh-battery-power-charger-based-on-attiny85/comment-page-1/?moderation-hash=362ce8ed17a81ab33021a699bdd02789&unapproved=684&utm_source=pocket_mylist

În proiect se folosește microprocesorul AtTiny85, dar eu, neavând deocamdată acest microprocesor, vreau să folosesc în locul acestuia placa Arduino Uno. Întrebarea mea este: cum trebuie să conectez circuitul la Arduino? Trebuie legată masa circuitului la masa Arduino? Am măsurat tensiunea între pinul 5 și pinul 7 din circuitul de încărcare (fără microprocesor montat) și îmi indică o valoare de 2V, (circuit alimentat la 12V, cu acumulator conectat)-este normal? Vă întreb pentru că cei 2V se vor aplica între pinul de intrare și cel de ieșire de pe Arduino, nu aș vrea să ard placa Arduino.

Vă mulțumesc!

Link to comment
Share on other sites

1 oră în urmă, mihai 7 a spus:

 Am măsurat tensiunea între pinul 5 și pinul 7 din circuitul de încărcare (fără microprocesor montat) și îmi indică o valoare de 2V, (circuit alimentat la 12V, cu acumulator conectat)-este normal? Vă întreb pentru că cei 2V se vor aplica între pinul de intrare și cel de ieșire de pe Arduino, nu aș vrea să ard placa Arduino.

Partea cu functionarea ai citit-o si inteles-o?

 

The schematic is pretty simple. The darlington transistor Q1 (TIP127), through LED1 (which must be absolutely RED) and the resistance R3 from 0.3 Ω, creates a constant current flowing in the direction of the 6-cell battery (7.2V), while the Schottky diode 1N5822, serves to protect the entire circuit in the case that is lacking the input voltage with the battery connected. The voltage divider R4-R5, serves to bring to port 7 of the ATtiny (A1) the battery voltage decreased to about 1/3, in such a way that it can operate with voltages up to 15V (the analog input of the ATtiny can not exceed 5V). The transistor Q2, driven by the port 5 of the ATtiny (D0), serves as a switch to enable or disable the LED-1 and the transistor Q1.

nimh_charger_schematic.png

 

 

Link to comment
Share on other sites

Înțeleg că la pinul 7 al microprocesorului se măsoară tensiunea de pe baterie, redusă la 1/3. Deasemenea înțeleg că prin pinul 5 al microprocesorului se comanda, prin intermediul lui Q2, LED-ul 1 și Q1 (Tip 127). Dar nu sunt sigur ce tensiune ar trebui să existe între pinul 5 și pinul 7. 

Link to comment
Share on other sites

R4-R5 formează un divizor de tensiune, similar unui potenţiometru.Când acumulatorul e conectat, la bornele divizorului apare o tensiune de circa 7,2V iar la pinul 7 doar 1/3 din ea . Când acumulatorul nu e conectat, tensiunea e cu puţin sub cea de alimentare (12V) nestabilizată, acesta fiind şi motivul folosirii divizorului R4-R5 şi factorul de divizare de 1/3. Fiindcă 12/3 este 4V, adică sub 5V cât poate accepta AtTiny85 pe intrare. Cât poate Arduino Uno accepta pe intrare nu ştiu, dar bănuiesc că tot 5V cât e tensiunea de alimentare.Pe tine nu te interesează cât trebuie să apară între pinii 4 şi 5 ai lui Arduino, ci doar între pinul 7 şi masă, pinul 5 fiind un port de ieşire.

Tensiunea măsurată de tine corespunde unui acumulator doar parţial încărcat (6V), cu tranzistorul Q1 blocat.

Microcontrollerul original din schemă nu e greu de găsit...https://cleste.ro/placa-dezvoltare-attiny85.html?utm_medium=GoogleAds&utm_campaign=&utm_source=&gclid=Cj0KCQjw5ZSWBhCVARIsALERCvxBQLJICA8V1kxsOrCuyVqkznqC6hp59f9s6isCnzsq8dcNHVVHVAwaAsuiEALw_wcB

Link to comment
Share on other sites

Posted (edited)

Nu tensiunea intre 5 si 7 intereseaza.

 

Fara sa citesc mai mult decat paragraful citat, cam asa vad eu functionarea:

 

1. Circuitul asteapta un acumulator. Odata conectat, ii se masoara tensiunea cu portul analogic (max 5V) pe pinul 7.

2. Daca e mai mica decat 7.2V, atunci iesirea 5 trece in "1" si sursa de curent constant in jurul lui Q1 furnizeaza un curent constant acumulatorului pana tensiunea pe acumulator ajunge la 7.2V.

3. Odata 7.2V pe acumulator, pinul 5 trece in "0", sursa de curent nu mai furnizeaza curent acumulatorului.

 

Acum intelegi de ce e irelevanta tensiunea intre pinul 5 si 7? Microcontrollerului nu i se aplica extern tensiune decat pe pinul 7 (LE: modificat in loc de 5) si asta fata de masa.

 

Cineva abil cu Arduino poate porta codul cu usurinta.

 

PS: zic 7.2V, dar nu stiu exact ce tensiune are un acumulator NiMh de 7.2V.

Edited by Mircea
Link to comment
Share on other sites

Posted (edited)
Acum 21 minute, Mircea a spus:

Microcontrollerului nu i se aplica extern tensiune decat pe pinul 5 si asta fata de masa.

Nu voiați să spuneți pinul 7?

Menționez că eu doresc să încarc un acumulator de 8.4V.

Îmi cer iertare pentru insistență, dar tensiunea de 2V măsurată între pinii 5 și 7, fără placa Arduino conectată, nu se aplică de fapt plăcii Arduino între un port analogic de intrare și un port digital de ieșire? Poate suporta Arduino tensiune între aceste porturi?

Edited by mihai 7
Link to comment
Share on other sites

Posted (edited)

Asa e, pinul 7, nu 5.

 

La microcontroller poti aplica 5V intre orice pin si masa. Si intre 2 pini chiar.

 

Cei 2 volti sunt de fapt diferenta de potential intre 2V (corespunzand la 6V pe acumulator) si 0V din baza tranzistorului (care e flotanta fara conexiunea la circuitul intern al microcontrolerului). Practic, pe pinul 5 nu se aplica nici o tensiune din exterior. 

 

Garantez ca 2V gasesti si intre pinul 7 si minusul acumulatorului.

 

Cand am intrebat despre intelesul schemei era ca sa fiu sigur ca stii cum functioneaza circuitul extern microcontrolerului. Altfel spus un tranzistor, sursa de curent constant, dioda serie cu acumulatorul, etc. Mai ai de lucrat inainte sa construiesti ceva si sa nu intelegi de ce nu merge sau daca merge cum trebuie.

Edited by Mircea
Link to comment
Share on other sites

Posted (edited)

Mulțumesc pentru lămuriri, @Mircea.

1) Acum, rămâne conectarea circuitului de încărcare la placa Arduino: voi conecta punctul corespunzând pinului 5 (de pe circuitul de încărcare) la un port digital de ieșire, punctul corespunzând pinului 7 la un port analogic de intrare. Dar masa circuitului de încărcare și masa Arduino trebuie să fie interconectate (comune)?

2) Iar în ceea ce privește intensitatea curentului prin acumulator, circuitul furnizează 1-2Ah, eu am nevoie să încarc un acumulator cu o capacitate mult mai mică, de 280mAh. Pentru a scădea această intensitate este suficient să modific valoarea constantei Interval2=62500, în codul sursă (așa îmi rezultă din raportul indicat în comentariul existent în codul sursă, citat mai jos)? Sau mai trebuie să modific și valoarea lui R3?

long interval2 = 250;     // pulse off interval - you can adjust power with this. Use 100 for 2-4Ah battery packs, 500 for 1-2Ah battery pack

Edited by mihai 7
Link to comment
Share on other sites

1. Da, trebuie o masa comuna.

2. Poti pune 250, dar masoara tensiunea pe rezistenta R3 (0,3 ohmi, poate fi 0,27 sau 0,33) la prima punere in functiune. Tensiunea la bornele R3 / valoarea R3 trebuie sa fie cei 0,28A. 

 Masori si ajustezi interval2 pana iese ce si nevoie.

Link to comment
Share on other sites

Am realizat conexiunile cu placa Arduino, am ales pentru long interval2 = 500, și conectând acumulatorul de 8.4V la încărcător am obținut aprox. 300mA curent de încărcare. Placa Arduino a realizat decuplarea acumulatorului atunci când acesta s-a încărcat. Am făcut mai multe teste și se pare că montajul își face treaba, decuplează acumulatorii atunci când aceștia sunt încărcați.

Am câteva observații:

1)    Dacă se cuplează un acumulator deja complet încărcat, nu cred că se mai realizează decuplarea acestuia de la încărcător.  

2) Am încercat să încarc un acumulator de 1.2V/2800mA, dar nu am reușit să obțin un curent de încărcare mai mare de 500mA (pentru început, apoi scădea la 300mA), indiferent cât am scăzut valoarea lui interval2(în program). Eu am folosit o diodă 1N5819 (1A) în loc de 1N5822 (3A), să fie de aici problema?

 

Per total, încărcătorul pare să fie eficient.

 

Link to comment
Share on other sites

1. Decuplarea apare dupa ce se detecteaza maximul si scaderea de 20mV imediat dupa. 

 

2. Un singur acumulator de 1.2V sau 6 in serie? Ca nu e tot una. 

 

Dioda trebuie pusa dupa ce curent e programat acolo. Daca vrei sa incarci cu 2A, atunci nu e buna una de 1A. Daca vrei doar 280mA,cum zici mai sus, atunci dioda de 1A este suficienta. 

Link to comment
Share on other sites

Da, ultima dată m-am referit la un singur acumulator de 1.2V/2800mA, curentul de încărcare nu depășește 500mA, led-ul roșu luminează foarte slab.

Link to comment
Share on other sites

Poate trebuie recitit articolul original.

 

Mai ales aici: Of course you can also charge less cells, by suitably adjusting the input voltage. For a cell, we should feed the device with a voltage of about 1.2 + 5 = 6.2 V (maybe 6 or 7).

Edited by Mircea
Link to comment
Share on other sites

  • 3 weeks later...
Posted (edited)

1) În legătură cu ultima postare, am alimentat montajul la 1.2V+5V=6.2V. Însă cred că problema vine de la faptul că acumulatorul este vechi, am reușit să obțin și intensități mai mari prin acesta, dar se incălzește destul de tare.

2) Acum am altă problemă(alte probleme). Am înlocuit placa Arduino cu Microprocesorul Attiny85, și:

a) am obținut eroare la compilare, pe care am rezolvat-o introducând în program secvența  #include "ATtinySerialOut.hpp" .

b) montajul nu-mi mai întrerupe încărcarea. Pentru 3 acumulatori*1.2V/800mAh, montaj alimentat la 8.6V, am măsurat intensitatea inițială 100-200mA - bănuiesc, analizând programul, că aceasta este încărcarea "trickle" (apropo, aceasta nu este fixă, oscilează între anumite limite fixe, este în regulă?). După un anumit număr de minute, intensitatea creștea la maxim 800mA (oscilând deasemenea între 200-300-700-800mA, în succesiune periodică). După 1h05', încărcarea nu s-a oprit, acumulatorii s-au încălzit la aproximativ 43 grade C, iar tensiunea pe acumulatori oscila, periodic, între apoximativ 4.5V-6V. 

c) am încercat, în afară de aceste teste, să fac o modificare programului, adăugând funcția tone(), pentru a obține un sunet atunci când se oprește încărcarea, sau când se trece la încărcarea "trickle", dar în difuzorul de 8 Ohmi, montat între masă și pinul 6 (sau 3) al microprocesorului, nu se auzea tonul. Care este problema? Impedanța difuzorului? Am citit că ar trebui conectat un condensator de 100nF între VCC și Gnd. Menționez că procesorul este setat la clock 8 Mhz internal.

pentru a genera tonul am folosit secvența de program:

Tone(1, 1000);
delay(10000);
noTone(1);

În prealabil am definit pinul ca output:

pinMode(1, output);

 

Edited by mihai 7
Link to comment
Share on other sites

Inserez mai jos codul original postat în articolul italianului, pentru a fi la îndemână:

 

/*
 
NiMh Charger 0.9
with AtTiny85 @ 1Mhz
by Luca Soltoggio
10/03/2012 - 20/04/2012
 
Use negative deltaV to determine end of charge.
Suitable for NiMh and NiCD battery pack.
Default is for 6 cells 2500mAh.
Need some hardware/software adjustment for changing current / cells number
See http://arduinoelettronica.wordpress.com/
 
*/
 
const int inputPin = A1;
const int outputPin = 0;
 
const int numReadings = 30; // number of analog read before checking battery status
const int multi = 1614; // multi coefficent for obtaining millivolts from analogread
 
long interval = 1000;     // interval for pulse charging and analog read - don't change this
long interval2 = 250;     // pulse off interval - you can adjust power with this. Use 100 for 2-4Ah battery packs, 500 for 1-2Ah battery pack
long interval2b=interval2;
long previousMillis,currentMillis,currentMillis2,trickleMillis = 0;
 
unsigned int readingtemp;
unsigned int total = 0;
unsigned int average,medium,maxmedium = 0;
 
boolean executed,endcharge,trickle=false;  // booleans for controlling various activities (for example "end of charge")
 
unsigned int myarray [7];   // array for keeping last 7 readings
int index,i = 0;
 
void setup()
{
  Serial.begin(9600);
  pinMode(0,OUTPUT);
 
  // Some readings for initial check
  for (i=0;i<10;i++) {
    readingtemp = analogRead(inputPin);
    total=total+readingtemp;
  }
  average = (((float)total / 1023.0) * (float)multi) / 10.0 + 0.5;
  if (average<=70) endcharge=true;  // If there is no battery, end charge
  Serial.println(average);
 
  total=0;
  average=0;
}
 
void pusharray() {
  // push the array
  for (i=0;i<=5;++i) {
    myarray[i]=myarray[i+1];
   }
  myarray[6]=average;
}
 
void voltread() {
  readingtemp = analogRead(inputPin);  // read analog input
  total= total + readingtemp;
  index++;
 
  // if numReadings reached, calculate the average
  if (index==numReadings) {
    index=0;
    average = (((float)total / 1023.0) * (float)multi) / numReadings + 0.5;
    if (average<=70) endcharge=true;  // stop charge if battery is detached
    total=0;
    pusharray(); // insert new average in array
    medium=(float)(myarray[6]+myarray[5]+myarray[4]+myarray[3]+myarray[2]+myarray[1]+myarray[0])/7.0+0.5; // calculate the average of the last 7 readings
    if (medium>maxmedium) maxmedium=medium; // save the value of highest medium in "maxmedium"
    Serial.print(medium);
    Serial.print(",");
    Serial.print(maxmedium);
    Serial.print(",");
    Serial.println(myarray[6]);
    if ( ((medium+1) < maxmedium) && ((millis()/60000)>=11) ) {  // if battery charged (average voltage is dropped 0.02v), but not in the firsts 11 mintues
      if (!trickle) trickleMillis=millis(); // start trickle timer
      trickle=true; // enter final trickle charging mode
      if ((millis()/60000)<=15) endcharge=true; // if battery is charged in the firts 15 minutes, don't apply trickle charge (maybe was yet charged)
    }
  }
}
 
void loop() {
 
  currentMillis = millis();
 
  // executed every "interval" millis
  if(currentMillis - previousMillis > interval) {
    voltread();  // call reading and check volts function
    digitalWrite(outputPin,LOW);  // temporaly stop charging
    previousMillis = currentMillis;
    executed=false;  // boolean for setting and checking if has been yet turned ON charge
 
    // in the firsts 10 minutes and in the endings 15 minutes do a trickle charge (change OFF interval)
    if ( ( (trickle) && (((millis()-trickleMillis)/60000)<15) ) || ((millis()/60000)<10) ) {
      interval2=(interval-(interval-interval2b)/5);
    } else if ((millis()/60000)>=10) interval2=interval2b;  // after initial trickle charghe set back right time
    if ( (trickle) && (((millis()-trickleMillis)/60000)>=15) ) endcharge=true;  // if final trickle charge end, end charge
  }
 
  currentMillis2 = millis();
 
  // executed "interval2" millis after turning OFF charge
  if ((currentMillis2 - previousMillis > interval2) && (!executed)) {
    executed=true;
    if (!endcharge) {
      digitalWrite(outputPin,HIGH); // if battery is not charged, re-enable charging
    }
  }
 
}

 

Link to comment
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.

 Share

×
×
  • 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.Terms of Use si Guidelines