Sari la conținut
ELFORUM - Forumul electronistilor

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


mihai 7

Postări Recomandate

Acum 1 oră, Liviu.Mihaiu a spus:

Si nici sa descarci acumulatoare inseriate.

Domnule @Liviu.Mihaiu, stiu că nu este corect să descarc acumulatoare înseriate, dar este vorba de un acumulator de 8.4 V (tipul 9V), cum să-l descarc altfel?

Acum 1 oră, Liviu.Mihaiu a spus:

Cate tipuri de acumulatoare vrei sa utilizezi ?

Două tipuri: de 1.2 V și 8.4V .  900mV este limita inferioară  de descărcarea a unui acumulator de 1.2 V;

- 1700 mV am considerat a fi limita maximă de încărcare a unui acumulator de 1.2V;

- similar pentru un acumulator de 8.4 V (6300 V limita minimă de descărcare, iar 10000 mV  nivelul maxim de încărcare).

 

P.S: 

Am încercat să adaptez codul furnizat de dvs. pentru 2 tipuri de acumulator, dar la compilare îmi afișează mesajul " 'reset' was not declared in this scope". Vă refereați cumva la altă funcție C/C++?

Editat de mihai 7
completare
Link spre comentariu
  • Răspunsuri 85
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

Top autori în acest subiect

Imagini postate

Acum 39 minute, mihai 7 a spus:

'reset' was not declared in this scope".

Trebuie definita. Cauta "arduino softreset" pe google. Sau comenteaza acum linia cu if + reset(). Si dai reset manual daca schimbi acumulatorul 'din mers'.
Poti sa lasi asa cum este acum. Cu patru tipuri. Trebuie sa mearga si cu doua. Nu asta este problema acum.

 

 

Editat de Vizitator
Link spre comentariu

Am ajuns la următoarea formă a codului:

 

float Vi[2]={1.2, 8.4};  // patru tipuri de acumlator 
float proc=75;        // 75% minim descarcare (asa am dedus din codul tau)
float Acc_V=0;        // voltajul nominal al acumulatorului de descarcat

const int inputPin_1 = A5;
const int outputPin_1 = 7;
float valueProbe;     //variable to store the value of analogPinOne
float voltageProbe;     //calculated voltage at analogPinOne


void setup()
{
  Serial.begin(9600);
  pinMode(outputPin_1, OUTPUT); 
  pinMode(inputPin_1, INPUT);

  int i;
  Serial.print("detectare acumulator...");

  while(Acc_V==0)
  {

  // aici pui cod citire ADC

    for(i=0;i<2;i++)
    {
       if(voltageProbe<=Vi[i] && voltageProbe>=Vi[i]*proc/100)
       {
        Acc_V=Vi[i];      // am gasit tipul de acumulator
        break;
       }
    } 
  }
  Serial.print("acumulator de tipul: ");
  Serial.print(Acc_V);
  Serial.print(" V");

  Acc_V=Acc_V*1000;     // in milivolti

  
}
 
void loop() {
        
   valueProbe = analogRead(inputPin_1);  // read analog input
   voltageProbe = (valueProbe*5000*326*1.38)/102400;     //calculate voltage at probe one in milliVolts
   Serial.print("Voltage Probe (mV): ");     //display voltage at probe one
   Serial.println(voltageProbe);
   delay(2000);

   // aici pui cod citire ADC

        // if(voltageProbe==0)            // daca se scoate acumulatorul
        //  reset();             // trebuie detectat tipul (voltajul) in caz ca urmeaza descarcarea altuia.

  if(voltageProbe>Acc_V*proc/100)
  {
    Serial.print("Descrcare actuală = ");
    Serial.print(voltageProbe);
    Serial.println(" mV");
   digitalWrite(outputPin_1, HIGH);     // descarc
  }
  else  
  {
    Serial.print("descarcare terminta");
    digitalWrite(outputPin_1, LOW);
  }    
  }

 

 

Problema este că în terminal îmi afișează  "detectare acumulator...", iar ledul rămâne stins, și doar atât.

Renunțând la bucla while, și la mesajele din void setup(), îmi afisează valoarea lui "voltage probe" și "descărcare actuală", ledul este aprins, deci așa funcționează.

