Sari la conținut
ELFORUM - Forumul electronistilor

Descărcare acumulatori NI-MH asistată de Arduino Uno


mihai 7

Postări Recomandate

Acum 11 ore, Mircea a spus:

Formula fiind: 5x1024x?=valoarea dorita cap de scala. ? este raportul de divizare al divizorului format din R1 si R2.

Inainte sa ma corecteze cineva, si pe bune, in loc de 1024 trebuie 1023. Sunt 1024 de valori, de la 0 la 1023. D-aia 1023.

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

Top autori în acest subiect

Top autori în acest subiect

Imagini postate

La 31.08.2022 la 16:49, mihai 7 a spus:

Mulțumesc tuturor celor care m-au ajutat, montajul funcționează, sunt mulțumit de rezultat.

Eu cred ca normal era sa postezi ceva de genul:
"In urma celor discutate cu voi am ajuns la urmatoarea varianta de hard si soft: ..."

Cam asa se procedeaza pe alte "eforumuri".

 

Link spre comentariu

@nico_2010 iti urmaresc postarile nu numai aici dar si in afara forumului , respect pentru ceia ce faci...

Sunt un programator de weekend ,dar nu mi se pare corect s-a citesc 10 pagini s-a vad ce modificari a facut initiatorul topicului ,atit la schema electrica cat si in soft.

Daca urmaresti topicurile deschise de mine (putine )la final am atasat codul la care am ajuns si functional asa cum vreau eu si este liber fiecare sa-l modifice cum doreste

Eu asa cred ca este un forum in care ar trebui s-a beneficiem toti de experienta fiecaruia,...

Multumesc de citire.

Link spre comentariu
  • 3 săptămâni mai târziu...

Bună seara tuturor! Revin cu informațiile cerute și îmi cer iertare pentru că nu am postat aceste informații mai devreme, încălcând în felul acesta regulile de bună-purtare pe un forum. Nu am dorit să păstrez secretul în ceea ce le privește, proiectul nu este comercial, l-am realizat doar pentru mine. Doar să vă fie de folos, pentru ca eu am realizat o îmbinare între softul de încărcare acumulatori discutat  la pagina:

și o variantă simplificată la maxim a programului propus de domnul @Liviu.Mihaiu la pagina 2 din această postare. Menționez că am folosit microcontroller-ul Attiny85, dar fără aschimba referința  de tensiune la 1.1 V , așa cum mi-a sugerat domnul  @Mircea și alți colegi, pentru că nu am mai dispus de timp și am preferat să mă opresc aici. În schimb, am compensat eroarea de citire a tensiunii pe un acumulator de 1.2V folosind în cod valoarea de 860mV în loc de cea de 900mV, la care doresc să se oprească descărcarea. În felul acesta, descărcarea se oprește de fapt la o valoare apropiată de 900mV:

if ((voltageProbe >= 860) && (voltageProbe < 1600) || (voltageProbe >= 6300) && (voltageProbe < 10000))

 

 

 

 
/*
NiMh Charger / Discharger
with AtTiny85 @ 1Mhz
 
Suitable for NiMh and NiCD battery pack.
Default is for charging 7 cells 280mAh ( charging 7.5 hours/ 56mAh)
Discharging for 1 cell and 7 cells 280mAh 
Need some hardware/software adjustment for changing current / cells number
See http://arduinoelettronica.wordpress.com/ 
*/
 #include "ATtinySerialOut.hpp" 
