Ignore:
Timestamp:
Sep 11, 2025, 4:17:09 PM (7 weeks ago)
Author:
f.jahn
Message:
 
File:
1 edited

Legend:

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

    r27 r28  
    2727//      --- LOKALE VARIABLEN - bitte hier dokumentieren ------------------------------
    2828int startMeasurement = 0;
     29int startMeasurementCEF = 0;
    2930//      --- LOKALE FUNKTIONS PROTOTYPEN ----------------------------------------------
    3031int getSocAhRated(void);
     
    9798
    9899
     100  int32_t realStrom = (int32_t)  sys_data.s.values.batteryCurrent - sys_data.s.parameter.extraDischargeStrom_mA;
    99101
    100102  // bei Strom größer 0 -> Ladestrom CEF rechnen
    101   if(sys_data.s.values.batteryCurrent >= 0)
     103  if (realStrom >= 0)
    102104  {
    103105          //99 --> 99% --> 0.99
    104           cef =  sys_data.s.parameter.cef / 100.0;
    105           sys_data.s.values.batteryCurrentCorrected = sys_data.s.values.batteryCurrent * cef;
    106   }
    107   else
     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;
     115  }
     116  else // if (realStrom < 0)
    108117  {       // bei Strom kleiner 0 peukert rechnen
    109118          //int32_t ratedCurrent = sys_data.s.parameter.cellRatedCurrent * 1000;
    110119          int32_t ratedCurrent = sys_data.s.parameter.cellCapacity / sys_data.s.parameter.cellRatedDischargeTime;
    111 
    112           if (sys_data.s.values.batteryCurrent < -ratedCurrent) //ACHTUNG mit Minus das vorzeichen gedreht!
     120         
     121
     122          if (realStrom < -ratedCurrent) //ACHTUNG mit Minus das vorzeichen gedreht!
    113123          {
    114                   current = sys_data.s.values.batteryCurrent;
     124                  current = realStrom;
    115125                  iBatDivIbatNenn = current / ratedCurrent;
    116126                  iBatDivIbatNenn = -iBatDivIbatNenn;
     
    119129                  sys_data.s.values.batteryCurrentCorrected = (current * calcPow);
    120130          }
    121           else sys_data.s.values.batteryCurrentCorrected = sys_data.s.values.batteryCurrent;
    122   }
    123 
    124   sys_data.s.values.batteryCurrentCorrected -= (int32_t)sys_data.s.parameter.extraDischargeStrom_mA;
    125 
     131          else sys_data.s.values.batteryCurrentCorrected = realStrom;
     132  }
     133
     134 
    126135  // Counting negative current
    127136  if (sys_data.s.values.batteryCurrent < 0)
    128137  {
    129           totalDischarge += -sys_data.s.values.batteryCurrent;
     138          totalDischarge += -realStrom;
    130139          sys_data.s.values.dischargeTotalAh = totalDischarge / 3600000; //Umrechnung von mAs auf Ah
    131140
    132 
    133141          sys_data.s.values.fullCyclesCnt = (uint16_t) ((sys_data.s.values.dischargeTotalAh * 1000) / sys_data.s.parameter.cellCapacity);
    134142  }
    135143  else
    136144  {
    137           totalCharge += sys_data.s.values.batteryCurrent;
     145          totalCharge += realStrom;
    138146          sys_data.s.values.chargeTotalAh = totalCharge / 3600000; //Umrechnung von mAs auf Ah
    139147  }
    140 
    141148
    142149
    143150  // Aufsummieren
    144151  sys_data.s.values.mAsCounter += sys_data.s.values.batteryCurrentCorrected;
    145   sys_data.s.values.mAs_AutoMode += (int64_t)sys_data.s.values.batteryCurrentCorrected;
     152  sys_data.s.values.mAs_AutoMode += sys_data.s.values.batteryCurrentCorrected;
    146153  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;
    147156
    148157  // Begrenzen, Batterie darf nicht über 100% gehen
     
    175184        //und wir starten eine neue Battery Kapazitäts und Energiemessung
    176185        startMeasurement = 1;
     186
     187        if (startMeasurementCEF == 1)
     188        {
     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;
     192        }
    177193  }
    178194
    179195  sys_data.s.values.mAhCounter = sys_data.s.values.mAsCounter / 3600LL;
    180196
     197  // --- BATTERY LEER ERKENNUNG
    181198  static uint16_t cnt;
    182199  if (sys_data.s.parameter.batteryEmptyDetectionMode == 0)
     
    191208                  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
    192209                  {
    193                           // This line is not so important anymore, because we do not allow mAh_AutoMode to be greater than zero
     210                         
    194211                          AH_COUNTER_SetDetectedAh();
    195212                          WH_COUNTER_SetDetectedEnergy();
     213                          sys_data.s.values.ahCounterCEF_AutoMode = 0;
     214                          sys_data.s.values.whCounterCEF_AutoMode = 0;
    196215                          startMeasurement = 0;                   
    197216                  }
     
    222241                          WH_COUNTER_SetDetectedEnergy();
    223242                          startMeasurement = 0;                   
     243                          startMeasurementCEF = 1;
    224244                  }
    225245                  sys_data.s.values.lastTimeVbatEmpty = 0U;
Note: See TracChangeset for help on using the changeset viewer.