Skip to content

Commit 72168e0

Browse files
committed
charger code cleanup and robustness
1 parent f0c4d78 commit 72168e0

File tree

2 files changed

+39
-19
lines changed

2 files changed

+39
-19
lines changed

Charger/config.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,9 @@
3434
#define VOLTAGE_TARGET_MV 120000
3535
#endif
3636

37-
#ifndef CURRENT_MAX_MA
38-
#define CURRENT_MAX_MA 52000 // 52 amps is 1C for now, battery can support up to 120 amps according to datasheet
37+
// in centiamps (0.01 amps)
38+
#ifndef CURRENT_MAX_CA
39+
#define CURRENT_MAX_CA 5200 // 52 amps is 1C for now, battery can support up to 120 amps according to datasheet, note that due to charger errors
3940
#endif
4041

4142

Charger/main.cpp

Lines changed: 36 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,20 @@ void sendCAN();
1010
CAN* can;
1111

1212
uint32_t max_voltage_mV = 0;
13-
uint16_t max_dc_current_mA = 0;
13+
uint16_t max_dc_current_cA = 0; // in centiamps (0.01 amps)
1414
uint8_t max_ac_current_A = 0;
1515

16+
uint16_t pack_voltage = 0;
17+
uint16_t soc = 0;
18+
1619
bool enable = false;
1720

1821

1922
AnalogIn control_pilot(PIN_CONTROL_PILOT);
2023
AnalogIn proximity_pilot(PIN_PROXIMITY_PILOT);
2124

25+
EventQueue queue = EventQueue(EVENTS_EVENT_SIZE * 32);
26+
2227

2328
int main()
2429
{
@@ -41,15 +46,18 @@ int main()
4146

4247
while (can->read(msg)) {
4348
switch (msg.id) {
44-
case 0x80: // sync
45-
sendCAN();
46-
break;
47-
case 0x188: // ACC_TPDO_STATUS
48-
prechargeDone = msg.data[0] & 0b00001000;
49-
fault = msg.data[0] & 0b00000011;
50-
shutdown_closed = msg.data[0] & 0b00000100;
51-
cell_temps_fine = !(msg.data[1] & 0b00010000);
52-
break;
49+
case 0x188: // ACC_TPDO_STATUS
50+
prechargeDone = msg.data[0] & 0b00001000;
51+
fault = msg.data[0] & 0b00000011;
52+
shutdown_closed = msg.data[0] & 0b00000100;
53+
cell_temps_fine = !(msg.data[1] & 0b00010000);
54+
break;
55+
case 0x288: // ACC_TPDO_POWER
56+
pack_voltage = msg.data[0] + (msg.data[1] << 8);
57+
soc = msg.data[2];
58+
break;
59+
default:
60+
break;
5361
}
5462
}
5563

@@ -77,11 +85,18 @@ int main()
7785

7886

7987
max_voltage_mV = VOLTAGE_TARGET_MV;
80-
max_dc_current_mA = CURRENT_MAX_MA;
8188

82-
printf("pp_ready: %x, precharge done: %x, fault: %x, sh closed: %x, cell temps fine: %x\n", proximity_pilot_ready, prechargeDone, fault, shutdown_closed, cell_temps_fine);
89+
// printf("pp_ready: %x, precharge done: %x, fault: %x, sh closed: %x, cell temps fine: %x\n", proximity_pilot_ready, prechargeDone, fault, shutdown_closed, cell_temps_fine);
8390
enable = proximity_pilot_ready && prechargeDone && !fault && shutdown_closed && cell_temps_fine;
84-
printf("enable: %x\n", enable);
91+
printf("Enable: %x\nVoltage: %f\nSOC: %d\n\n", enable, pack_voltage / 100.0, soc);
92+
93+
if (enable) {
94+
max_dc_current_cA = CURRENT_MAX_CA;
95+
} else {
96+
max_dc_current_cA = 0;
97+
}
98+
99+
queue.dispatch_once();
85100
}
86101

87102
// main() is expected to loop forever.
@@ -92,24 +107,28 @@ int main()
92107
void initIO() {
93108
printf("initIO()\n");
94109
can = new CAN(PIN_CAN1_RD, PIN_CAN1_TD, CAN_FREQUENCY);
110+
can->filter(0x088, 0x00FF, CANAny); // accept any TPDOs from ACC (0x188, 0x288)
95111

96112
// LSS assign charger
97113
initChargerCAN();
114+
115+
this_thread::sleep_for(100ms);
116+
queue.call_every(100ms, &sendCAN);
98117
}
99118

100119
void initChargerCAN() {
101120
printf("initChargerCAN()\n");
102121

103122
ThisThread::sleep_for(2500ms);
104123

105-
// Switch state global protocal, switch to LSS configuration state
124+
// Switch state global protocol, switch to LSS configuration state
106125
uint8_t lss0_data[8] = {0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
107126
CANMessage lss0_msg(0x7E5, lss0_data);
108127
can->write(lss0_msg);
109128

110129
ThisThread::sleep_for(500ms);
111130

112-
// Configurate node ID protocal, set node ID to 0x10
131+
// Configurate node ID protocol, set node ID to 0x10
113132
uint8_t lss1_data[8] = {0x11, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
114133
CANMessage lss1_msg(0x7E5, lss1_data);
115134
can->write(lss1_msg);
@@ -127,8 +146,8 @@ void sendCAN() {
127146
static_cast<uint8_t>(max_voltage_mV >> 8),
128147
static_cast<uint8_t>(max_voltage_mV >> 16),
129148
static_cast<uint8_t>(max_voltage_mV >> 24),
130-
static_cast<uint8_t>(max_dc_current_mA),
131-
static_cast<uint8_t>(max_dc_current_mA >> 8),
149+
static_cast<uint8_t>(max_dc_current_cA),
150+
static_cast<uint8_t>(max_dc_current_cA >> 8),
132151
max_ac_current_A
133152
};
134153
CANMessage charge_limits_msg(0x306, charge_limits_data);

0 commit comments

Comments
 (0)