Ignore:
Timestamp:
Nov 1, 2025, 5:01:01 PM (2 days ago)
Author:
f.jahn
Message:
 
Location:
trunk/fw_g473rct/SES/src
Files:
4 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}
  • trunk/fw_g473rct/SES/src/eeprom.c

    r28 r35  
    217217        // battery parameter
    218218
    219         /* cef                                          */                                                                                      99,                             // cef
     219        /* cef                                          */                                                                                      990,                    // cef %*10
    220220        /* peukert                                      */                                                                                      105,                    // peukert
    221221        /* cellCapacity                         */                                                                                      160000,                 // cell Capacity in mAh
     
    259259
    260260        /* extraDischargeStrom_mA       */                                                                                      7,                              // mA, current that LiPro consumes itself
    261         /* cefW         */                                                                                                                      90,                             // 90% cef for Wh calculations
     261        /* cefW         */                                                                                                                      900,                    // 90% cef for Wh calculations [%*10]
    262262        /* Battery Empty Detection Mode*/                                                                               1,                              // Auto, from BMS
    263263        /* AUX MODE */                                                                                                                  AUX_MODE_HEATER,// Heizung
  • trunk/fw_g473rct/SES/src/sysdata.c

    r28 r35  
    5858        sys_data.s.values.message[23] = 'z';
    5959
     60        sys_data.s.values.peukertRemoveCorrectionFaktor = 1000; //1.000
     61 
     62
    6063}
  • trunk/fw_g473rct/SES/src/wh_counter.c

    r31 r35  
    4242
    4343  double cefwh;
    44   if (sys_data.s.values.calculatedCEFWh <= 0)
    45   {
    46         cefwh =  sys_data.s.parameter.cef / 100.0;
    47   }
    48   else
    49   {
    50         cefwh =  sys_data.s.values.calculatedCEFWh / 1000.0;
    51   }
     44//  if (sys_data.s.values.calculatedCEFWh <= 0)
     45//  {
     46        cefwh =  sys_data.s.parameter.cefW / 1000.0;
     47 // }
     48 // else
     49 // {
     50//      cefwh =  sys_data.s.values.calculatedCEFWh / 1000.0;
     51//  }
    5252 
    5353  double realStrom;
     
    5757  // bei Strom größer 0 -> Ladestrom CEF rechnen
    5858  if (realStrom >= 0) {// 99 --> 99% --> 0.99
    59     sys_data.s.values.correctedStromForChargeWhCnt = (realStrom * cefwh) ;   
     59    sys_data.s.values.correctedStromForChargeWhCnt = (realStrom * cefwh * (sys_data.s.values.peukertRemoveCorrectionFaktor / 1000.0)) ;   
    6060  }
    6161  else
     
    7575  sys_data.s.values.mWsCounter += p_mW; // Energy value for both positive and negative currents
    7676  sys_data.s.values.mWs_AutoMode += p_mW;
    77 
     77 
     78  if (sys_data.s.values.soc > 0)
     79  {
     80        sys_data.s.values.mWsCounterUncorrected +=  ((int64_t) realStrom * sys_data.s.values.batteryVoltage )/ 1000LL;
     81  }
    7882
    7983  // Begrenzen, Batterie darf nicht über 100% gehen
Note: See TracChangeset for help on using the changeset viewer.