194 lines
7.8 KiB
C
194 lines
7.8 KiB
C
/*
|
|
Copyright 2017 - 2018 Danny Bokma danny@diebie.nl
|
|
Copyright 2019 - 2020 Kevin Dionne kevin.dionne@ennoid.me
|
|
|
|
This file is part of the DieBieMS/ENNOID-BMS firmware.
|
|
|
|
The DieBieMS/ENNOID-BMS firmware is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
The DieBieMS/ENNOID-BMS firmware is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#ifndef __MODPOWERELECTRONICS_H
|
|
#define __MODPOWERELECTRONICS_H
|
|
|
|
//#include "driverSWISL28022.h"
|
|
//#include "driverHWADC.h"
|
|
#include "driverSWLTC6804.h"
|
|
//#include "driverSWADC128D818.h"
|
|
//#include "driverHWSwitches.h"
|
|
//#include "driverSWEMC2305.h"
|
|
#include "modDelay.h"
|
|
#include "modConfig.h"
|
|
#//include "modPowerState.h"
|
|
#include "stdbool.h"
|
|
#include "math.h"
|
|
//#include "driverSWSHT21.h"
|
|
//#include "driverSWHTC1080.h"
|
|
|
|
|
|
#define NoOfCellsPossibleOnBMS 180
|
|
#define NoOfCellMonitorsPossibleOnBMS 19
|
|
|
|
#define NoOfAuxPossibleOnBMS 120
|
|
|
|
#define NoOfExpPossibleOnBMS 72
|
|
#define NoOfExpMonitorPossibleOnBMS 9
|
|
|
|
#define NoOfTempSensors 16
|
|
#define VinErrorThreshold 10
|
|
|
|
typedef enum {
|
|
TEMP_EXT_LTC_NTC0 = 0, // EXT on master BMS on LTC
|
|
TEMP_EXT_LTC_NTC1, // EXT on master BMS on LTC
|
|
TEMP_INT_LTC_CHIP, // Int on master BMS inside LTC Chip
|
|
TEMP_INT_STM_NTC, // Int on master BMS outside STM Chip
|
|
TEMP_EXT_ADC_NTC0, // Ext on slave BMS OR water detect
|
|
TEMP_EXT_ADC_NTC1, // Ext on slave BMS OR water detect
|
|
TEMP_EXT_ADC_NTC2, // Ext on slave BMS OR water detect
|
|
TEMP_EXT_ADC_NTC3, // Ext on slave BMS OR water detect
|
|
TEMP_EXT_ADC_NTC4, // Ext on slave BMS OR water detect
|
|
TEMP_EXT_ADC_NTC5, // Ext on slave BMS OR water detect
|
|
TEMP_INT_ADC_NTC6, // Int on slave BMS
|
|
TEMP_INT_ADC_NTC7, // Int on slave BMS
|
|
TEMP_INT_SHT, // Int on slave BMS
|
|
TEMP_INT_ADC_NTCAUX // Ext on the CAN connector
|
|
} modPowerElectronicsTemperatureSensorMapping;
|
|
|
|
typedef enum {
|
|
PACK_STATE_ERROR_HARD_CELLVOLTAGE = 0,
|
|
PACK_STATE_ERROR_SOFT_CELLVOLTAGE,
|
|
PACK_STATE_ERROR_OVER_CURRENT,
|
|
PACK_STATE_NORMAL,
|
|
PACK_STATE_ERROR_TEMPERATURE,
|
|
} modPowerElectronicsPackOperationalCellStatesTypedef;
|
|
|
|
typedef struct {
|
|
// Master BMS
|
|
|
|
uint64_t serial_number;
|
|
|
|
uint16_t throttleDutyGeneralTemperatureBMS;
|
|
uint16_t throttleDutyChargeVoltage;
|
|
uint16_t throttleDutyChargeTemperatureBattery;
|
|
uint16_t throttleDutyCharge;
|
|
uint16_t throttleDutyDischargeVoltage;
|
|
uint16_t throttleDutyDischargeTemperatureBattery;
|
|
uint16_t throttleDutyDischarge;
|
|
float SoC;
|
|
float SoCCapacityAh;
|
|
OperationalStateTypedef operationalState;
|
|
bms_fault_state faultState;
|
|
float packVoltage;
|
|
float packCurrent;
|
|
float packPower;
|
|
float loCurrentLoadCurrent;
|
|
float loCurrentLoadVoltage;
|
|
float chargerVoltage;
|
|
float cellVoltageHigh;
|
|
float cellVoltageLow;
|
|
float cellVoltageAverage;
|
|
float cellVoltageMisMatch;
|
|
uint16_t cellBalanceResistorEnableMask;
|
|
float temperatures[NoOfTempSensors];
|
|
float tempBatteryHigh;
|
|
float tempBatteryLow;
|
|
float tempBatteryAverage;
|
|
float tempBMSHigh;
|
|
float tempBMSLow;
|
|
float tempBMSAverage;
|
|
float humidity;
|
|
uint8_t preChargeDesired;
|
|
uint8_t disChargeDesired;
|
|
uint8_t disChargeLCAllowed;
|
|
bool disChargeOverMaxTemperature;
|
|
bool disChargeOverMinTemperature;
|
|
uint8_t chargeDesired;
|
|
uint8_t chargePFETDesired;
|
|
uint8_t chargeAllowed;
|
|
bool chargeOverMaxTemperature;
|
|
bool chargeOverMinTemperature;
|
|
uint8_t coolingDesired;
|
|
uint8_t coolingAllowed;
|
|
uint8_t safetyOverCANHCSafeNSafe;
|
|
uint8_t chargeCurrentDetected;
|
|
uint8_t chargeBalanceActive;
|
|
uint8_t balanceActive;
|
|
uint8_t powerButtonActuated;
|
|
uint8_t packInSOADischarge;
|
|
uint8_t packInSOACharge;
|
|
uint8_t powerDownDesired;
|
|
uint8_t powerOnLongButtonPress;
|
|
uint8_t buzzerOn;
|
|
uint8_t watchDogTime;
|
|
cellMonitorCellsTypeDef cellVoltagesIndividual[NoOfCellsPossibleOnBMS];
|
|
auxMonitorTypeDef auxVoltagesIndividual[NoOfAuxPossibleOnBMS];
|
|
expMonitorTypeDef expVoltagesIndividual[NoOfExpPossibleOnBMS];
|
|
|
|
modPowerElectronicsPackOperationalCellStatesTypedef packOperationalCellState;
|
|
|
|
// Slave modules -> TODO move into struct.
|
|
float cellModuleVoltages[NoOfCellMonitorsPossibleOnBMS][18];
|
|
float auxModuleVoltages[NoOfCellMonitorsPossibleOnBMS][12];
|
|
float expModuleVoltages[NoOfExpMonitorPossibleOnBMS][8];
|
|
uint32_t cellModuleBalanceResistorEnableMask[NoOfCellMonitorsPossibleOnBMS];
|
|
uint32_t dieTemperature[NoOfCellMonitorsPossibleOnBMS];
|
|
|
|
} modPowerElectronicsPackStateTypedef;
|
|
|
|
void modPowerElectronicsInit(modPowerElectronicsPackStateTypedef *packState, modConfigGeneralConfigStructTypedef *generalConfig);
|
|
bool modPowerElectronicsTask(void);
|
|
void modPowerElectronicsAllowForcedOn(bool allowedState);
|
|
void modPowerElectronicsSetPreCharge(bool newState);
|
|
bool modPowerElectronicsSetDisCharge(bool newState);
|
|
void modPowerElectronicsSetCharge(bool newState);
|
|
void modPowerElectronicsSetChargePFET(bool newState);
|
|
void modPowerElectronicsSetCooling(bool newState);
|
|
void modPowerElectronicsDisableAll(void);
|
|
void modPowerElectronicsCalculateCellStats(void);
|
|
void modPowerElectronicsSubTaskBalancing(void);
|
|
void modPowerElectronicsCallMonitorsCalcBalanceResistorArray(void);
|
|
void modPowerElectronicsSubTaskVoltageWatch(void);
|
|
void modPowerElectronicsSubTaskCurrentWatch(void);
|
|
void modPowerElectronicsUpdateSwitches(void);
|
|
void modPowerElectronicsSortCells(cellMonitorCellsTypeDef *cells, uint8_t cellCount);
|
|
void modPowerElectronicsCalcTempStats(void);
|
|
void modPowerElectronicsCalcThrottle(void);
|
|
int32_t modPowerElectronicsMapVariableInt(int32_t inputVariable, int32_t inputLowerLimit, int32_t inputUpperLimit, int32_t outputLowerLimit, int32_t outputUpperLimit);
|
|
float modPowerElectronicsMapVariableFloat(float inputVariable, float inputLowerLimit, float inputUpperLimit, float outputLowerLimit, float outputUpperLimit);
|
|
void modPowerElectronicsInitISL(void);
|
|
void modPowerElectronicsSubTaskBuzzer(void);
|
|
bool modPowerElectronicsHCSafetyCANAndPowerButtonCheck(void);
|
|
void modPowerElectronicsResetBalanceModeActiveTimeout(void);
|
|
void modPowerElectronicsCellMonitorsInit(void);
|
|
void modPowerElectronicsCellMonitorsCheckConfigAndReadAnalogData(void);
|
|
void modPowerElectronicsCellMonitorsStartCellConversion(void);
|
|
void modPowerElectronicsCellMonitorsStartLoadedCellConversion(bool PUP);
|
|
void modPowerElectronicsCellMonitorsStartTemperatureConversion(void);
|
|
void modPowerElectronicsCellMonitorsEnableBalanceResistors(uint32_t);
|
|
void modPowerElectronicsCellMonitorsEnableBalanceResistorsArray(void);
|
|
void modPowerElectronicsCellMonitorsReadVoltageFlags(uint32_t *underVoltageFlags, uint32_t *overVoltageFlags);
|
|
void modPowerElectronicsCellMonitorsCheckAndSolveInitState(void);
|
|
void modPowerElectronicsCellMonitorsArrayTranslate(void);
|
|
void modPowerElectronicsAuxMonitorsArrayTranslate(void);
|
|
void modPowerElectronicsExpMonitorsArrayTranslate(void);
|
|
float modPowerElectronicsCalcPackCurrent(void);
|
|
void modPowerElectronicsTerminalCellConnectionTest(int argc, const char **argv);
|
|
void modPowerElectronicsCheckPackSOA(void);
|
|
void modPowerElectronicsSamplePackAndLCData(void);
|
|
void modPowerElectronicsSamplePackVoltage(float *voltagePointer);
|
|
void modPowerElectronicsLCSenseSample(void);
|
|
void modPowerElectronicsLCSenseInit(void);
|
|
uint16_t modPowerElectronicsLowestInThree(uint16_t num1,uint16_t num2,uint16_t num3);
|
|
|
|
#endif
|