Changeset 28 for trunk/fw_g473rct/SES/src/ah_counter.c
- Timestamp:
- Sep 11, 2025, 4:17:09 PM (7 weeks ago)
- File:
-
- 1 edited
-
trunk/fw_g473rct/SES/src/ah_counter.c (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/fw_g473rct/SES/src/ah_counter.c
r27 r28 27 27 // --- LOKALE VARIABLEN - bitte hier dokumentieren ------------------------------ 28 28 int startMeasurement = 0; 29 int startMeasurementCEF = 0; 29 30 // --- LOKALE FUNKTIONS PROTOTYPEN ---------------------------------------------- 30 31 int getSocAhRated(void); … … 97 98 98 99 100 int32_t realStrom = (int32_t) sys_data.s.values.batteryCurrent - sys_data.s.parameter.extraDischargeStrom_mA; 99 101 100 102 // bei Strom größer 0 -> Ladestrom CEF rechnen 101 if (sys_data.s.values.batteryCurrent>= 0)103 if (realStrom >= 0) 102 104 { 103 105 //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) 108 117 { // bei Strom kleiner 0 peukert rechnen 109 118 //int32_t ratedCurrent = sys_data.s.parameter.cellRatedCurrent * 1000; 110 119 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! 113 123 { 114 current = sys_data.s.values.batteryCurrent;124 current = realStrom; 115 125 iBatDivIbatNenn = current / ratedCurrent; 116 126 iBatDivIbatNenn = -iBatDivIbatNenn; … … 119 129 sys_data.s.values.batteryCurrentCorrected = (current * calcPow); 120 130 } 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 126 135 // Counting negative current 127 136 if (sys_data.s.values.batteryCurrent < 0) 128 137 { 129 totalDischarge += - sys_data.s.values.batteryCurrent;138 totalDischarge += -realStrom; 130 139 sys_data.s.values.dischargeTotalAh = totalDischarge / 3600000; //Umrechnung von mAs auf Ah 131 140 132 133 141 sys_data.s.values.fullCyclesCnt = (uint16_t) ((sys_data.s.values.dischargeTotalAh * 1000) / sys_data.s.parameter.cellCapacity); 134 142 } 135 143 else 136 144 { 137 totalCharge += sys_data.s.values.batteryCurrent;145 totalCharge += realStrom; 138 146 sys_data.s.values.chargeTotalAh = totalCharge / 3600000; //Umrechnung von mAs auf Ah 139 147 } 140 141 148 142 149 143 150 // Aufsummieren 144 151 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; 146 153 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; 147 156 148 157 // Begrenzen, Batterie darf nicht über 100% gehen … … 175 184 //und wir starten eine neue Battery Kapazitäts und Energiemessung 176 185 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 } 177 193 } 178 194 179 195 sys_data.s.values.mAhCounter = sys_data.s.values.mAsCounter / 3600LL; 180 196 197 // --- BATTERY LEER ERKENNUNG 181 198 static uint16_t cnt; 182 199 if (sys_data.s.parameter.batteryEmptyDetectionMode == 0) … … 191 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 192 209 { 193 // This line is not so important anymore, because we do not allow mAh_AutoMode to be greater than zero210 194 211 AH_COUNTER_SetDetectedAh(); 195 212 WH_COUNTER_SetDetectedEnergy(); 213 sys_data.s.values.ahCounterCEF_AutoMode = 0; 214 sys_data.s.values.whCounterCEF_AutoMode = 0; 196 215 startMeasurement = 0; 197 216 } … … 222 241 WH_COUNTER_SetDetectedEnergy(); 223 242 startMeasurement = 0; 243 startMeasurementCEF = 1; 224 244 } 225 245 sys_data.s.values.lastTimeVbatEmpty = 0U;
Note: See TracChangeset
for help on using the changeset viewer.