Link spre comentariu
Acum 3 minute, mihai 7 a spus:
// aici pui cod citire ADC

    for(i=0;i<2;i++)

unde-i codul pentru citire voltaj baterie ?
 

Acum 4 minute, mihai 7 a spus:
valueProbe = analogRead(inputPin_1);  // read analog input
   voltageProbe = (valueProbe*5000*326*1.38)/102400;     //calculate voltage at probe one in milliVolts

adica asta

Link spre comentariu

Am inserat secvența de citire a voltajului, dar problema persistă,  îmi afișează  "detectare acumulator...", iar ledul rămâne stins. Așa arată codul actual:

 

float Vi[2]={1.2, 8.4};  // patru tipuri de acumlator 
float proc=75;        // 75% minim descarcare (asa am dedus din codul tau)
float Acc_V=0;        // voltajul nominal al acumulatorului de descarcat

const int inputPin_1 = A5;
const int outputPin_1 = 7;
float valueProbe;     //variable to store the value of analogPinOne
float voltageProbe;     //calculated voltage at analogPinOne


void setup()
{
  Serial.begin(9600);
  pinMode(outputPin_1, OUTPUT); 
  pinMode(inputPin_1, INPUT);

  int i;
  Serial.print("detectare acumulator...");

  while(Acc_V==0)
  {

   valueProbe = analogRead(inputPin_1);  // read analog input
   voltageProbe = (valueProbe*5000*326*1.38)/102400;     //calculate voltage at probe one in milliVolts // aici pui cod citire ADC

    for(i=0;i<2;i++)
    {
       if(voltageProbe<=Vi[i] && voltageProbe>=Vi[i]*proc/100)
       {
        Acc_V=Vi[i];      // am gasit tipul de acumulator
        break;
       }
    } 
  }
  Serial.print("acumulator de tipul: ");
  Serial.print(Acc_V);
  Serial.print(" V");

  Acc_V=Acc_V*1000;     // in milivolti

  
}
 
void loop() {
        

   valueProbe = analogRead(inputPin_1);  // read analog input
   voltageProbe = (valueProbe*5000*326*1.38)/102400;     //calculate voltage at probe one in milliVolts // aici pui cod citire ADC

        // if(voltageProbe==0)            // daca se scoate acumulatorul
        //  reset();             // trebuie detectat tipul (voltajul) in caz ca urmeaza descarcarea altuia.

  if(voltageProbe>Acc_V*proc/100)
  {
    Serial.print("Descrcare actuală = ");
    Serial.print(voltageProbe);
    Serial.println(" mV");
   digitalWrite(outputPin_1, HIGH);     // descarc
  }
  else  
  {
    Serial.print("descarcare terminta");
    digitalWrite(outputPin_1, LOW);
  }    
  }

 

Link spre comentariu

Eu nu am cum sa testez. 
Ti-am dat doar o idee cum s-ar putea face pentru mai multe tipuri de tensiuni ale acumulatorilor.
Afiseaza si tu inainte de for(...) valoare "voltageProbe" citita si vezi daca se incadreaza intre Vi[i] si Vi[i]*75% (asa cum se face comparatia) care detecteaza acc.

LE:
Eu am vazut unde am gresit. Se fac comparatii "Volti" cu "milivolti".
Sa te vad daca gasesti si tu eroarea.


 

Editat de Vizitator
Link spre comentariu
Acum 13 minute, mihai 7 a spus:

Acum arată mai bine?

Prea multe transformari din volti in milivolti si invers. Lasa cum a fost comparatia
Si mergi numai in milivolti.
Adica:

float Vi[2]={1200, 8400};

si scoate linia:

Acc_V=Acc_V*1000;     // in milivolti

Ti-am mai spus, inainte de for() afiseaza in terminal tensiunea citita. Ce arata cand conectezi acc de 1.2V sau 8.4V ?

    Serial.print("Tensiune actuala = ");
    Serial.print(voltageProbe);
    Serial.println(" mV");

 

Editat de Vizitator
Link spre comentariu

