Replaced 'FoMoCo' with '47Ah'

Lithium modules are now referred to as '47Ah'.
This commit is contained in:
doppelhub
2025-06-18 18:10:32 -04:00
parent 7e5f0150b4
commit c70329563e
11 changed files with 88 additions and 96 deletions

View File

@@ -8,7 +8,7 @@
#include "src/libcm.h"
#define FW_VERSION "0.9.5f"
#define BUILD_DATE "2025JUN02"
#define BUILD_DATE "2025JUN17"
//////////////////////////////////////////////////////////////////
@@ -25,15 +25,15 @@
//choose your battery type:
//#define BATTERY_TYPE_5AhG3 //if you're not sure, you probably have this battery
//#define BATTERY_TYPE_47AhFoMoCo
//#define BATTERY_TYPE_47Ah //aka FoMoCo //aka Samsung SDI modules
//choose how many cells are in series:
//#define STACK_IS_48S //All 5AhG3 Kits & FoMoCo Kits with QTY4 modules
//#define STACK_IS_60S //FoMoCo Kits with QTY5 modules
//#define STACK_IS_48S //All 5AhG3 Kits & 47Ah Kits with QTY4 modules
//#define STACK_IS_60S //47Ah Kits with QTY5 modules
//choose which grid charger is installed
//#define GRIDCHARGER_IS_NOT_1500W //All 5AhG3 Kits & 'standard' 47Ah FoMoCo Kits
//#define GRIDCHARGER_IS_1500W //'faster' 47Ah FoMoCo Kits only
//#define GRIDCHARGER_IS_NOT_1500W //All 5AhG3 Kits & 'standard' 47Ah Kits
//#define GRIDCHARGER_IS_1500W //47Ah Kits with 'fast' 6.5A charger
//choose ONE of the following
//must match actual "current hack" hardware configuration:

View File

