Yesterday and today came down to -15°C here in the morning!!!
I decided to write something because it seems i was succesfull with battery heater implementation... sort of.
To explain again. I use 4 battery boxes with 24S cells in each with ZEVA 24S BMS modules for surveilance and control.
ZEVA EVMS3 is integrating CAN communication and input/output signalling.
Inside each box i use 400W silicon heater pad wired for 230Vac. Those pads can heat up to 120°C so they need some sort of power control. I provide this with one 12V relay which is controlled by the EVMS3 master. In case of over or under temperature BMS will signal error state and relay will be actuated.
As i use 2 chargers for 2 phases that leaves 3rd phase reserved for heaters. All together power here ammounts to 1600W or 8A (true power about 1800W).
Some posts above i described my intention how to integrate automating battery heating process. In the end i settled for manually selecting to inhibit charging with cell heating. Due to temps going down really fast i decided implementation takes precedense from design.
I decided for manual decision to inhibit charging if cell modules would be frozen so i could first thaw them out and then charge cells at more comfortable temperatures...
I used sport switch which in my code works already to inhibit "regen" function so i would not have much regen blocking my wheels on slippery road. As the switch really doesnt have function in charging mode i added this functionality to it.
i implement Teensy VCU code change to use the same interface for simplicity. Here goes....
// i use definitions
Code: Select all
uint8_t map3; // Sport switch is pressed
uint8_t chargercurrent = 0; // current limiting variable
uint8_t chargecurrent = 0; // variable to calculate current from charger EVSE report
// in void loop() i set conditional to sense when i press the switch and when charger is at the limit. It works also as HV voltage limiting
Code: Select all
if ((map3 == 0) || (chargerHVbattryVolts > chargerstop) ) // if charger is at voltage limit in charge mode or is 'switch limited'
{
chargercurrent = 0x00; // There is no current because it is either at the stop or disabled because of cell heating
}
else if ((chargerHVbattryVolts > (chargerstop - 2)) && (chargerHVbattryVolts <= (chargerstop))) // if charger is at 370V
{
chargercurrent = 0x1E; // limit to 3A DC amps
}
else {
chargercurrent = chargecurrent; // calculate pwm report[%] * 10 / by 3 to get DC amps }
// Inside charger function
Code: Select all
void EvseStart()
{
chargerstopLoByte = lowByte(chargerstop*10);
chargerstopHibyte = highByte(chargerstop*10);
if (timer500_2.check() == 1)
{
msg.id = 0x286; // Outlander charger
msg.len = 8;
msg.buf[0] = 0x10; //voltage 360V
msg.buf[1] = 0x0E;
msg.buf[2] = chargercurrent; // Current byte 0x78 = 120; 12A
msg.buf[3] = 0x37;
msg.buf[4] = 0x00;
msg.buf[5] = 0x00;
msg.buf[6] = 0x0A;
msg.buf[7] = 0x00;
Can2.write(msg)
}
if (timer100_4.check() == 1)
{
msg.id = 0x2FF; // Eltek charger
msg.len = 8;
msg.buf[0] = 0x01;
msg.buf[1] = 0xE8;
msg.buf[2] = 0x03;
msg.buf[3] = chargerstopLoByte; // Voltage byte h
msg.buf[4] = chargerstopHibyte; // Voltage byte l
msg.buf[5] = chargercurrent; // Current byte 0x78 = 120; 12A
msg.buf[6] = 0x00;
msg.buf[7] = 0x00;
Can2.write(msg);
}}
// i define charge current from Outlander charger EVSE report
Code: Select all
void canRX_38A(const CAN_message_t &msg) {
PWM_signal = msg.buf[3]; // pwm report
if (PWM_signal >= 26) {
PWM_sig = 26; }
else if (PWM_signal < 10) {
PWM_sig = 10; }
else {
PWM_sig = PWM_signal; }
chargecurrent = PWM_sig*10/2.7; // pwm report[%] * 10 / by 3 to get DC amps
}
This then allows me to toggle sport switch and charger will go to 0A while allow for the battey to heatup to 10°C without charging. After some time i simply toggle switch back and car will start putting amps in battery while keeping the battery at 10°C. Works for limited time while this frost lasts. I expect to make this automated using ZEVA CAN reports.