Când conectez acumulatorul de 8.4 V, îmi afisează "Tensiune actuală= 11971 mV", iar pentru 1.2 V îmi afișează "Tensiune actuală= 1296.04 mV". Doar că mesajul nu este corespunzător acumulatorului de 8.4V. Îmi afișează doar "acumulator de tipul 1.2V", dar descarcă și acumulatori de 8.4V.

Editat de mihai 7
Link spre comentariu

Asigurate ca masuratorile corespund cu cele ale unui multimetru.
Apoi este posibil sa trebuiasca sa faci comparatia de genul:

if(voltageProbe<=Vi[i]*110/100 && voltageProbe>=Vi[i]*proc/100)

am pus 10% peste valoarea nominala. 
Nu am idee care-i teoria la NiMh. Mai citeste.
Poate intervine si altcineva.
 

Editat de Vizitator
Link spre comentariu

Pentru afisarea corecta a tensiunii de intrare in divizorul rezistiv poti sa declari valorile celor doi rezistori

float R1 = 33000.00; // valoarea masurata a resistorului  R1 (33K) 
float R2 = 15000.00; // valoarea masurata a resistorului  R2 (15K) 

si atunci cand faci citirea tensiunii, folosesti urmatoarele linii de cod:

valueProbe = analogRead(inputPin_1);
voltageProbe = ((valueProbe*5000)/1024)/ (R2/(R1+R2));

In cazul in care vrei sa folosesti doar raportul de divizare, citirea tensiunii de intrare in divizor se face asa:

valueProbe = analogRead(inputPin_1);  // read analog input
voltageProbe = ((valueProbe*5000)/1024)*3.198 ; // 3.198 fiind raportul corect pentru cei doi rezistori folositi in divizor

Trebuie sa ai in vedere si faptul ca pentru anumite tensiuni bucla while(Acc_V==0) va rula la nesfarsit, lucru care nu va permite rularea buclei principale a programului.

Link spre comentariu
La 20.08.2022 la 0:37, Elison a spus:

Pentru afisarea corecta a tensiunii de intrare in divizorul rezistiv poti sa declari valorile celor doi rezistori

 Am inserat liniile de cod de mai jos în program, dar tensiunile afișate sunt cu aproximație înjumătățite față de cele reale. Așa cum am mai menționat, fiind pe breadboard (deocamdată), se mai mișcă conexiunile, dar totuși cred că și de altundeva vine problema. 

   valueProbe = analogRead(inputPin_1);  // read analog input
   voltageProbe = ((valueProbe*5000)/1024)/ (R2/(R1+R2));     //calculate voltage at probe in V // aici pui cod citire ADC
   valueProbe = analogRead(inputPin_1);  // read analog input
   voltageProbe = ((valueProbe*5000)/1024)/ (R2/(R1+R2));     //calculate voltage at probe in V // aici pui cod citire ADC

 

Din schemă se vede că citirea se face pe divizorul de tensiune, iar acesta este conectat între plusul (+) acumulatorului și masa montajului. Ar putea fi o soluție conectarea divizorului direct pe (+) și (-) terminale ale acumulatorului?

Deasemenea, atunci când se face descărcarea prin sarcină, tensiunea pe acumulator scade simțitor, și chiar în această soluție afișarea trebuie să se facă corect.

Link spre comentariu

Între timp am trecut montajul pe cablaj de test (mai puțin buffer-ul cu LM 358) și formula pentru determinarea voltajului de mai sus returnează valori aproximativ înjumătățite.În schimb, folosind raportul de divizare 3.198 obțin valori aproape egale cu tensiunea măsurată pe acumulator (probabil pentru că valorile reale ale rezistorilor din divizor nu sunt exacte? - ele au valorile indicate de mine mai sus):

voltageProbe = ((valueProbe*5000)/1024)*3.198;

 

Link spre comentariu
La 20.08.2022 la 0:37, Elison a spus:
valueProbe = analogRead(inputPin_1);
voltageProbe = ((valueProbe*5000)/1024)/ (R2/(R1+R2));

Nu obțineam rezultate corecte pentru că eu inversasem R1 cu R2. Acum rezultatelle sunt exacte, cu ușoare oscilații.

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