@@ -97,7 +97,7 @@ void LiDisplay_begin(void)
{
#ifdef LIDISPLAY_CONNECTED
#ifdef BATTERY_TYPE_47AhFoMoCo
#ifdef BATTERY_TYPE_47Ah
#undef LIDISPLAY_GRIDCHARGE_PAGE_ID
#define LIDISPLAY_GRIDCHARGE_PAGE_ID 5
#endif
@@ -856,7 +856,7 @@ void LiDisplay_updateElement() {
LiDisplay_calculateFanSpeedStr();
if (!gc_sixty_s_fomoco_e_block_enabled && (MAX_CELL_INDEX == 59))
{
LiDisplay_updateNumericVal(LIDISPLAY_GRIDCHARGE_PAGE_ID, "t16", 3, "65516"); // E block label will be missing on a 60S FoMoCo pack display if we don't run this once.
LiDisplay_updateNumericVal(LIDISPLAY_GRIDCHARGE_PAGE_ID, "t16", 3, "65516"); // E block label will be missing on a 60S 47Ah pack display if we don't run this once.
gc_sixty_s_fomoco_e_block_enabled = true;
}
else if (LiDisplayFanSpeed_onScreen != currentFanSpeed)

View File

@@ -209,7 +209,7 @@ void SoC_updateUsingLatestOpenCircuitVoltage(void)
return estimatedSoC;
}
#elif defined BATTERY_TYPE_47AhFoMoCo
#elif defined BATTERY_TYPE_47Ah
uint8_t SoC_estimateFromRestingCellVoltage_percent(void)
{

View File

@@ -23,7 +23,7 @@
#define CELL_VREST_85_PERCENT_SoC 40000 //for maximum life, resting cell voltage should remain below 85% SoC
#define CELL_VREST_10_PERCENT_SoC 34200 //for maximum life, resting cell voltage should remain above 10% SoC
#define STACK_mAh_NOM 5000 //5 Ah nominal //nominal pack size (0:100% SoC)
#elif defined BATTERY_TYPE_47AhFoMoCo
#elif defined BATTERY_TYPE_47Ah
#define CELL_VREST_85_PERCENT_SoC 39700
#define CELL_VREST_10_PERCENT_SoC 34000
#define STACK_mAh_NOM 47000

View File

@@ -14,8 +14,8 @@
#define PIN_BATTCURRENT A0
#define PIN_USER_SW A1
#define PIN_VPIN_IN A2
#define PIN_TEMP_YEL A3 // 5AhG3: Exhaust, FoMoCo Top middle battery module
#define PIN_TEMP_GRN A4 // 5AhG3: Intake, FoMoCo Top rear battery module
#define PIN_TEMP_YEL A3 // 5AhG3: Exhaust //47Ah: Top middle battery
#define PIN_TEMP_GRN A4 // 5AhG3: Intake //47Ah: Top rear battery
#define PIN_TEMP_WHT A5
#define PIN_TEMP_BLU A6
#define PIN_FANOEM_LOW A7
@@ -48,7 +48,7 @@
#define PIN_BATTSCI_DE 41
#define PIN_COVER_SWITCH 42
#define PIN_GPIO0_CS_MIMA 43
#define PIN_GPIO3 44 //with daughterboard: 1500W charger current (if installed) //without daughterboard: heater (if installed)
#define PIN_GPIO3 44 //with daughterboard: 1500W charger current //without DB: heater (if installed)
#define PIN_BUZZER_PWM 45
#define PIN_LED3 46
#define PIN_SPI_EXT_CS 47

View File

@@ -193,7 +193,7 @@ void debugUSB_printData_temperatures(void)
Serial.print(F(", T_in:"));
Serial.print(String(temperature_intake_getLatest()));
Serial.print(F(", T_out:"));
#ifndef BATTERY_TYPE_47AhFoMoCo
#ifndef BATTERY_TYPE_47Ah
Serial.print(String(temperature_exhaust_getLatest()));
#else
Serial.print(F("none"));
@@ -201,7 +201,7 @@ void debugUSB_printData_temperatures(void)
Serial.print(F(", T_charger:"));
Serial.print(String(temperature_gridCharger_getLatest()));
Serial.print(F(", T_bay:"));
#ifndef BATTERY_TYPE_47AhFoMoCo
#ifndef BATTERY_TYPE_47Ah
Serial.print(String(temperature_ambient_getLatest()));
#else
Serial.print(F("none"));
@@ -277,8 +277,8 @@ void debugUSB_printConfigParameters(void)
#ifdef BATTERY_TYPE_5AhG3
Serial.print(F("/5AhG3"));
#elif defined BATTERY_TYPE_47AhFoMoCo
Serial.print(F("/FoMoCo"));
#elif defined BATTERY_TYPE_47Ah
Serial.print(F("/47Ah"));
#endif
#ifdef STACK_IS_48S

View File

@@ -246,8 +246,8 @@ void fan_handler(void)
#ifdef BATTERY_TYPE_5AhG3
gpio_setFanSpeed_OEM(fanSpeed_now);
#elif defined BATTERY_TYPE_47AhFoMoCo
//OEM battery fan is removed in FoMoCo systems. The battery fan circuitry is repurposed to allow LiBCM to control the PDU fan
#elif defined BATTERY_TYPE_47Ah
//OEM battery fan is removed in 47Ah Kits. The battery fan circuitry is repurposed to allow LiBCM to control the PDU fan
//Note that the MCM retains its OEM behavior (i.e. it can still control the PDU fan, too).
//JTS2doLater: Add new fan handler specifically for OEM fan... the direct gpio functions used below will only work properly if no other subsystem calls them
//JTS2doLater: Enable high speed if more than 500 kJ have flowed through the IGBT stage over the previous 60 seconds.

View File

@@ -90,7 +90,7 @@ void gpio_setFanSpeed_OEM(char speed)
//case FAN_MED: digitalWrite(PIN_FANOEM_LOW, HIGH); digitalWrite(PIN_FANOEM_HI, LOW); break; //same as FAN_LOW... OEM fan only supports OFF/LOW/HIGH
#ifdef BATTERY_TYPE_5AhG3
case FAN_HIGH: digitalWrite(PIN_FANOEM_LOW, LOW); digitalWrite(PIN_FANOEM_HI, HIGH); break; //OEM fan schematic requires one relay for high speed
#elif defined BATTERY_TYPE_47AhFoMoCo
#elif defined BATTERY_TYPE_47Ah
case FAN_HIGH: digitalWrite(PIN_FANOEM_LOW, HIGH); digitalWrite(PIN_FANOEM_HI, HIGH); break; //PDU fan schematic requires both relays for high speed
#endif
}

View File

@@ -24,12 +24,12 @@ void runFansIfNeeded(void)
else if (fan_getSpeed_now() == FAN_OFF ) { hysteresis_C = FAN_SPEED_HYSTERESIS_OFF_degC; }
if ( (temperature_intake_getLatest() < (GRID_CHARGING_FANS_OFF_BELOW_TEMP_C - hysteresis_C)) &&
#ifndef BATTERY_TYPE_47AhFoMoCo
#ifndef BATTERY_TYPE_47Ah
(temperature_ambient_getLatest() < (GRID_CHARGING_FANS_OFF_BELOW_TEMP_C - hysteresis_C)) &&
#endif
(temperature_battery_getLatest() < (GRID_CHARGING_FANS_OFF_BELOW_TEMP_C - hysteresis_C)) ) { fan_requestSpeed(FAN_REQUESTOR_GRIDCHARGER, FAN_OFF); }
else if ( (temperature_intake_getLatest() < (GRID_CHARGING_FANS_LOW_BELOW_TEMP_C - hysteresis_C)) &&
#ifndef BATTERY_TYPE_47AhFoMoCo
#ifndef BATTERY_TYPE_47Ah
(temperature_ambient_getLatest() < (GRID_CHARGING_FANS_LOW_BELOW_TEMP_C - hysteresis_C)) &&
#endif
(temperature_battery_getLatest() < (GRID_CHARGING_FANS_LOW_BELOW_TEMP_C - hysteresis_C)) ) { fan_requestSpeed(FAN_REQUESTOR_GRIDCHARGER, FAN_LOW); }
@@ -65,7 +65,7 @@ uint8_t gridCharger_isAllowedNow(void)
if (temperature_battery_getLatest() > DISABLE_GRIDCHARGING_ABOVE_BATTERY_TEMP_C) { return NO__BATTERY_IS_HOT; }
if (temperature_intake_getLatest() > DISABLE_GRIDCHARGING_ABOVE_INTAKE_TEMP_C ) { return NO__AIRINTAKE_IS_HOT; }
if (temperature_intake_getLatest() == TEMPERATURE_SENSOR_FAULT_LO ) { return NO__TEMP_UNPLUGGED_INTAKE; }
#ifndef BATTERY_TYPE_47AhFoMoCo
#ifndef BATTERY_TYPE_47Ah
if (temperature_exhaust_getLatest() > DISABLE_GRIDCHARGING_ABOVE_EXHAUST_TEMP_C) { return NO__TEMP_EXHAUST_IS_HOT; }
#endif
//time checks

View File

@@ -11,19 +11,19 @@
int8_t tempBattery = ROOM_TEMP_DEGC;
int8_t tempIntake = ROOM_TEMP_DEGC;
int8_t tempCharger = ROOM_TEMP_DEGC;
#ifndef BATTERY_TYPE_47AhFoMoCo // No explicit exhaust nor ambient temp sensors in FoMoCo case
int8_t tempExhaust = ROOM_TEMP_DEGC;
int8_t tempAmbient = ROOM_TEMP_DEGC;
#ifndef BATTERY_TYPE_47Ah //47Ah Kits don't have exhaust or ambient sensors
int8_t tempExhaust = ROOM_TEMP_DEGC;
int8_t tempAmbient = ROOM_TEMP_DEGC;
#endif
/////////////////////////////////////////////////////////////////////////////////////////
int8_t temperature_battery_getLatest(void) { return tempBattery; }
int8_t temperature_intake_getLatest(void) { return tempIntake; } //GRN (5AhG3 case) or WHT (FoMoCo case) OEM temp sensor
int8_t temperature_gridCharger_getLatest(void){ return tempCharger; } //BLU OEM temp sensor
#ifndef BATTERY_TYPE_47AhFoMoCo // No explicit exhaust nor ambient temp sensors in FoMoCo case
int8_t temperature_exhaust_getLatest(void) { return tempExhaust; } //YEL OEM temp sensor
int8_t temperature_ambient_getLatest(void) { return tempAmbient; } //WHT OEM temp sensor
int8_t temperature_battery_getLatest(void) { return tempBattery; }
int8_t temperature_intake_getLatest(void) { return tempIntake; } //OEM temp sensor: 5AhG3=GRN 47Ah=WHT
int8_t temperature_gridCharger_getLatest(void) { return tempCharger; } //BLU OEM temp sensor
#ifndef BATTERY_TYPE_47Ah //47Ah Kits don't have exhaust or ambient sensors
int8_t temperature_exhaust_getLatest(void) { return tempExhaust; } //YEL OEM temp sensor
int8_t temperature_ambient_getLatest(void) { return tempAmbient; } //WHT OEM temp sensor
#endif
/////////////////////////////////////////////////////////////////////////////////////////
@@ -36,7 +36,7 @@ void temperature_measureOEM(void)
tempExhaust = temperature_measureOneSensor_degC(PIN_TEMP_YEL);
tempCharger = temperature_measureOneSensor_degC(PIN_TEMP_BLU);
tempAmbient = temperature_measureOneSensor_degC(PIN_TEMP_WHT);
#elif defined BATTERY_TYPE_47AhFoMoCo
#elif defined BATTERY_TYPE_47Ah
tempIntake = temperature_measureOneSensor_degC(PIN_TEMP_WHT);
tempCharger = temperature_measureOneSensor_degC(PIN_TEMP_BLU);
#endif
@@ -54,10 +54,10 @@ void temperature_measureBattery(void)
batteryTemps[1] = temperature_measureOneSensor_degC(PIN_TEMP_BAY1);
batteryTemps[2] = temperature_measureOneSensor_degC(PIN_TEMP_BAY2);
batteryTemps[3] = temperature_measureOneSensor_degC(PIN_TEMP_BAY3);
#ifdef BATTERY_TYPE_47AhFoMoCo
batteryTemps[4] = temperature_measureOneSensor_degC(PIN_TEMP_GRN); //Top rear battery module
batteryTemps[5] = temperature_measureOneSensor_degC(PIN_TEMP_YEL); //Top middle battery module
#endif
#ifdef BATTERY_TYPE_47Ah
batteryTemps[4] = temperature_measureOneSensor_degC(PIN_TEMP_GRN); //Top rear battery module
batteryTemps[5] = temperature_measureOneSensor_degC(PIN_TEMP_YEL); //Top middle battery module
#endif
//stores hottest and coldest temp sensor value
@@ -69,29 +69,21 @@ void temperature_measureBattery(void)
if ((batteryTemps[ii] == TEMPERATURE_SENSOR_FAULT_HI) ||
(batteryTemps[ii] == TEMPERATURE_SENSOR_FAULT_LO) )
{
#ifdef BATTERY_TYPE_5AhG3
Serial.print(F("\nCheck Batt Temp Sensor! Bay: "));
Serial.print(String(ii,DEC));
#elif defined BATTERY_TYPE_47AhFoMoCo
Serial.print(F("\nCheck Batt Temp Sensor!"));
switch (ii) {
case 1:
Serial.print(F(" Middle tray rail, driver side")); //BAY1
break;
case 2:
Serial.print(F(" Bottom tray, middle")); //BAY2
break;
case 3:
Serial.print(F(" Middle tray rail, passenger side")); //BAY3
break;
case 4:
Serial.print(F(" Top rear battery module"));
break;
case 5:
Serial.print(F(" Top middle battery module"));
break;
}
#endif
Serial.print(F("\nCheck Batt Temp Sensor: "));
#ifdef BATTERY_TYPE_5AhG3
Serial.print(F("Bay "));
Serial.print(String(ii,DEC));
#elif defined BATTERY_TYPE_47Ah
switch (ii)
{
case 1: Serial.print(F(" Middle tray, driver" )); break; //5AhG3 BAY1
case 2: Serial.print(F(" Bottom tray, center" )); break; //5AhG3 BAY2
case 3: Serial.print(F(" Middle tray, passenger")); break; //5AhG3 BAY3
case 4: Serial.print(F(" Top rear battery" )); break;
case 5: Serial.print(F(" Top middle battery" )); break;
}
#endif
}
else
{
@@ -126,19 +118,18 @@ void temperature_printAll_latest(void)
Serial.print(temperature_gridCharger_getLatest());
Serial.print(F("\nIn: "));
Serial.print(temperature_intake_getLatest());
#ifndef BATTERY_TYPE_47AhFoMoCo
Serial.print(F("\nAmb: "));
Serial.print(temperature_ambient_getLatest());
Serial.print(F("\nOut: "));
Serial.print(temperature_exhaust_getLatest());
#endif
#ifndef BATTERY_TYPE_47Ah
Serial.print(F("\nAmb: "));
Serial.print(temperature_ambient_getLatest());
Serial.print(F("\nOut: "));
Serial.print(temperature_exhaust_getLatest());
#endif
Serial.print(F("\nBatt: "));
Serial.print(temperature_battery_getLatest());
}
/////////////////////////////////////////////////////////////////////////////////////////
//JTS2doNext: add separate case for FoMoCo
void temperature_measureAndPrintAll(void)
{
if (gpio_getPinState(PIN_TEMP_EN) == PIN_OUTPUT_HIGH)
@@ -146,33 +137,34 @@ void temperature_measureAndPrintAll(void)
Serial.print(F("\nTemperatures(C):"));
Serial.print(F("\nBLU (Charger): "));
Serial.print(temperature_measureOneSensor_degC(PIN_TEMP_BLU));
#ifdef BATTERY_TYPE_5AhG3
Serial.print(F("\nGRN (Intake): "));
Serial.print(temperature_measureOneSensor_degC(PIN_TEMP_GRN));
Serial.print(F("\nWHT (Ambient): "));
Serial.print(temperature_measureOneSensor_degC(PIN_TEMP_WHT));
Serial.print(F("\nYEL (Exhaust): "));
Serial.print(temperature_measureOneSensor_degC(PIN_TEMP_YEL));
Serial.print(F("\nBAY1: "));
Serial.print(temperature_measureOneSensor_degC(PIN_TEMP_BAY1));
Serial.print(F("\nBAY2: "));
Serial.print(temperature_measureOneSensor_degC(PIN_TEMP_BAY2));
Serial.print(F("\nBAY3: "));
Serial.print(temperature_measureOneSensor_degC(PIN_TEMP_BAY3));
#elif defined BATTERY_TYPE_47AhFoMoCo
Serial.print(F("\nGRN (Top rear battery module): "));
Serial.print(temperature_measureOneSensor_degC(PIN_TEMP_GRN));
Serial.print(F("\nWHT (Intake): "));
Serial.print(temperature_measureOneSensor_degC(PIN_TEMP_WHT));
Serial.print(F("\nYEL (Top middle battery module): "));
Serial.print(temperature_measureOneSensor_degC(PIN_TEMP_YEL));
Serial.print(F("\nMiddle tray rail, driver side: ")); //BAY1
Serial.print(temperature_measureOneSensor_degC(PIN_TEMP_BAY1));
Serial.print(F("\nBottom tray, middle: ")); //BAY2
Serial.print(temperature_measureOneSensor_degC(PIN_TEMP_BAY2));
Serial.print(F("\nMiddle tray rail, passenger side: ")); //BAY3
Serial.print(temperature_measureOneSensor_degC(PIN_TEMP_BAY3));
#endif
#ifdef BATTERY_TYPE_5AhG3
Serial.print(F("\nGRN (intake): "));
Serial.print(temperature_measureOneSensor_degC(PIN_TEMP_GRN));
Serial.print(F("\nWHT (ambient): "));
Serial.print(temperature_measureOneSensor_degC(PIN_TEMP_WHT));
Serial.print(F("\nYEL (exhaust): "));
Serial.print(temperature_measureOneSensor_degC(PIN_TEMP_YEL));
Serial.print(F("\nBAY1: "));
Serial.print(temperature_measureOneSensor_degC(PIN_TEMP_BAY1));
Serial.print(F("\nBAY2: "));
Serial.print(temperature_measureOneSensor_degC(PIN_TEMP_BAY2));
Serial.print(F("\nBAY3: "));
Serial.print(temperature_measureOneSensor_degC(PIN_TEMP_BAY3));
#elif defined BATTERY_TYPE_47Ah
Serial.print(F("\nGRN (top rear battery): "));
Serial.print(temperature_measureOneSensor_degC(PIN_TEMP_GRN));
Serial.print(F("\nWHT (air intake): "));
Serial.print(temperature_measureOneSensor_degC(PIN_TEMP_WHT));
Serial.print(F("\nYEL (top middle battery): "));
Serial.print(temperature_measureOneSensor_degC(PIN_TEMP_YEL));
Serial.print(F("\nMiddle tray, driver: ")); //BAY1
Serial.print(temperature_measureOneSensor_degC(PIN_TEMP_BAY1));
Serial.print(F("\nBottom tray, middle: ")); //BAY2
Serial.print(temperature_measureOneSensor_degC(PIN_TEMP_BAY2));
Serial.print(F("\nMiddle tray, passenger: ")); //BAY3
Serial.print(temperature_measureOneSensor_degC(PIN_TEMP_BAY3));
#endif
}
else
{

View File

@@ -7,7 +7,7 @@
int8_t temperature_battery_getLatest(void);
int8_t temperature_intake_getLatest(void);
int8_t temperature_gridCharger_getLatest(void);
#ifndef BATTERY_TYPE_47AhFoMoCo
#ifndef BATTERY_TYPE_47Ah
int8_t temperature_exhaust_getLatest(void);
int8_t temperature_ambient_getLatest(void); //IMA bay temperature
#endif
@@ -38,7 +38,7 @@
#ifdef BATTERY_TYPE_5AhG3
#define NUM_BATTERY_TEMP_SENSORS 3
#elif defined BATTERY_TYPE_47AhFoMoCo
#elif defined BATTERY_TYPE_47Ah
// what were 2 OEM temp sensors (PIN_TEMP_GRN, PIN_TEMP_YEL) are now on battery modules
#define NUM_BATTERY_TEMP_SENSORS 5
#endif