Go Down

Topic: Comprobador de capacidad para baterías (Read 690 times) previous topic - next topic

steel_series

Estoy terminando de hacer una carga electrónica constante para probar fuentes y baterías.
En el "Modo baterías" se setean 2 parámetros (El voltaje de protección y los mA. que se le va a exigir a la batería durante todo el proceso de descarga).



Cuando creía haber terminado, me di cuenta que algo le faltaba.

La cuenta de mAh. se obtiene de los mA. constantes * el tiempo transcurrido, hasta ahí ningún problema.

Pero si durante el proceso de descarga modifico los mA de consumo (por ejemplo lo pongo a 0mA) los mAh horas obviamente pasan a a ser 0, y no almacena lo que ya se consumió.

Mi problema es que no se como hacer para que los mAh ya consumidos queden almacenados.

Probé sumándolos a la misma variable, pero la cuenta no es correcta.

No se si me explico bien, les dejo la parte del código que describo anteriormente.

Code: [Select]

#include <Time.h>
#include <TimeLib.h>

 byte horas;
 byte minutos; 
 byte segundos;
 float mah=0.00;
 float time=0.00;
 float capacidad=0.00;
 float v_cutoff=0.00;
 char dec_t[7];  // 00:00:00   HH:MM:SS.
 bool flag_cutoff=true;
 unsigned long t_refresh=0;
 

void current_capacity()
    {
time= (hour()*3600) + (minute()*60) + (second()); // Convierto la el tiempo en segundos para sumarlo
time= time/3600;                                  // lo vuelvo a convertir a horas.       
mah = time*(amps*1000);                           // Capacidad = tiempo transcurrido * I.
    }


void start_discharge()
{
 
current_capacity();

   if (millis()-t_refresh>1000)
   {
             u8g2.firstPage();
                  do {   
u8g2.setFont(u8g2_font_helvB08_tf);
u8g2.drawBox(0, 0, 132, 11);
u8g2.drawStr(9,22, "V:");
u8g2.drawStr(0,32, "mA:");
u8g2.setCursor(21, 32);
u8g2.print(amps * 1000);
u8g2.setCursor(84, 32);

   if (digitalRead(mosfet)==HIGH)
      {
                        sprintf(dec_t, "%02d:%02d:%02d", hour(), minute(), second());
u8g2.print(dec_t);
u8g2.setDrawColor(0);
u8g2.drawStr(35,9, "mAh:");
u8g2.setCursor(62,9);
u8g2.print(mah);
u8g2.setCursor(21, 22);
u8g2.setDrawColor(1);
u8g2.print(volt);
      }
        else
       {
sprintf(dec_t, "%02d:%02d:%02d", horas, minutos, segundos);
u8g2.print(dec_t);
u8g2.setDrawColor(0);
u8g2.drawStr(35,9, "mAh:");
u8g2.setCursor(62,9);
u8g2.print(capacidad);
u8g2.setCursor(21, 22);
u8g2.setDrawColor(1);
u8g2.print(v_cutoff);
u8g2.setFont(u8g2_font_unifont_t_symbols);
u8g2.setDrawColor(0);
u8g2.drawGlyph(110, 10, 10004);
}
         u8g2.setFont(u8g2_font_unifont_t_symbols);
         u8g2.setDrawColor(1);
u8g2.drawGlyph(66, 32, 9201);
     } while ( u8g2.nextPage() );

t_refresh=millis();

}
         if ((volt <= v_protec_bat) && (flag_cutoff==true))
    {
    digitalWrite(mosfet, LOW);
    horas = hour();
    minutos = minute();
    segundos = second();
    capacidad = mah;
    v_cutoff = volt;

    flag_cutoff=false;
    } 

}   







 

Lucario448

Se me ocurre que vayas acumulando la medida de los mA en intervalos regulares (preferiblemente cada segundo). Y ya sea en tiempo real o al final de la prueba, divides el acumulado entre 3600 para así obtener los mAh.

Si float no fuera tan limitado como acumulador (o al menos eso me temo), se podría mejorar la precisión del cálculo muestreando cada décima de segundo. De hacerlo así, se le agregaría un cero más al divisor.

steel_series

Se me ocurre que vayas acumulando la medida de los mA en intervalos regulares (preferiblemente cada segundo). Y ya sea en tiempo real o al final de la prueba, divides el acumulado entre 3600 para así obtener los mAh.

Si float no fuera tan limitado como acumulador (o al menos eso me temo), se podría mejorar la precisión del cálculo muestreando cada décima de segundo. De hacerlo así, se le agregaría un cero más al divisor.
Gracias por la respuesta!

Entonces lo que me faltaría seria sumarle el valor a la variable mah en cada vuelta de loop y esa suma dividirala en cada vuelta por 3600?

Podría ser algo así? Corregime si entendí mal

Code: [Select]
void current_capacity()
    {
      time= (hour() * 3600) + (minute() * 60) + (second()); // Convierto la el tiempo en segundos para sumarlo       

        if (millis() - t_muestreo > 1000)
          {
           mah+= time * (amps * 1000);                           // Capacidad = tiempo transcurrido * I.
           mah/= 3600;
           t_muestreo = millis();
          }
    }

steel_series

Me sigue pasando lo mismo que antes, los valores se acumulan y aumentan exponencialmente, no se como promediar la medida.

De hecho hice lo mismo que antes pero en distinto orden  :smiley-yell:

steel_series

Lo puede solucionar! encontré un ejemplo de algo similar y lo pude adaptar a lo que estaba haciendo, todavía esta en prueba pero parece que anda bien.

Dejo el código que soluciono mi problema por si alguien lo necesita.
Code: [Select]

unsigned long t_muestreo=0;
float time=0.00;
float time_pas=0.00;
float prev_time=0.00;
float mah=0.00;

void current_capacity()
    {
time = (hour()*3600.0) + (minute()*60.0) + second();

if (millis()-t_muestreo>2000)
   {
     time_pas = time - prev_time;
     mah = mah + (amps*1000.0) * (time_pas/ 3600.0);
     prev_time=time; 
     t_muestreo=millis();
   }                 
    }


Saludos y gracias!


Go Up