Ignore:
Timestamp:
Nov 1, 2025, 5:01:01 PM (32 hours ago)
Author:
f.jahn
Message:
 
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/fw_g473rct/SES/src/ah_counter.c

    r28 r35  
    1717#include "wh_counter.h"
    1818#include "eeprom.h"
     19#include "stdio.h"
    1920//      --- EXTERNE VARIABLEN --------------------------------------------------------
    2021
     
    2627
    2728//      --- LOKALE VARIABLEN - bitte hier dokumentieren ------------------------------
    28 int startMeasurement = 0;
     29int startMeasurementDischarge = 0;
    2930int startMeasurementCEF = 0;
     31
    3032//      --- LOKALE FUNKTIONS PROTOTYPEN ----------------------------------------------
    3133int getSocAhRated(void);
     
    3739void AH_COUNTER_Init(void)
    3840{
    39   sys_data.s.values.mAs_AutoMode =   (int32_t)-sys_data.s.parameter.cellCapacity * 3600;;
     41  sys_data.s.values.mAs_AutoMode =   (int32_t)-sys_data.s.parameter.cellCapacity * 3600;
     42  sys_data.s.values.mAh_AutoMode =   (int32_t)-sys_data.s.parameter.cellCapacity ;
     43
     44  sys_data.s.values.mAs_AutoModeU =   (int32_t)-sys_data.s.parameter.cellCapacity * 3600;
     45  sys_data.s.values.mAh_AutoModeU =   (int32_t)-sys_data.s.parameter.cellCapacity ;
    4046}
    4147
     
    9096  static uint64_t totalDischarge = 0;
    9197  static uint64_t totalCharge = 0;
    92 
     98 
    9399  int64_t cellCapacitySeconds =  (int64_t)sys_data.s.parameter.cellCapacity * 60 * 60; // Umrechnung mAh zu mAs
    94100
     
    104110  {
    105111          //99 --> 99% --> 0.99
    106           if (sys_data.s.values.calculatedCEFAh <= 0)
    107           {
    108                 cef =  sys_data.s.parameter.cef / 100.0;
    109           }
    110           else
    111           {
    112                 cef =  sys_data.s.values.calculatedCEFAh / 1000.0;
    113           }
    114           sys_data.s.values.batteryCurrentCorrected = realStrom * cef;
     112          //if (sys_data.s.values.calculatedCEFAh <= 0)
     113          //{
     114                cef =  sys_data.s.parameter.cef / 1000.0;
     115          //}
     116          //else
     117          //{
     118          //    cef =  sys_data.s.values.calculatedCEFAh / 1000.0;
     119          //}
     120          sys_data.s.values.batteryCurrentCorrected = realStrom * cef * (sys_data.s.values.peukertRemoveCorrectionFaktor/1000.0);
    115121  }
    116122  else // if (realStrom < 0)
     
    128134                  calcPow = pow(iBatDivIbatNenn , peukert - 1.0);
    129135                  sys_data.s.values.batteryCurrentCorrected = (current * calcPow);
     136
    130137          }
    131138          else sys_data.s.values.batteryCurrentCorrected = realStrom;
     
    151158  sys_data.s.values.mAsCounter += sys_data.s.values.batteryCurrentCorrected;
    152159  sys_data.s.values.mAs_AutoMode += sys_data.s.values.batteryCurrentCorrected;
     160 
    153161  sys_data.s.values.mAh_AutoMode = sys_data.s.values.mAs_AutoMode / 3600LL;
    154   sys_data.s.values.ahCounterCEF_AutoMode +=  sys_data.s.values.batteryCurrentCorrected;
    155   sys_data.s.values.whCounterCEF_AutoMode +=  sys_data.s.values.batteryCurrentCorrected * sys_data.s.values.batteryVoltage;
    156 
     162 
     163
     164
     165  if ((sys_data.s.values.soc > 0) || startMeasurementDischarge)
     166  {
     167        sys_data.s.values.mAsCounterUncorrected +=  realStrom;
     168        sys_data.s.values.mAhCounterUncorrected = sys_data.s.values.mAsCounterUncorrected / 3600;
     169  }
     170
     171 
     172  sys_data.s.values.mAs_AutoModeU += sys_data.s.values.batteryCurrent;
     173  sys_data.s.values.mAh_AutoModeU = sys_data.s.values.mAs_AutoModeU / 3600LL;
     174  if (sys_data.s.values.mAh_AutoModeU != 0)
     175  {
     176        sys_data.s.values.peukertRemoveCorrectionFaktor = 1000 * sys_data.s.values.mAh_AutoMode /  sys_data.s.values.mAh_AutoModeU;
     177  }
     178  else
     179  {
     180        sys_data.s.values.peukertRemoveCorrectionFaktor=1000;
     181  }
     182 
    157183  // Begrenzen, Batterie darf nicht über 100% gehen
    158184  if (sys_data.s.values.mAsCounter > cellCapacitySeconds) sys_data.s.values.mAsCounter = cellCapacitySeconds;
     
    161187  {
    162188        sys_data.s.values.mAs_AutoMode = 0;
     189        sys_data.s.values.mAh_AutoMode = 0;
     190        sys_data.s.values.mAs_AutoModeU = 0;
     191        sys_data.s.values.mAh_AutoModeU = 0;
     192
     193
    163194  }
    164195
     
    169200  {
    170201    batteryFullCounter++;
     202        if (batteryFullCounter > sys_data.s.parameter.tBatFull) batteryFullCounter = sys_data.s.parameter.tBatFull;
    171203  }
    172204  else
     
    175207  }
    176208
    177   if (batteryFullCounter > sys_data.s.parameter.tBatFull)
     209  if (batteryFullCounter >= sys_data.s.parameter.tBatFull)
    178210  {
    179211    sys_data.s.values.mAsCounter = cellCapacitySeconds;
    180212        sys_data.s.values.mAs_AutoMode = 0;
     213        sys_data.s.values.mAh_AutoMode = 0;
    181214        // Here we can set Wh to max
    182215        WH_COUNTER_SetToMax();
    183216
    184217        //und wir starten eine neue Battery Kapazitäts und Energiemessung
    185         startMeasurement = 1;
     218        if (startMeasurementDischarge == 0)
     219        {
     220           
     221          startMeasurementDischarge = 1;
     222        }
    186223
    187224        if (startMeasurementCEF == 1)
    188225        {
    189           startMeasurementCEF=0;
    190           sys_data.s.values.calculatedCEFAh = 1000 * (sys_data.s.values.detectedCapacity * 3600) / sys_data.s.values.ahCounterCEF_AutoMode ;
    191           sys_data.s.values.calculatedCEFWh = 1000 * (sys_data.s.values.detectedEnergy * 3600) / sys_data.s.values.whCounterCEF_AutoMode;
     226          startMeasurementCEF = 0;
     227          sys_data.s.values.calculatedCEFAh = (1000LL * sys_data.s.values.detectedCapacityAtActualCRate * 3600LL) / sys_data.s.values.mAsCounterUncorrected ;
     228          sys_data.s.values.calculatedCEFWh = (1000LL * sys_data.s.values.detectedEnergyAtActualCRate * 3600LL) / sys_data.s.values.mWsCounterUncorrected;
     229          printf("Time %d: Batterie Full event mAhCarged=%d, tCharge=%d, cefAh=%d, cefWh=%d, u=%d, i=%d\r\n",sys_data.s.values.onTime, sys_data.s.values.mAhCounterUncorrected, sys_data.s.values.lastTimeVbatEmpty, sys_data.s.values.calculatedCEFAh, sys_data.s.values.calculatedCEFWh, sys_data.s.values.batteryVoltage, sys_data.s.values.batteryCurrent);
    192230        }
     231        else {
     232         
     233          //Messung CEF ferig, halter Zähler auf 0 solange Batterie voll, damit die Messung der Kapazität/Energy bei aktuellen Entladestrom korrekt startet
     234          sys_data.s.values.mAsCounterUncorrected = 0;
     235          sys_data.s.values.mAhCounterUncorrected = 0;
     236          sys_data.s.values.mWsCounterUncorrected = 0;
     237        }
     238       
    193239  }
    194240
     
    202248    {
    203249          cnt++;
    204           if ((cnt >= 10) && (startMeasurement == 1)) // 5 Sekunden fest
     250          if (cnt >= 10) 
    205251          {
    206252                  cnt = 10; //sys_data.s.parameter.tBatFull;
    207253
    208                   if ((sys_data.s.values.lastTimeVbatFull >= 3600U) && (sys_data.s.values.lastTimeVbatFull <= 200U * 3600U))    // This line prevents from very high discharge-currents to be used to estimate battery capacity
     254                  if ( (startMeasurementDischarge == 1) && (sys_data.s.values.lastTimeVbatFull >= 1200U) && (sys_data.s.values.lastTimeVbatFull <= 200U * 3600U))       // This line prevents from very high discharge-currents to be used to estimate battery capacity
    209255                  {
    210256                         
    211257                          AH_COUNTER_SetDetectedAh();
    212258                          WH_COUNTER_SetDetectedEnergy();
    213                           sys_data.s.values.ahCounterCEF_AutoMode = 0;
    214                           sys_data.s.values.whCounterCEF_AutoMode = 0;
    215                           startMeasurement = 0;                   
    216                   }
     259                          sys_data.s.values.detectedCapacityAtActualCRate = -sys_data.s.values.mAsCounterUncorrected / 3600;
     260                          sys_data.s.values.detectedEnergyAtActualCRate = -sys_data.s.values.mWsCounterUncorrected /3600;                 
     261                          printf("Time %d: Empty event(1), cn=%d, ca=%d, tDischarge=%d, u=%d, i=%d\r\n",sys_data.s.values.onTime, sys_data.s.values.detectedCapacity, sys_data.s.values.detectedCapacityAtActualCRate,  sys_data.s.values.lastTimeVbatFull, sys_data.s.values.batteryVoltage, sys_data.s.values.batteryCurrent);
     262                  }
    217263                  sys_data.s.values.lastTimeVbatEmpty = 0U;
     264
     265                 
     266                  //Messung wurde gespeichert (bzw. verworfen). Nächste Messung nach Aufladung
     267                  startMeasurementDischarge = 0;
     268                                       
     269
     270                  //Batterie ist Leer, wir können die Messung der Ladung beginnen
     271                  startMeasurementCEF = 1;
     272
     273                  sys_data.s.values.mAsCounterUncorrected = 0;
     274                  sys_data.s.values.mAhCounterUncorrected = 0;
     275                  sys_data.s.values.mWsCounterUncorrected = 0;
     276
    218277          }
    219278    }
     
    231290    {
    232291          cnt++;
    233           if ((cnt >= 10) && (startMeasurement == 1)) // 5 Sekunden fest
     292          if (cnt >= 10)
    234293          {
    235294                  cnt = 10; //sys_data.s.parameter.tBatFull;
    236295
    237                   if ((sys_data.s.values.lastTimeVbatFull >= 3600U) && (sys_data.s.values.lastTimeVbatFull <= 240U * 3600U))    // This line prevents from very high discharge-currents to be used to estimate battery capacity
     296                  if ( (startMeasurementDischarge == 1) && (sys_data.s.values.lastTimeVbatFull >= 3600U) && (sys_data.s.values.lastTimeVbatFull <= 240U * 3600U))       // This line prevents from very high discharge-currents to be used to estimate battery capacity
    238297                  {
    239298                         
    240                           AH_COUNTER_SetDetectedAh();
     299                          AH_COUNTER_SetDetectedAh();
    241300                          WH_COUNTER_SetDetectedEnergy();
    242                           startMeasurement = 0;                   
    243                           startMeasurementCEF = 1;
    244                   }
    245                   sys_data.s.values.lastTimeVbatEmpty = 0U;
     301                          sys_data.s.values.detectedCapacityAtActualCRate = -sys_data.s.values.mAsCounterUncorrected/ 3600;
     302                          sys_data.s.values.detectedEnergyAtActualCRate = -sys_data.s.values.mWsCounterUncorrected / 3600;     
     303                          printf("Time %d: Empty event(2), cn=%d, ca=%d, tDischarge=%d, u=%d, i=%d\r\n",sys_data.s.values.onTime, sys_data.s.values.detectedCapacity, sys_data.s.values.detectedCapacityAtActualCRate,  sys_data.s.values.lastTimeVbatFull, sys_data.s.values.batteryVoltage, sys_data.s.values.batteryCurrent);
     304                  }
     305
     306                 
     307                 
     308                  sys_data.s.values.lastTimeVbatEmpty = 0U;
     309                 
     310                  //Messung wurde gespeichert (bzw. verworfen). Nächste Messung nach Aufladung
     311                  startMeasurementDischarge = 0;               
     312
     313                  //Batterie leer wir können mit der Messung der Ladung beginnen
     314                  startMeasurementCEF = 1;
     315
     316                 
     317                  sys_data.s.values.mAsCounterUncorrected = 0;
     318                  sys_data.s.values.mAhCounterUncorrected = 0;
     319                  sys_data.s.values.mWsCounterUncorrected = 0;
    246320          }
    247321    }
     
    262336          default: sys_data.s.values.soc = 0;
    263337  }
     338
     339        sys_data.s.values.soc0 = getSocAhRated()/100;                     
     340        sys_data.s.values.soc1 = getSocAhAuto()/100;                             
     341        sys_data.s.values.soc2 = WH_COUNTER_GetSoCManual()/100;   
     342        sys_data.s.values.soc3 = WH_COUNTER_GetSoCAuto()/100;     
     343        sys_data.s.values.soc4 = WH_COUNTER_GetSoCAutoTemp()/100; 
     344 
     345
     346
    264347}
Note: See TracChangeset for help on using the changeset viewer.