float valueProbe;        //variable to store the value of analogPin
float voltageProbe;      //calculated voltage at analogPinOne
float R1 = 32800.00;   // valoarea masurata a resistorului  R2 (ohmi)
float R2 = 14800.00;     // valoarea masurata a resistorului  R1 (ohmi)
float cutoffTemperatureC =37;     //maximum battery temperature that should not be exceeded 35 (in degrees C)
long cutoffTime =27000000;     //maximum charge time of 7.5 hours that should not be exceeded (27000000)
long milliscutoff;
float rawvoltage;
float millivolts;
float celsius;
float kelvin;
const int inputPin_incarcator = A1;
const int outputPin_incarcator = 0;
const int inputPin_descarca = A3;
const int outputPin_descarca = 1;
const int outputPin_temperatura= A2;
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 = 920;     // 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(outputPin_incarcator ,OUTPUT);
  pinMode(outputPin_descarca, OUTPUT); 
  pinMode(inputPin_descarca, INPUT);

   
  // Some readings for initial check
  for (i=0;i<10;i++) {
    readingtemp = analogRead(inputPin_incarcator);
    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_incarcator);  // 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"    
  }
}

 void temperatureread()  {
 rawvoltage= analogRead(outputPin_temperatura);
 millivolts= (rawvoltage*5000) /1024;
 kelvin= (millivolts/10);
 celsius= kelvin - 273; 
 }
 
void loop() {
   valueProbe = analogRead(inputPin_descarca);  // read analog input
   voltageProbe = ((valueProbe* 5000)/1024) * ((R1+R2)/R2);     //calculate voltage at probe in mV
  
    milliscutoff=millis();
    temperatureread();
    currentMillis = millis();
       // executed every "interval" millis
  if(currentMillis - previousMillis > interval) {
    voltread();  // call reading and check volts function
    digitalWrite(outputPin_incarcator,LOW);  // temporaly stop charging
    previousMillis = currentMillis;
    executed=false;  // boolean for setting and checking if has been yet turned ON charge
 
    if ( (milliscutoff > cutoffTime) || (celsius > cutoffTemperatureC) ) endcharge=true;  // if final trickle charge end, end charge
    
     Serial.print("Voltage Probe (mV): ");     //display voltage at probe
     Serial.println(voltageProbe);
    if ((voltageProbe >= 860) && (voltageProbe < 1600) || (voltageProbe >= 6300) && (voltageProbe < 10000))
     digitalWrite(outputPin_descarca, HIGH);
    else 
      digitalWrite(outputPin_descarca,LOW); 
  }
  currentMillis2 = millis();
 
  // executed "interval2" millis after turning OFF charge)
  if ((currentMillis2 - previousMillis > interval2) && (!executed)) {
    executed=true;
    if (!endcharge) {
      digitalWrite(outputPin_incarcator,HIGH); // if battery is not charged, re-enable charging
    }
  }
}

Eu mă declar pe deplin satisfăcut, întrucât am reușit să realizez atât încărcarea, cât și descărcarea folosind un singur Attiny85. Este adevărat că montajul nu funcționează ireproșabil (de exemplu, eu am setat ca încărcarea să se oprească după 7.5 ore, dar aceasta se oprește cu aprox. 15 minute mai devreme), dar nu sunt dispus să investesc mai mult timp în proiect, iar acesta este util și în starea actuală.

 

Atașez și o fotografie cu panoul frontal, care știu că nu arată tocmai grozav. Aici se pot observa un led verde care indică alimentarea montajului, unul roșu care indică încărcarea acumulatorului, precum și un led albastru care indică faptul că un acumulator se descarcă. Am folosit două comutatoare On-Off-On:

1) primul pentru a schimba intensitatea curentului de încărcat (corespunzător unui acumulator de 8.4V, unuia de 1.2V tip AA și altuia de 1.2V tip AAA)

2) cel de-al doilea pentru a comuta între trei valori de rezistențe, necesare descărcării unui acumulator de 8.4V, unuia de 1.2V tip AA și altuia de 1.2V, tip AAA.

Deasemenea, am folosit o sursă variabilă, care-mi oferă tensiuni în plaja 1.2V - 10.9 V, precum și tensiunea de 12.5V separat, pe care o folosesc pentru a încărcă acumulatori de 8.4V reglabilă din potențiometrul de pe panoul frontal, Și nu în ultimul rând, am folosit și un voltmetru de panou pentru a afișa tensiunea de încărcare în Volți (calculată după formula n*1.2+5, unde n reprexintă numărul de celule are se încarcă).

Spor celor care doresc să îmbunătățească acest proiect!

 

Fotografie0019.jpg

 

Fotografie0021.jpg

Editat de mihai 7
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