Changeset 28 for trunk/fw_g473rct/SES/src
- Timestamp:
- Sep 11, 2025, 4:17:09 PM (7 weeks ago)
- Location:
- trunk/fw_g473rct/SES/src
- Files:
-
- 5 edited
-
ah_counter.c (modified) (6 diffs)
-
eeprom.c (modified) (18 diffs)
-
outputs.c (modified) (2 diffs)
-
sysdata.c (modified) (1 diff)
-
wh_counter.c (modified) (3 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; -
trunk/fw_g473rct/SES/src/eeprom.c
r27 r28 1 //https://controllerstech.com/eeprom-and-stm32/ 1 // https://controllerstech.com/eeprom-and-stm32/ 2 #include <string.h> 2 3 3 4 #include "eeprom.h" … … 11 12 // Define the I2C 12 13 extern I2C_HandleTypeDef hi2c3; 13 #define EEPROM_I2C &hi2c314 #define EEPROM_I2C &hi2c3 14 15 15 16 // EEPROM ADDRESS (8bits) 16 #define EEPROM_ADDR 0xA017 #define EEPROM_ADDR 0xA0 17 18 18 19 // Define the Page Size and number of pages 19 #define PAGE_SIZE 64// in Bytes20 #define PAGE_NUM 4096// number of pages20 #define PAGE_SIZE 64 // in Bytes 21 #define PAGE_NUM 4096 // number of pages 21 22 22 23 … … 103 104 uint16_t cefW; 104 105 int16_t batteryEmptyDetectionMode; 106 uint16_t auxOutputMode; 107 uint16_t auxOutputSetpointOn; 108 uint16_t auxOutputSetpointOff; 109 uint16_t auxOutputInverted; 105 110 106 111 } eeprom_data_t; … … 138 143 139 144 140 141 142 143 145 // Data to store reated defines 144 //#define SIZEOF_DEFAULT_EEPROM_DATA (sizeof(eeprom_new_data_t))145 #define SIZEOF_CHANGED_EEPROM_DATA (sizeof(eeprom_data_t))146 #define SIZEOF_DEVICE_INFO (sizeof(device_info_t))147 #define SIZEOF_EEPROM_STATE (sizeof(eeprom_state_t))148 149 #define SIZE_OF_DATA_TO_STORE (SIZEOF_CHANGED_EEPROM_DATA + SIZEOF_DEVICE_INFO + SIZEOF_EEPROM_STATE)146 //#define SIZEOF_DEFAULT_EEPROM_DATA (sizeof(eeprom_new_data_t)) 147 //#define SIZEOF_CHANGED_EEPROM_DATA (sizeof(eeprom_data_t)) 148 //#define SIZEOF_DEVICE_INFO (sizeof(device_info_t)) 149 //#define SIZEOF_EEPROM_STATE (sizeof(eeprom_state_t)) 150 151 //#define SIZE_OF_DATA_TO_STORE (SIZEOF_CHANGED_EEPROM_DATA + SIZEOF_DEVICE_INFO + SIZEOF_EEPROM_STATE) 150 152 151 153 152 154 // Adress related defines 153 155 #define EEPROM_ADRESS_FIRST_START_ID (0) 154 #define FIRST_START_ID (0xFF) 156 #define FIRST_START_ID (0xFF) // See datasheet (Chapter "Initial delivery state") 155 157 #define CONFIG_ID (01) // Increment by 1 to make compartible update, more than 1 - incompartible 156 158 #if CONFIG_ID == FIRST_START_ID … … 166 168 167 169 168 169 // muss modulo 8 noch hinzufügen wg 8 byte alignement 170 static uint8_t eepromData[SIZE_OF_DATA_TO_STORE]; 170 static eeprom_stored_data_t eepromData; 171 171 172 172 … … 261 261 /* cefW */ 90, // 90% cef for Wh calculations 262 262 /* Battery Empty Detection Mode*/ 1, // Auto, from BMS 263 264 263 /* AUX MODE */ AUX_MODE_HEATER,// Heizung 264 /* AUX SETPOINT ON */ 13600, // Erkennung Ladegerät ab 13,6V 265 /* AUX SETPOINT OFF */ 100, // Batterie Entladung wird erkannt bei -100mA 266 /* AUX Inverted */ 0, // Nicht invertiert 265 267 }; 266 268 … … 281 283 uint8_t firstStartCatcher; 282 284 283 EEPROM_Read(0,EEPROM_ADRESS_FIRST_START_ID, &firstStartCatcher, 1); 284 285 EEPROM_Read(0, EEPROM_ADRESS_FIRST_START_ID, &firstStartCatcher, 1); 285 286 286 287 if (firstStartCatcher == FIRST_START_ID) … … 306 307 HAL_StatusTypeDef EEPROM_fullRestore(sys_data_t* data) 307 308 { 308 eeprom_stored_data_t* dataToStore;309 309 printf("EEPROM FULL RESTORE!\n"); 310 310 311 311 /**************** LESE_DEFAULT_WERTE ************************/ 312 312 313 dataToStore = (eeprom_stored_data_t*) eepromData; 314 315 // Schnittstellenparameter 316 dataToStore->changedData.baudrate = defaultEepromData.baudrate; 317 dataToStore->changedData.parityMode = defaultEepromData.parityMode; 318 dataToStore->changedData.stopBits = defaultEepromData.stopBits; 319 dataToStore->changedData.slave_adress = defaultEepromData.slave_adress; 320 321 // Offset und Gain 322 dataToStore->changedData.batteryCurrentOffsetRefTemperatureShunt = defaultEepromData.batteryCurrentOffsetRefTemperatureShunt; 323 dataToStore->changedData.batteryCurrentOffsetRefTemperatureChip = defaultEepromData.batteryCurrentOffsetRefTemperatureChip; 324 dataToStore->changedData.batteryCurrentGainRefTempShunt = defaultEepromData.batteryCurrentGainRefTempShunt; 325 dataToStore->changedData.batteryCurrentGainRefTempChip = defaultEepromData.batteryCurrentGainRefTempChip; 326 dataToStore->changedData.batteryCurrentOffsetTemperatureCalibrationTemperature = defaultEepromData.batteryCurrentOffsetTemperatureCalibrationTemperature; 327 dataToStore->changedData.batteryCurrentGainTemperatureCalibrationShuntTemperature = defaultEepromData.batteryCurrentGainTemperatureCalibrationShuntTemperature; 328 dataToStore->changedData.batteryCurrentGainTemperatureCalibrationChipTemperature = defaultEepromData.batteryCurrentGainTemperatureCalibrationChipTemperature; 329 dataToStore->changedData.batteryCurrentOffsetRefshuntVoltage = defaultEepromData.batteryCurrentOffsetRefshuntVoltage; 330 dataToStore->changedData.batteryCurrentOffsetCommonModeCalibrationVoltage = defaultEepromData.batteryCurrentOffsetCommonModeCalibrationVoltage; 331 dataToStore->changedData.batteryCurrentOffsetCommonModeCompensationFactor = defaultEepromData.batteryCurrentOffsetCommonModeCompensationFactor; 332 dataToStore->changedData.batteryCurrentOffsetTemperatureCompensationFactor = defaultEepromData.batteryCurrentOffsetTemperatureCompensationFactor; 333 dataToStore->changedData.batteryCurrentGainRefCurrent = defaultEepromData.batteryCurrentGainRefCurrent; 334 dataToStore->changedData.batteryCurrentGainTemperatureCompensationShuntFactor = defaultEepromData.batteryCurrentGainTemperatureCompensationShuntFactor; 335 dataToStore->changedData.batteryCurrentGainTemperatureCompensationChipFactor = defaultEepromData.batteryCurrentGainTemperatureCompensationChipFactor; 336 337 dataToStore->changedData.currentOffset = defaultEepromData.currentOffset; 338 dataToStore->changedData.currentGain = defaultEepromData.currentGain; 339 340 dataToStore->changedData.currentOffsetFast = defaultEepromData.currentOffsetFast; 341 dataToStore->changedData.currentGainFast = defaultEepromData.currentGainFast; 342 343 // AH Counter Parameter 344 dataToStore->changedData.cef = defaultEepromData.cef; 345 dataToStore->changedData.peukert = defaultEepromData.peukert; 346 dataToStore->changedData.cellCapacity = defaultEepromData.cellCapacity; 347 dataToStore->changedData.cellEnergy = defaultEepromData.cellEnergy; 348 dataToStore->changedData.iBatFull = defaultEepromData.iBatFull; 349 dataToStore->changedData.tBatFull = defaultEepromData.tBatFull; 350 dataToStore->changedData.uBatFull = defaultEepromData.uBatFull; 351 dataToStore->changedData.uBatEmpty = defaultEepromData.uBatEmpty; 352 dataToStore->changedData.socCalcMode = defaultEepromData.socCalcMode; 353 dataToStore->changedData.cellRatedDischargeTime = defaultEepromData.cellRatedDischargeTime; 354 355 // Schaltausgänge 356 dataToStore->changedData.lvpStart = defaultEepromData.lvpStart; 357 dataToStore->changedData.lvpStop = defaultEepromData.lvpStop; 358 dataToStore->changedData.ovpStart = defaultEepromData.ovpStart; 359 dataToStore->changedData.ovpStop = defaultEepromData.ovpStop; 360 dataToStore->changedData.loadCurrentLimit = defaultEepromData.loadCurrentLimit; 361 dataToStore->changedData.chargeCurrentLimit = defaultEepromData.chargeCurrentLimit; 362 dataToStore->changedData.chargeStopHighTemperatureStart = defaultEepromData.chargeStopHighTemperatureStart; 363 dataToStore->changedData.chargeStopHighTemperatureStop = defaultEepromData.chargeStopHighTemperatureStop; 364 dataToStore->changedData.chargeStopLowTemperatureStart = defaultEepromData.chargeStopLowTemperatureStart; 365 dataToStore->changedData.chargeStopLowTemperatureStop = defaultEepromData.chargeStopLowTemperatureStop; 366 dataToStore->changedData.dischargeStopHighTemperatureStart = defaultEepromData.dischargeStopHighTemperatureStart; 367 dataToStore->changedData.dischargeStopHighTemperatureStop = defaultEepromData.dischargeStopHighTemperatureStop; 368 dataToStore->changedData.dischargeStopLowTemperatureStart = defaultEepromData.dischargeStopLowTemperatureStart; 369 dataToStore->changedData.dischargeStopLowTemperatureStop = defaultEepromData.dischargeStopLowTemperatureStop; 370 371 dataToStore->changedData.uBatEmptyCompStartTemp = defaultEepromData.uBatEmptyCompStartTemp; 372 dataToStore->changedData.uBatEmptyCompStopTemp = defaultEepromData.uBatEmptyCompStopTemp; 373 dataToStore->changedData.uBatEmptyCompStopVolt = defaultEepromData.uBatEmptyCompStopVolt; 374 375 dataToStore->changedData.extraDischargeStrom_mA = defaultEepromData.extraDischargeStrom_mA; 376 dataToStore->changedData.cefW = defaultEepromData.cefW; 377 dataToStore->changedData.batteryEmptyDetectionMode = defaultEepromData.batteryEmptyDetectionMode; 378 379 313 memcpy(&eepromData.changedData, &defaultEepromData, sizeof(eeprom_data_t)); 380 314 381 315 // Eeprom Status Infos 382 dataToStore->eepromState.writeCounter++; 383 dataToStore->eepromState.structureSize = sizeof(eeprom_stored_data_t); 384 dataToStore->eepromState.revisionInfo = 0; 385 dataToStore->eepromState.firstStartId = CONFIG_ID; 386 387 388 /****************EEPROM Speichern********************/ 389 390 EEPROM_Write(0, 0, (uint8_t*)eepromData, SIZE_OF_DATA_TO_STORE); 391 392 393 394 316 eepromData.eepromState.writeCounter++; 317 eepromData.eepromState.structureSize = sizeof(eeprom_stored_data_t); 318 eepromData.eepromState.revisionInfo = 0; 319 eepromData.eepromState.firstStartId = CONFIG_ID; 320 321 /**************** EEPROM Speichern ********************/ 322 323 EEPROM_Write(0, 0, (uint8_t*)&eepromData, sizeof(eeprom_stored_data_t)); 395 324 396 325 /**************** AUSLESEN_UND_PRÜFEN ********************/ 397 326 398 327 return EEPROM_readConfig(data); 399 400 401 402 } 403 328 } 329 330 //------------------------------------------------------------------------------ 404 331 405 332 //Werkeinstellung ohne Kalibrierwert Überschreibung … … 407 334 { 408 335 printf("EEPROM FACTORY RESTORE/UPDATE!\n"); 409 410 336 411 412 eeprom_stored_data_t* dataToStore = (eeprom_stored_data_t*)eepromData; 413 414 EEPROM_readConfig(data); // Restoring calibration data 337 //eeprom_stored_data_t* dataToStore = &eepromData; 338 339 EEPROM_readConfig(data); // Restoring calibration data 415 340 416 341 // Offset und Gain 417 342 418 dataToStore->changedData.batteryCurrentOffsetRefTemperatureShunt = data->s.parameter.batteryCurrentOffsetRefTemperatureShunt;419 dataToStore->changedData.batteryCurrentOffsetRefTemperatureChip= data->s.parameter.batteryCurrentOffsetRefTemperatureChip;420 dataToStore->changedData.batteryCurrentOffsetRefshuntVoltage = data->s.parameter.batteryCurrentOffsetRefshuntVoltage;421 dataToStore->changedData.batteryCurrentOffsetCommonModeCalibrationVoltage = data->s.parameter.batteryCurrentOffsetCommonModeCalibrationVoltage;422 dataToStore->changedData.batteryCurrentOffsetCommonModeCompensationFactor = data->s.parameter.batteryCurrentOffsetCommonModeCompensationFactor;423 dataToStore->changedData.batteryCurrentOffsetTemperatureCalibrationTemperature= data->s.parameter.batteryCurrentOffsetTemperatureCalibrationTemperature;424 dataToStore->changedData.batteryCurrentOffsetTemperatureCompensationFactor= data->s.parameter.batteryCurrentOffsetTemperatureCompensationFactor;425 dataToStore->changedData.currentOffset= data->s.parameter.batteryCurrentOffset;426 dataToStore->changedData.currentGain = data->s.parameter.batteryCurrentGainCorrectionFaktor;427 dataToStore->changedData.currentOffsetFast= data->s.parameter.batteryCurrentOffsetFast;428 dataToStore->changedData.currentGainFast = data->s.parameter.batteryCurrentGainCorrectionFaktorFast;343 eepromData.changedData.batteryCurrentOffsetRefTemperatureShunt = data->s.parameter.batteryCurrentOffsetRefTemperatureShunt; 344 eepromData.changedData.batteryCurrentOffsetRefTemperatureChip = data->s.parameter.batteryCurrentOffsetRefTemperatureChip; 345 eepromData.changedData.batteryCurrentOffsetRefshuntVoltage = data->s.parameter.batteryCurrentOffsetRefshuntVoltage; 346 eepromData.changedData.batteryCurrentOffsetCommonModeCalibrationVoltage = data->s.parameter.batteryCurrentOffsetCommonModeCalibrationVoltage; 347 eepromData.changedData.batteryCurrentOffsetCommonModeCompensationFactor = data->s.parameter.batteryCurrentOffsetCommonModeCompensationFactor; 348 eepromData.changedData.batteryCurrentOffsetTemperatureCalibrationTemperature = data->s.parameter.batteryCurrentOffsetTemperatureCalibrationTemperature; 349 eepromData.changedData.batteryCurrentOffsetTemperatureCompensationFactor = data->s.parameter.batteryCurrentOffsetTemperatureCompensationFactor; 350 eepromData.changedData.currentOffset = data->s.parameter.batteryCurrentOffset; 351 eepromData.changedData.currentGain = data->s.parameter.batteryCurrentGainCorrectionFaktor; 352 eepromData.changedData.currentOffsetFast = data->s.parameter.batteryCurrentOffsetFast; 353 eepromData.changedData.currentGainFast = data->s.parameter.batteryCurrentGainCorrectionFaktorFast; 429 354 430 dataToStore->changedData.batteryCurrentGainRefTempShunt= data->s.parameter.batteryCurrentGainRefTempShunt;431 dataToStore->changedData.batteryCurrentGainRefTempChip= data->s.parameter.batteryCurrentGainRefTempChip;432 dataToStore->changedData.batteryCurrentGainRefCurrent = data->s.parameter.batteryCurrentGainRefCurrent;433 dataToStore->changedData.batteryCurrentGainTemperatureCalibrationShuntTemperature = data->s.parameter.batteryCurrentGainTemperatureCalibrationShuntTemperature;434 dataToStore->changedData.batteryCurrentGainTemperatureCompensationShuntFactor = data->s.parameter.batteryCurrentGainTemperatureCompensationShuntFactor;435 dataToStore->changedData.batteryCurrentGainTemperatureCalibrationChipTemperature = data->s.parameter.batteryCurrentGainTemperatureCalibrationChipTemperature;436 dataToStore->changedData.batteryCurrentGainTemperatureCompensationChipFactor = data->s.parameter.batteryCurrentGainTemperatureCompensationChipFactor;355 eepromData.changedData.batteryCurrentGainRefTempShunt = data->s.parameter.batteryCurrentGainRefTempShunt; 356 eepromData.changedData.batteryCurrentGainRefTempChip = data->s.parameter.batteryCurrentGainRefTempChip; 357 eepromData.changedData.batteryCurrentGainRefCurrent = data->s.parameter.batteryCurrentGainRefCurrent; 358 eepromData.changedData.batteryCurrentGainTemperatureCalibrationShuntTemperature = data->s.parameter.batteryCurrentGainTemperatureCalibrationShuntTemperature; 359 eepromData.changedData.batteryCurrentGainTemperatureCompensationShuntFactor = data->s.parameter.batteryCurrentGainTemperatureCompensationShuntFactor; 360 eepromData.changedData.batteryCurrentGainTemperatureCalibrationChipTemperature = data->s.parameter.batteryCurrentGainTemperatureCalibrationChipTemperature; 361 eepromData.changedData.batteryCurrentGainTemperatureCompensationChipFactor = data->s.parameter.batteryCurrentGainTemperatureCompensationChipFactor; 437 362 438 363 // Schnittstellenparameter 439 dataToStore->changedData.baudrate = defaultEepromData.baudrate;440 dataToStore->changedData.parityMode= defaultEepromData.parityMode;441 dataToStore->changedData.stopBits = defaultEepromData.stopBits;442 dataToStore->changedData.slave_adress = defaultEepromData.slave_adress;443 dataToStore->changedData.ibn_day = defaultEepromData.ibn_day;444 dataToStore->changedData.ibn_month= defaultEepromData.ibn_month;445 dataToStore->changedData.ibn_year = defaultEepromData.ibn_year;446 dataToStore->changedData.user_id = defaultEepromData.user_id;364 eepromData.changedData.baudrate = defaultEepromData.baudrate; 365 eepromData.changedData.parityMode = defaultEepromData.parityMode; 366 eepromData.changedData.stopBits = defaultEepromData.stopBits; 367 eepromData.changedData.slave_adress = defaultEepromData.slave_adress; 368 eepromData.changedData.ibn_day = defaultEepromData.ibn_day; 369 eepromData.changedData.ibn_month = defaultEepromData.ibn_month; 370 eepromData.changedData.ibn_year = defaultEepromData.ibn_year; 371 eepromData.changedData.user_id = defaultEepromData.user_id; 447 372 448 373 //Ah counter 449 dataToStore->changedData.cef = defaultEepromData.cef;450 dataToStore->changedData.cellCapacity = defaultEepromData.cellCapacity;451 dataToStore->changedData.cellEnergy= defaultEepromData.cellEnergy;452 dataToStore->changedData.iBatFull = defaultEepromData.iBatFull;453 dataToStore->changedData.peukert = defaultEepromData.peukert;454 dataToStore->changedData.tBatFull = defaultEepromData.tBatFull;455 dataToStore->changedData.uBatFull = defaultEepromData.uBatFull;456 dataToStore->changedData.uBatEmpty= defaultEepromData.uBatEmpty;457 dataToStore->changedData.socCalcMode = defaultEepromData.socCalcMode;458 dataToStore->changedData.cellRatedDischargeTime= defaultEepromData.cellRatedDischargeTime;374 eepromData.changedData.cef = defaultEepromData.cef; 375 eepromData.changedData.cellCapacity = defaultEepromData.cellCapacity; 376 eepromData.changedData.cellEnergy = defaultEepromData.cellEnergy; 377 eepromData.changedData.iBatFull = defaultEepromData.iBatFull; 378 eepromData.changedData.peukert = defaultEepromData.peukert; 379 eepromData.changedData.tBatFull = defaultEepromData.tBatFull; 380 eepromData.changedData.uBatFull = defaultEepromData.uBatFull; 381 eepromData.changedData.uBatEmpty = defaultEepromData.uBatEmpty; 382 eepromData.changedData.socCalcMode = defaultEepromData.socCalcMode; 383 eepromData.changedData.cellRatedDischargeTime = defaultEepromData.cellRatedDischargeTime; 459 384 460 385 // Schaltausgänge 461 dataToStore->changedData.lvpStart = defaultEepromData.lvpStart; 462 dataToStore->changedData.lvpStop = defaultEepromData.lvpStop; 463 dataToStore->changedData.ovpStart = defaultEepromData.ovpStart; 464 dataToStore->changedData.ovpStop = defaultEepromData.ovpStop; 465 dataToStore->changedData.loadCurrentLimit = defaultEepromData.loadCurrentLimit; 466 dataToStore->changedData.chargeCurrentLimit = defaultEepromData.chargeCurrentLimit; 467 dataToStore->changedData.chargeStopHighTemperatureStart = defaultEepromData.chargeStopHighTemperatureStart; 468 dataToStore->changedData.chargeStopHighTemperatureStop = defaultEepromData.chargeStopHighTemperatureStop; 469 dataToStore->changedData.chargeStopLowTemperatureStart = defaultEepromData.chargeStopLowTemperatureStart; 470 dataToStore->changedData.chargeStopLowTemperatureStop = defaultEepromData.chargeStopLowTemperatureStop; 471 dataToStore->changedData.dischargeStopHighTemperatureStart = defaultEepromData.dischargeStopHighTemperatureStart; 472 dataToStore->changedData.dischargeStopHighTemperatureStop = defaultEepromData.dischargeStopHighTemperatureStop; 473 dataToStore->changedData.dischargeStopLowTemperatureStart = defaultEepromData.dischargeStopLowTemperatureStart; 474 dataToStore->changedData.dischargeStopLowTemperatureStop = defaultEepromData.dischargeStopLowTemperatureStop; 475 476 dataToStore->changedData.uBatEmptyCompStartTemp = defaultEepromData.uBatEmptyCompStartTemp; 477 dataToStore->changedData.uBatEmptyCompStopTemp = defaultEepromData.uBatEmptyCompStopTemp; 478 dataToStore->changedData.uBatEmptyCompStopVolt = defaultEepromData.uBatEmptyCompStopVolt; 479 480 dataToStore->changedData.extraDischargeStrom_mA = defaultEepromData.extraDischargeStrom_mA; 481 dataToStore->changedData.cefW = defaultEepromData.cefW; 482 dataToStore->changedData.batteryEmptyDetectionMode = defaultEepromData.batteryEmptyDetectionMode; 386 eepromData.changedData.lvpStart = defaultEepromData.lvpStart; 387 eepromData.changedData.lvpStop = defaultEepromData.lvpStop; 388 eepromData.changedData.ovpStart = defaultEepromData.ovpStart; 389 eepromData.changedData.ovpStop = defaultEepromData.ovpStop; 390 eepromData.changedData.loadCurrentLimit = defaultEepromData.loadCurrentLimit; 391 eepromData.changedData.chargeCurrentLimit = defaultEepromData.chargeCurrentLimit; 392 eepromData.changedData.chargeStopHighTemperatureStart = defaultEepromData.chargeStopHighTemperatureStart; 393 eepromData.changedData.chargeStopHighTemperatureStop = defaultEepromData.chargeStopHighTemperatureStop; 394 eepromData.changedData.chargeStopLowTemperatureStart = defaultEepromData.chargeStopLowTemperatureStart; 395 eepromData.changedData.chargeStopLowTemperatureStop = defaultEepromData.chargeStopLowTemperatureStop; 396 eepromData.changedData.dischargeStopHighTemperatureStart = defaultEepromData.dischargeStopHighTemperatureStart; 397 eepromData.changedData.dischargeStopHighTemperatureStop = defaultEepromData.dischargeStopHighTemperatureStop; 398 eepromData.changedData.dischargeStopLowTemperatureStart = defaultEepromData.dischargeStopLowTemperatureStart; 399 eepromData.changedData.dischargeStopLowTemperatureStop = defaultEepromData.dischargeStopLowTemperatureStop; 400 401 eepromData.changedData.uBatEmptyCompStartTemp = defaultEepromData.uBatEmptyCompStartTemp; 402 eepromData.changedData.uBatEmptyCompStopTemp = defaultEepromData.uBatEmptyCompStopTemp; 403 eepromData.changedData.uBatEmptyCompStopVolt = defaultEepromData.uBatEmptyCompStopVolt; 404 405 eepromData.changedData.extraDischargeStrom_mA = defaultEepromData.extraDischargeStrom_mA; 406 eepromData.changedData.cefW = defaultEepromData.cefW; 407 eepromData.changedData.batteryEmptyDetectionMode = defaultEepromData.batteryEmptyDetectionMode; 408 eepromData.changedData.auxOutputMode = defaultEepromData.auxOutputMode; 409 eepromData.changedData.auxOutputSetpointOn = defaultEepromData.auxOutputSetpointOn; 410 eepromData.changedData.auxOutputSetpointOff = defaultEepromData.auxOutputSetpointOff; 411 eepromData.changedData.auxOutputInverted = defaultEepromData.auxOutputInverted; 483 412 484 413 485 486 487 488 dataToStore->eepromState.writeCounter = dataToStore->eepromState.writeCounter++; 489 dataToStore->eepromState.structureSize = sizeof(eeprom_stored_data_t); 490 dataToStore->eepromState.revisionInfo = 0; 491 dataToStore->eepromState.firstStartId = CONFIG_ID; 492 493 dataToStore->deviceInfo.deviceInfoWritten = 1; 494 dataToStore->deviceInfo.SN = data->s.parameter.sn; 495 496 EEPROM_Write(0,0, (uint8_t*)dataToStore, SIZE_OF_DATA_TO_STORE); 497 498 414 eepromData.eepromState.writeCounter = eepromData.eepromState.writeCounter++; 415 eepromData.eepromState.structureSize = sizeof(eeprom_stored_data_t); 416 eepromData.eepromState.revisionInfo = 0; 417 eepromData.eepromState.firstStartId = CONFIG_ID; 418 419 eepromData.deviceInfo.deviceInfoWritten = 1; 420 eepromData.deviceInfo.SN = data->s.parameter.sn; 421 422 EEPROM_Write(0,0, (uint8_t*)&eepromData, sizeof(eeprom_stored_data_t)); 423 499 424 return EEPROM_readConfig(data); 500 425 } … … 505 430 /****************LESE_WERTE_AUS_SYSDATA*********************/ 506 431 printf("EEPROM STORE CONFIG!\n"); 507 dataToStore = (eeprom_stored_data_t*) eepromData;432 dataToStore = (eeprom_stored_data_t*)&eepromData; 508 433 509 434 // Schnittstellenparameter … … 578 503 dataToStore->changedData.batteryEmptyDetectionMode = data->s.parameter.batteryEmptyDetectionMode; 579 504 505 dataToStore->changedData.auxOutputMode = data->s.parameter.auxOutputMode; 506 dataToStore->changedData.auxOutputSetpointOn = data->s.parameter.auxOutputSetpointOn; 507 dataToStore->changedData.auxOutputSetpointOff = data->s.parameter.auxOutputSetpointOff; 508 dataToStore->changedData.auxOutputInverted = data->s.parameter.auxOutputInverted; 509 580 510 // Eeprom Status Infos 581 511 dataToStore->eepromState.writeCounter++; … … 591 521 592 522 593 EEPROM_Write(0,0, (uint8_t*)dataToStore, SIZE_OF_DATA_TO_STORE);523 EEPROM_Write(0,0, (uint8_t*)dataToStore, sizeof(eeprom_stored_data_t)); 594 524 595 525 return EEPROM_readConfig(data); … … 605 535 606 536 607 EEPROM_Read(0, 0, (uint8_t*) eepromData, sizeof(eepromData));608 609 610 dataToStore = (eeprom_stored_data_t*) eepromData;537 EEPROM_Read(0, 0, (uint8_t*)&eepromData, sizeof(eepromData)); 538 539 540 dataToStore = (eeprom_stored_data_t*)&eepromData; 611 541 612 542 // Schnittstellenparameter … … 680 610 data->s.parameter.cefW = dataToStore->changedData.cefW; 681 611 data->s.parameter.batteryEmptyDetectionMode = dataToStore->changedData.batteryEmptyDetectionMode; 612 613 data->s.parameter.auxOutputMode = dataToStore->changedData.auxOutputMode; 614 data->s.parameter.auxOutputSetpointOn = dataToStore->changedData.auxOutputSetpointOn; 615 data->s.parameter.auxOutputSetpointOff = dataToStore->changedData.auxOutputSetpointOff; 616 data->s.parameter.auxOutputInverted = dataToStore->changedData.auxOutputInverted; 617 682 618 683 684 619 685 620 // Geräteinformation … … 719 654 } 720 655 656 //----------------------------------------------------------------------------- 721 657 722 658 void EEPROM_Read (uint16_t page, uint16_t offset, uint8_t *data, uint16_t size) … … 735 671 uint16_t MemAddress = startPage<<paddrposition | offset; 736 672 uint16_t bytesremaining = bytestowrite(size, offset); 737 HAL_I2C_Mem_Read(EEPROM_I2C, EEPROM_ADDR, MemAddress, 2, &data[pos], bytesremaining, 1000); 673 HAL_StatusTypeDef res = HAL_I2C_Mem_Read(EEPROM_I2C, EEPROM_ADDR, MemAddress, 2, &data[pos], bytesremaining, 1000); 674 #ifdef DEBUG 675 //printf("MemAddress = 0x%04X, data ptr = 0x%08X, bytes_remaining = %u, res = %u\n", MemAddress, (uint32_t)&data[pos], bytesremaining, res); 676 #endif 738 677 startPage += 1; 739 678 offset=0; … … 741 680 pos += bytesremaining; 742 681 } 743 744 } 745 682 } 683 684 //----------------------------------------------------------------------------- 746 685 747 686 void EEPROM_Write (uint16_t page, uint16_t offset, uint8_t *data, uint16_t size) 748 687 { 749 750 688 // Find out the number of bit, where the page addressing starts 751 689 int paddrposition = PADDRPOSITION; … … 768 706 uint16_t bytesremaining = bytestowrite(size, offset); // calculate the remaining bytes to be written 769 707 770 HAL_I2C_Mem_Write(EEPROM_I2C, EEPROM_ADDR, MemAddress, 2, &data[pos], bytesremaining, 1000); // write the data to the EEPROM 708 HAL_StatusTypeDef res = HAL_I2C_Mem_Write(EEPROM_I2C, EEPROM_ADDR, MemAddress, 2, &data[pos], bytesremaining, 1000); // write the data to the EEPROM 709 #ifdef DEBUG 710 //printf("MemAddress = 0x%04X, data ptr = 0x%08X, bytes_remaining = %u, res = %u\n", MemAddress, (uint32_t)&data[pos], bytesremaining, res); 711 #endif 771 712 startPage += 1; // increment the page, so that a new page address can be selected for further write 772 713 offset=0; // since we will be writing to a new page, so offset will be 0 -
trunk/fw_g473rct/SES/src/outputs.c
r20 r28 26 26 //--- LOKALE FUNKTIONS PROTOTYPEN ---------------------------------------------- 27 27 /* 28 * @brief 28 * @brief Heizungssteuerung 29 29 * @param kein 30 30 * @retval kein 31 31 */ 32 void AuxModeHeaterExec(void); 33 34 32 35 //--- LOKALE FUNKTIONEN - bitte hier dokumentieren ----------------------------- 33 36 … … 226 229 lastMode = sys_data.s.parameter.ovpMode; 227 230 } 231 232 233 234 #define LVP_DETECTION_LEVEL 6000 //< 6 V 235 #define CHARGE_DETECT_HYSTERESE 10 236 237 void AuxModeHeaterExec(void) 238 { 239 static int outputState=0; 240 241 int offv = sys_data.s.parameter.auxOutputSetpointOn - CHARGE_DETECT_HYSTERESE; 242 int onv = sys_data.s.parameter.auxOutputSetpointOn + CHARGE_DETECT_HYSTERESE; 243 244 if ((sys_data.s.values.shuntVoltage > onv) && (sys_data.s.values.ovp_sense < LVP_DETECTION_LEVEL) && (outputState == 0)) 245 { 246 printf("Heater on\r\n"); 247 outputState = 1; 248 if (sys_data.s.parameter.auxOutputInverted == 0) 249 { 250 HAL_GPIO_WritePin(AUX_EN_GPIO_Port, AUX_EN_Pin, GPIO_PIN_SET); 251 } 252 else 253 { 254 HAL_GPIO_WritePin(AUX_EN_GPIO_Port, AUX_EN_Pin, GPIO_PIN_RESET); 255 } 256 257 } 258 259 //Ausschalten 260 //Wenn Spannung am Shunt < setpoint (ladegeräteerkennung 14,8V?) und Entladung 261 //Oder wenn OVP wieder da ist 262 //sys_data.s.values.batteryCurrent < sys_data.s.parameter.auxOutputSetpointOff 263 264 if ((sys_data.s.values.shuntVoltage < offv ) || (sys_data.s.values.ovp_sense > LVP_DETECTION_LEVEL)) 265 { 266 if (outputState == 1) 267 { 268 printf("Heater off\r\n"); 269 outputState = 0; 270 if (sys_data.s.parameter.auxOutputInverted == 0) 271 { 272 HAL_GPIO_WritePin(AUX_EN_GPIO_Port, AUX_EN_Pin, GPIO_PIN_RESET); 273 } 274 else 275 { 276 HAL_GPIO_WritePin(AUX_EN_GPIO_Port, AUX_EN_Pin, GPIO_PIN_SET); 277 } 278 } 279 } 280 } 281 282 void AuxModeSOCExec(void) 283 { 284 static int outputState=0; 285 286 287 if ((sys_data.s.values.soc > (sys_data.s.parameter.auxOutputSetpointOn*1000)) && (outputState == 0)) 288 { 289 printf("AUX on (SOC Mode)\r\n"); 290 outputState = 1; 291 if (sys_data.s.parameter.auxOutputInverted == 0) 292 { 293 HAL_GPIO_WritePin(AUX_EN_GPIO_Port, AUX_EN_Pin, GPIO_PIN_SET); 294 } 295 else 296 { 297 HAL_GPIO_WritePin(AUX_EN_GPIO_Port, AUX_EN_Pin, GPIO_PIN_RESET); 298 } 299 300 } 301 302 303 if ((sys_data.s.values.soc < (sys_data.s.parameter.auxOutputSetpointOff*1000)) && (outputState == 1)) 304 { 305 printf("AUX off (SOC Mode)\r\n"); 306 outputState = 0; 307 if (sys_data.s.parameter.auxOutputInverted == 0) 308 { 309 HAL_GPIO_WritePin(AUX_EN_GPIO_Port, AUX_EN_Pin, GPIO_PIN_RESET); 310 } 311 else 312 { 313 HAL_GPIO_WritePin(AUX_EN_GPIO_Port, AUX_EN_Pin, GPIO_PIN_SET); 314 } 315 } 316 317 318 } 319 320 321 int16_t loadCurrentLimit; // 30 maximaler Laststrom in A wenn der Strom grer ist als der eingestelle Wert dann wird die Laststrom Protection aktiv, darf nicht unsigned sein, da Entladestrom mit Minus angegeben [A] Default -500 A 322 int16_t chargeCurrentLimit; // 31 maximaler Ladestrom in A wenn der Strom grer ist als der eingestelle Wert dann wird die Ladestrom Protection aktiv [A] Default:500A 323 324 325 int16_t chargeStopHighTemperatureStart; // 32 Abschalttemperatur Ladung wegen zu hoher Temperatur [C * 100] 326 int16_t chargeStopHighTemperatureStop; // 33 Wiedereinschalttemperatur [C * 100] 327 328 int16_t chargeStopLowTemperatureStart; // 34 Abschalttemperatur Ladung wegen zu niedriger Temperatur [C * 100] 329 int16_t chargeStopLowTemperatureStop; // 35 Wiedereinschalttemperatur [C * 100] 330 331 int16_t dischargeStopHighTemperatureStart; // 36 Abschalttemperatur Entladung wegen zu hoher Temperatur [C * 100] 332 int16_t dischargeStopHighTemperatureStop; // 37 Wiedereinschalttemperatur[C * 100] 333 334 int16_t dischargeStopLowTemperatureStart; // 38 Abschalttemperatur EntLadung wegen zu niedriger Temperatur 335 int16_t dischargeStopLowTemperatureStop; // 39 Wiedereinschalttemperatur 336 337 338 339 void AuxModeAlarmExec(void) 340 { 341 static int outputState=0; 342 343 344 if ( 345 (sys_data.s.values.shuntTemperature > (chargeStopHighTemperatureStart - 500)) || 346 (sys_data.s.values.chipTemperature > (chargeStopHighTemperatureStart - 500)) || 347 (sys_data.s.values.shuntTemperature < (chargeStopLowTemperatureStart + 500)) || 348 (sys_data.s.values.chipTemperature < (chargeStopLowTemperatureStart + 500)) || 349 (sys_data.s.values.shuntTemperature > (dischargeStopHighTemperatureStart - 500)) || 350 (sys_data.s.values.chipTemperature > (dischargeStopHighTemperatureStart - 500)) || 351 (sys_data.s.values.shuntTemperature < (dischargeStopLowTemperatureStart + 500)) || 352 (sys_data.s.values.chipTemperature < (dischargeStopLowTemperatureStart + 500)) || 353 (sys_data.s.values.batteryCurrent > ((chargeCurrentLimit*1000LL) - 10000)) || 354 (sys_data.s.values.batteryCurrent < ((loadCurrentLimit*1000LL) + 10000)) 355 356 ) 357 { 358 if ( outputState == 0) 359 { 360 printf("AUX on (Alarm Mode)\r\n"); 361 outputState = 1; 362 if (sys_data.s.parameter.auxOutputInverted == 0) 363 { 364 HAL_GPIO_WritePin(AUX_EN_GPIO_Port, AUX_EN_Pin, GPIO_PIN_SET); 365 } 366 else 367 { 368 HAL_GPIO_WritePin(AUX_EN_GPIO_Port, AUX_EN_Pin, GPIO_PIN_RESET); 369 } 370 } 371 } 372 else // Alles OK 373 { 374 if ( outputState == 0) 375 { 376 printf("AUX off (Alarm Mode)\r\n"); 377 outputState = 0; 378 if (sys_data.s.parameter.auxOutputInverted == 0) 379 { 380 HAL_GPIO_WritePin(AUX_EN_GPIO_Port, AUX_EN_Pin, GPIO_PIN_RESET); 381 } 382 else 383 { 384 HAL_GPIO_WritePin(AUX_EN_GPIO_Port, AUX_EN_Pin, GPIO_PIN_SET); 385 } 386 } 387 } 388 } 389 390 391 void OUTPUTS_CheckAUX(void) 392 { 393 394 switch (sys_data.s.parameter.auxOutputMode) 395 { 396 case AUX_MODE_OFF: 397 HAL_GPIO_WritePin(AUX_EN_GPIO_Port, AUX_EN_Pin, GPIO_PIN_RESET); 398 break; 399 400 case AUX_MODE_HEATER: 401 AuxModeHeaterExec(); 402 break; 403 404 case AUX_MODE_SOC: 405 AuxModeSOCExec(); 406 break; 407 408 case AUX_MODE_ALARM: 409 AuxModeAlarmExec(); 410 break; 411 412 413 default: 414 HAL_GPIO_WritePin(AUX_EN_GPIO_Port, AUX_EN_Pin, GPIO_PIN_RESET); 415 break; 416 417 418 } 419 420 421 } 422 228 423 /*************************** End of file ****************************/ -
trunk/fw_g473rct/SES/src/sysdata.c
r26 r28 55 55 sys_data.s.values.message[0] = 'a'; 56 56 sys_data.s.values.message[1] = 'b'; 57 sys_data.s.values.message[ 18] = 'y';58 sys_data.s.values.message[ 19] = 'z';57 sys_data.s.values.message[22] = 'y'; 58 sys_data.s.values.message[23] = 'z'; 59 59 60 60 } -
trunk/fw_g473rct/SES/src/wh_counter.c
r26 r28 41 41 if (totalCharge == 0) totalCharge = sys_data.s.values.chargeTotalWh * 3600000; 42 42 43 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 } 52 53 double realStrom; 54 realStrom = (int32_t) sys_data.s.values.batteryCurrent - sys_data.s.parameter.extraDischargeStrom_mA; 55 43 56 //------------ separater CEF ----------- 44 57 // bei Strom größer 0 -> Ladestrom CEF rechnen 45 if (sys_data.s.values.batteryCurrent >= 0) { 46 // 99 --> 99% --> 0.99 47 int32_t cefW = sys_data.s.parameter.cefW; 48 sys_data.s.values.correctedStromForChargeWhCnt = (sys_data.s.values.batteryCurrent * cefW) / 100; 49 sys_data.s.values.correctedStromForChargeWhCnt -= sys_data.s.parameter.extraDischargeStrom_mA; 50 } else { 58 if (realStrom >= 0) {// 99 --> 99% --> 0.99 59 sys_data.s.values.correctedStromForChargeWhCnt = (realStrom * cefwh) ; 60 } 61 else 62 { 51 63 sys_data.s.values.correctedStromForChargeWhCnt = sys_data.s.values.batteryCurrentCorrected; 52 64 } … … 150 162 return (int32_t)SoC; 151 163 } 164 152 165 153 166 int32_t WH_COUNTER_GetSoCAutoTemp(void) { … … 171 184 // dazu zunächst den Mittelwert der noch verbleibenden Spannung vom aktuellen Zeitpunkt bis zur Abschaltung ermittelndazu 172 185 int64_t avgVoltage = (sys_data.s.values.batteryVoltage + sys_data.s.values.uBatEmptyTempComp) / 2; 186 173 187 174 188 //Jetzt mit der verbleibene Kapazität die verbleibene Energie unter den aktuellen Bedingungen ermitteln (Spannung bei akt. Temp)
Note: See TracChangeset
for help on using the changeset viewer.
