Changeset 35 for trunk/fw_g473rct/SES/src/ah_counter.c
- Timestamp:
- Nov 1, 2025, 5:01:01 PM (32 hours ago)
- File:
-
- 1 edited
-
trunk/fw_g473rct/SES/src/ah_counter.c (modified) (13 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/fw_g473rct/SES/src/ah_counter.c
r28 r35 17 17 #include "wh_counter.h" 18 18 #include "eeprom.h" 19 #include "stdio.h" 19 20 // --- EXTERNE VARIABLEN -------------------------------------------------------- 20 21 … … 26 27 27 28 // --- LOKALE VARIABLEN - bitte hier dokumentieren ------------------------------ 28 int startMeasurement = 0;29 int startMeasurementDischarge = 0; 29 30 int startMeasurementCEF = 0; 31 30 32 // --- LOKALE FUNKTIONS PROTOTYPEN ---------------------------------------------- 31 33 int getSocAhRated(void); … … 37 39 void AH_COUNTER_Init(void) 38 40 { 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 ; 40 46 } 41 47 … … 90 96 static uint64_t totalDischarge = 0; 91 97 static uint64_t totalCharge = 0; 92 98 93 99 int64_t cellCapacitySeconds = (int64_t)sys_data.s.parameter.cellCapacity * 60 * 60; // Umrechnung mAh zu mAs 94 100 … … 104 110 { 105 111 //99 --> 99% --> 0.99 106 if (sys_data.s.values.calculatedCEFAh <= 0)107 {108 cef = sys_data.s.parameter.cef / 100 .0;109 }110 else111 {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); 115 121 } 116 122 else // if (realStrom < 0) … … 128 134 calcPow = pow(iBatDivIbatNenn , peukert - 1.0); 129 135 sys_data.s.values.batteryCurrentCorrected = (current * calcPow); 136 130 137 } 131 138 else sys_data.s.values.batteryCurrentCorrected = realStrom; … … 151 158 sys_data.s.values.mAsCounter += sys_data.s.values.batteryCurrentCorrected; 152 159 sys_data.s.values.mAs_AutoMode += sys_data.s.values.batteryCurrentCorrected; 160 153 161 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 157 183 // Begrenzen, Batterie darf nicht über 100% gehen 158 184 if (sys_data.s.values.mAsCounter > cellCapacitySeconds) sys_data.s.values.mAsCounter = cellCapacitySeconds; … … 161 187 { 162 188 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 163 194 } 164 195 … … 169 200 { 170 201 batteryFullCounter++; 202 if (batteryFullCounter > sys_data.s.parameter.tBatFull) batteryFullCounter = sys_data.s.parameter.tBatFull; 171 203 } 172 204 else … … 175 207 } 176 208 177 if (batteryFullCounter > sys_data.s.parameter.tBatFull)209 if (batteryFullCounter >= sys_data.s.parameter.tBatFull) 178 210 { 179 211 sys_data.s.values.mAsCounter = cellCapacitySeconds; 180 212 sys_data.s.values.mAs_AutoMode = 0; 213 sys_data.s.values.mAh_AutoMode = 0; 181 214 // Here we can set Wh to max 182 215 WH_COUNTER_SetToMax(); 183 216 184 217 //und wir starten eine neue Battery Kapazitäts und Energiemessung 185 startMeasurement = 1; 218 if (startMeasurementDischarge == 0) 219 { 220 221 startMeasurementDischarge = 1; 222 } 186 223 187 224 if (startMeasurementCEF == 1) 188 225 { 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); 192 230 } 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 193 239 } 194 240 … … 202 248 { 203 249 cnt++; 204 if ( (cnt >= 10) && (startMeasurement == 1)) // 5 Sekunden fest250 if (cnt >= 10) 205 251 { 206 252 cnt = 10; //sys_data.s.parameter.tBatFull; 207 253 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 capacity254 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 209 255 { 210 256 211 257 AH_COUNTER_SetDetectedAh(); 212 258 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 } 217 263 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 218 277 } 219 278 } … … 231 290 { 232 291 cnt++; 233 if ( (cnt >= 10) && (startMeasurement == 1)) // 5 Sekunden fest292 if (cnt >= 10) 234 293 { 235 294 cnt = 10; //sys_data.s.parameter.tBatFull; 236 295 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 capacity296 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 238 297 { 239 298 240 AH_COUNTER_SetDetectedAh();299 AH_COUNTER_SetDetectedAh(); 241 300 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; 246 320 } 247 321 } … … 262 336 default: sys_data.s.values.soc = 0; 263 337 } 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 264 347 }
Note: See TracChangeset
for help on using the changeset viewer.
