Skip to content

Commit d277335

Browse files
committed
More CAN changes; temp not working over CAN
1 parent 94de02b commit d277335

File tree

8 files changed

+538
-68
lines changed

8 files changed

+538
-68
lines changed

bms/.mbed

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
ROOT=.
22
TARGET=NUCLEO_L432KC
33
TARGET_CODE=0770
4+
TARGET_SERIAL=0671FF555185754867150637

bms/src/BmsConfig.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,10 @@ extern DigitalOut* chargerControl;
9191
#ifndef CAR_POWER_PERCENT
9292
#define CAR_POWER_PERCENT 0.95
9393
#endif
94+
// maximum allowed current draw by the motor controller
95+
#ifndef CAR_CURRENT_MAX
96+
#define CAR_CURRENT_MAX 700
97+
#endif
9498

9599
// percent of precharge needed to consider precharging done (and close the +AIR)
96100
#ifndef PRECHARGE_PERCENT

bms/src/Can.cpp

Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#include "Can.h"
22
#include <cstdint>
3+
#include <cstdio>
34

45
CANMessage accBoardBootup() {
56
uint8_t startupMessage[8];
@@ -20,23 +21,51 @@ CANMessage accBoardState(uint8_t glvVoltage, uint16_t tsVoltage, bool bmsFault,
2021
}
2122

2223
CANMessage accBoardTemp(uint8_t segment, int8_t *temps) {
23-
uint8_t data[8];
24-
data[0] = segment;
24+
uint8_t data[7];
25+
uint32_t id;
26+
switch (segment) {
27+
case 0:
28+
id = kTPDO_ACC_BOARD_Temp_0;
29+
break;
30+
case 1:
31+
id = kTPDO_ACC_BOARD_Temp_1;
32+
break;
33+
case 2:
34+
id = kTPDO_ACC_BOARD_Temp_2;
35+
break;
36+
case 3:
37+
id = kTPDO_ACC_BOARD_Temp_3;
38+
break;
39+
}
2540
for (int i = 0; i < 7; i++) {
26-
data[i+1] = (uint8_t)(temps[i]+40);
41+
data[i] = (uint8_t)(temps[i]);
2742
}
2843

29-
return CANMessage(kTPDO_ACC_BOARD_Temp, data);
44+
return CANMessage(id, data);
3045
}
3146

3247
CANMessage accBoardVolt(uint8_t segment, uint16_t *volts) {
33-
uint8_t data[8];
34-
data[0] = segment;
48+
uint8_t data[7];
49+
uint32_t id;
50+
switch (segment) {
51+
case 0:
52+
id = kTPDO_ACC_BOARD_Volt_0;
53+
break;
54+
case 1:
55+
id = kTPDO_ACC_BOARD_Volt_1;
56+
break;
57+
case 2:
58+
id = kTPDO_ACC_BOARD_Volt_2;
59+
break;
60+
case 3:
61+
id = kTPDO_ACC_BOARD_Volt_3;
62+
break;
63+
}
3564
for (int i = 0; i < 7; i++) {
36-
data[i+1] = (uint8_t) (50.0*volts[i]/1000.0);
65+
data[i] = (uint8_t) (50.0*volts[i]/1000.0);
3766
}
3867

39-
return CANMessage(kTPDO_ACC_BOARD_Volt, data);
68+
return CANMessage(id, data);
4069
}
4170

4271
CANMessage motorControllerCurrentLim(uint16_t chargeCurLim, uint16_t dischargeCurLim) {

bms/src/Can.h

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,29 @@
1010

1111
// SIDs From Accumulator
1212
constexpr uint32_t kTPDO_ACC_BOARD_State = 0x182;
13-
constexpr uint32_t kTPDO_ACC_BOARD_Temp = 0x282;
14-
constexpr uint32_t kTPDO_ACC_BOARD_Volt = 0x382;
13+
14+
constexpr uint32_t kTPDO_ACC_BOARD_Temp_0 = 0x189;
15+
constexpr uint32_t kTPDO_ACC_BOARD_Temp_1 = 0x289;
16+
constexpr uint32_t kTPDO_ACC_BOARD_Temp_2 = 0x389;
17+
constexpr uint32_t kTPDO_ACC_BOARD_Temp_3 = 0x489;
18+
19+
constexpr uint32_t kTPDO_ACC_BOARD_Volt_0 = 0x188;
20+
constexpr uint32_t kTPDO_ACC_BOARD_Volt_1 = 0x288;
21+
constexpr uint32_t kTPDO_ACC_BOARD_Volt_2 = 0x388;
22+
constexpr uint32_t kTPDO_ACC_BOARD_Volt_3 = 0x488;
23+
1524
constexpr uint32_t kNMT_ACC_HEARTBEAT = 0x702;
1625
constexpr uint32_t kRPDO_MAX_CURRENTS = 0x286;
1726

1827
/* Bootup message */
1928
CANMessage accBoardBootup();
2029

2130
/* TPDO that sends various states and information about the accumulator */
22-
CANMessage accBoardState(uint8_t glvVoltage, uint16_t tsVoltage, bool bmsFault, bool bmsBalancing, bool prechargeDone, bool charging, bool fansOn, bool shutdownClosed, bool unused_A, bool unused_B, uint8_t minCellVoltage, uint8_t maxCellVoltage, int16_t tsCurrent);
31+
CANMessage accBoardState(uint8_t glvVoltage, uint16_t tsVoltage, bool bmsFault,
32+
bool bmsBalancing, bool prechargeDone, bool charging,
33+
bool fansOn, bool shutdownClosed, bool unused_A,
34+
bool unused_B, uint8_t minCellVoltage,
35+
uint8_t maxCellVoltage, int16_t tsCurrent);
2336

2437
/* TPDO that sends all temperatures for one segment */
2538
CANMessage accBoardTemp(uint8_t segment, int8_t *temps);
@@ -28,6 +41,7 @@ CANMessage accBoardTemp(uint8_t segment, int8_t *temps);
2841
CANMessage accBoardVolt(uint8_t segment, uint16_t *voltages);
2942

3043
/* RPDO for limiting the current to the Motor Controller (AC-X1) */
31-
CANMessage motorControllerCurrentLim(uint16_t chargeCurLim, uint16_t dischargeCurLim);
44+
CANMessage motorControllerCurrentLim(uint16_t chargeCurLim,
45+
uint16_t dischargeCurLim);
3246

3347
#endif // _FS_BMS_SRC_CAN_H_

bms/src/Main.cpp

Lines changed: 32 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
#include <algorithm>
12
#include <array>
23
#include <cstdint>
34
#include <cstdio>
@@ -35,7 +36,7 @@ void canCurrentLimTX();
3536

3637

3738

38-
EventQueue queue(4*EVENTS_EVENT_SIZE); // creates an eventqueue which is thread and ISR safe. EVENTS_EVENT_SIZE is the size of the buffer allocated
39+
EventQueue queue(32*EVENTS_EVENT_SIZE); // creates an eventqueue which is thread and ISR safe. EVENTS_EVENT_SIZE is the size of the buffer allocated
3940

4041

4142

@@ -66,7 +67,8 @@ bool hasFansOn = false;
6667
bool isBalancing = false;
6768

6869
uint16_t dcBusVoltage;
69-
uint16_t tsVoltage;
70+
uint32_t tsVoltagemV;
71+
//uint16_t tsVoltage;
7072
uint8_t glvVoltage;
7173
uint16_t tsCurrent;
7274

@@ -103,8 +105,8 @@ int main() {
103105
Timer t;
104106
t.start();
105107
while (1) {
106-
glvVoltage = glv_voltage_pin * 18530; // in mV
107-
//printf("GLV voltage: %d mV\n", glv_voltage);
108+
glvVoltage = (uint8_t)(glv_voltage_pin * 185.3); // in mV
109+
//printf("GLV voltage: %d mV\n", glvVoltage * 100);
108110

109111
while (!bmsMailbox->empty()) {
110112
BmsEvent *bmsEvent;
@@ -126,16 +128,16 @@ int main() {
126128
maxCellVolt = bmsEvent->maxVolt;
127129
isBalancing = bmsEvent->isBalancing;
128130

129-
tsVoltage = 0;
131+
tsVoltagemV = 0;
130132

131133
for (int i = 0; i < BMS_BANK_COUNT*BMS_BANK_CELL_COUNT; i++) {
132134
allVoltages[i] = bmsEvent->voltageValues[i];
133-
tsVoltage += allVoltages[i];
135+
tsVoltagemV += allVoltages[i];
134136
//printf("%d, V: %d\n", i, allVoltages[i]);
135137
}
136138
for (int i = 0; i < BMS_BANK_COUNT*BMS_BANK_TEMP_COUNT; i++) {
137139
allTemps[i] = bmsEvent->temperatureValues[i];
138-
//printf("%d, V: %d\n", i, allTemps[i]);
140+
// printf("%d, T: %d\n", i, allTemps[i]);
139141
}
140142

141143
break;
@@ -173,7 +175,7 @@ int main() {
173175
}
174176

175177

176-
if (dcBusVoltage >= tsVoltage * PRECHARGE_PERCENT) {
178+
if (dcBusVoltage >= (uint16_t)(tsVoltagemV/100.0) * PRECHARGE_PERCENT) {
177179
prechargeDone = true;
178180
}
179181

@@ -205,21 +207,19 @@ void initIO() {
205207
canBus = new CAN(BMS_PIN_CAN_RX, BMS_PIN_CAN_TX, BMS_CAN_FREQUENCY);
206208
canBus->attach(canRX);
207209

208-
// canBus->write(accBoardBootup());
209-
210-
int canBootupUD = queue.call(&canBootupTX);
210+
queue.call(&canBootupTX);
211211
queue.dispatch_once();
212212

213-
int canBoardStateID = queue.call_every(100ms, &canBoardStateTX);
214-
int canCurrentLimID = queue.call_every(40ms, &canCurrentLimTX);
215-
int canVoltID0 = queue.call_every(200ms, &canVoltTX0);
216-
int canVoltID1 = queue.call_every(200ms, &canVoltTX1);
217-
int canVoltID2 = queue.call_every(200ms, &canVoltTX2);
218-
int canVoltID3 = queue.call_every(200ms, &canVoltTX3);
219-
int canTempID0 = queue.call_every(200ms, &canTempTX0);
220-
int canTempID1 = queue.call_every(200ms, &canTempTX1);
221-
int canTempID2 = queue.call_every(200ms, &canTempTX2);
222-
int canTempID3 = queue.call_every(200ms, &canTempTX3);
213+
queue.call_every(100ms, &canBoardStateTX);
214+
queue.call_every( 40ms, &canCurrentLimTX);
215+
queue.call_every(200ms, &canVoltTX0);
216+
queue.call_every(200ms, &canVoltTX1);
217+
queue.call_every(200ms, &canVoltTX2);
218+
queue.call_every(200ms, &canVoltTX3);
219+
queue.call_every(200ms, &canTempTX0);
220+
queue.call_every(200ms, &canTempTX1);
221+
queue.call_every(200ms, &canTempTX2);
222+
queue.call_every(200ms, &canTempTX3);
223223

224224

225225
fan_control_pin = 0; // turn fans off at start
@@ -244,7 +244,7 @@ void canBootupTX() {
244244
void canBoardStateTX() {
245245
canBus->write(accBoardState(
246246
glvVoltage,
247-
tsVoltage,
247+
(uint16_t)(tsVoltagemV/100.0),
248248
hasBmsFault,
249249
isBalancing,
250250
prechargeDone,
@@ -257,6 +257,7 @@ void canBoardStateTX() {
257257
maxCellVolt,
258258
tsCurrent
259259
));
260+
ThisThread::sleep_for(1ms);
260261
}
261262

262263
void canTempTX(uint8_t segment) {
@@ -270,6 +271,7 @@ void canTempTX(uint8_t segment) {
270271
allTemps[(segment * BMS_BANK_CELL_COUNT) + 6]
271272
};
272273
canBus->write(accBoardTemp(segment, temps));
274+
ThisThread::sleep_for(1ms);
273275
}
274276

275277
void canVoltTX(uint8_t segment) {
@@ -283,6 +285,14 @@ void canVoltTX(uint8_t segment) {
283285
allVoltages[(segment * BMS_BANK_CELL_COUNT) + 6]
284286
};
285287
canBus->write(accBoardVolt(segment, volts));
288+
ThisThread::sleep_for(1ms);
289+
}
290+
291+
void canCurrentLimTX() {
292+
uint16_t chargeCurrentLimit = 0x0000;
293+
uint16_t dischargeCurrentLimit = (uint16_t)(((CAR_MAX_POWER/(tsVoltagemV/1000.0))*CAR_POWER_PERCENT < CAR_CURRENT_MAX) ? (CAR_MAX_POWER/(tsVoltagemV/1000.0)*CAR_POWER_PERCENT) : CAR_CURRENT_MAX);
294+
canBus->write(motorControllerCurrentLim(chargeCurrentLimit, dischargeCurrentLimit));
295+
ThisThread::sleep_for(1ms);
286296
}
287297

288298
void canVoltTX0() {
@@ -316,9 +326,3 @@ void canTempTX2() {
316326
void canTempTX3() {
317327
canTempTX(3);
318328
}
319-
320-
void canCurrentLimTX() {
321-
uint16_t chargeCurrentLimit = 0x0000;
322-
uint16_t dischargeCurrentLimit = (uint16_t)(CAR_MAX_POWER/117.6)*CAR_POWER_PERCENT;
323-
canBus->write(motorControllerCurrentLim(chargeCurrentLimit, dischargeCurrentLimit));
324-
}

0 commit comments

Comments
 (0)