PER Firmware
Loading...
Searching...
No Matches
adbms.h
Go to the documentation of this file.
1
8#ifndef _BMS_H_
9#define _BMS_H_
10
11#include <stdbool.h>
12#include <stddef.h>
13#include <stdint.h>
14
15#include "adbms6380.h"
16#include "common/phal/spi.h"
18
19// Number of ADBMS modules in the daisy chain.
20#define ADBMS_MODULE_COUNT (8)
21
22// Number of attempts to retry a read if a PEC failure is detected before continuing.
23#define ADBMS_PEC_FAIL_MAX_RETRIES (3)
24
25// 10kOhm voltage divider on the thermistor input
26#define ADBMS_GPIO_R1 (10000.0f)
27// VREF2 = 3.0v and is the input to the thermistor voltage divider
28#define ADBMS_GPIO_VIN (3.0f)
29
30// Max SPI TX is a command + all the data packets for all the modules.
31#define ADBMS_SPI_TX_BUFFER_SIZE \
32 (ADBMS6380_COMMAND_PKT_SIZE + (ADBMS_MODULE_COUNT * ADBMS6380_SINGLE_DATA_PKT_SIZE))
33// MAX SPI RX is all the data packets for all the modules.
34#define ADBMS_SPI_RX_BUFFER_SIZE (ADBMS6380_SINGLE_DATA_PKT_SIZE * ADBMS_MODULE_COUNT)
35
36#define ADBMS_REGA_REFON (true)
37#define ADBMS_REGA_CTH (0b110) // 25.05 mV
38#define ADBMS_REGB_OV_THRESHOLD (4.2f) // Volts
39#define ADBMS_REGB_UV_THRESHOLD (3.0f) // Volts
40#define ADBMS_ADCV_RD (false)
41#define ADBMS_ADCV_CONT (true) // Continuous
42#define ADBMS_ADCV_DCP (false)
43#define ADBMS_ADCV_RSTF (true)
44#define ADBMS_ADCV_OW (0b00)
45#define ADBMS_ADAX_OW (false)
46#define ADBMS_ADAX_PUP (false)
47#define ADBMS_ADAX_CH (0b00000)
48
58
62typedef struct {
64 float cell_voltages[ADBMS6380_CELL_COUNT];
66 int16_t cell_voltages_raw[ADBMS6380_CELL_COUNT];
75
77 float therms_voltages[ADBMS6380_GPIO_COUNT];
79 float therms_temps[ADBMS6380_GPIO_COUNT];
80
87
89 bool is_discharging[ADBMS6380_CELL_COUNT];
90
92 uint8_t rega[ADBMS6380_SINGLE_DATA_RAW_SIZE];
94 uint8_t regb[ADBMS6380_SINGLE_DATA_RAW_SIZE];
95
101
105typedef struct {
108
110 adbms_module_t modules[ADBMS_MODULE_COUNT];
111
120
127
130
136 uint8_t rx_buf[ADBMS_SPI_RX_BUFFER_SIZE];
137
146
152 bool err_cell_voltage_pecs[ADBMS6380_RDCV_CMD_COUNT];
154 bool err_gpio_voltage_pecs[ADBMS6380_RDAUX_CMD_COUNT];
156
167void adbms_init(adbms_bms_t *bms, SPI_InitConfig_t *spi, uint8_t *tx_buf);
168
206
214void adbms_connect(adbms_bms_t *bms);
215
235
247void adbms_calculate_balance_cells(adbms_bms_t *bms, float min_voltage, float min_delta);
257void adbms_balance_and_update_regb(adbms_bms_t *bms, float min_voltage, float min_delta);
258
269void adbms_periodic(adbms_bms_t *bms, float min_voltage_for_balance, float min_delta_for_balance);
270
271#endif // _BMS_H_
Low level BMS driver specific to ADBMS6380 chip.
void adbms_periodic(adbms_bms_t *bms, float min_voltage_for_balance, float min_delta_for_balance)
Periodic service routine for connection, measurements, and balancing.
Definition adbms.c:384
void adbms_read_therms(adbms_bms_t *bms)
Read all GPIO/thermistor values (voltage and calculate temperature) and update module/pack statistics...
Definition adbms.c:309
void adbms_connect(adbms_bms_t *bms)
Perform the connect/bring-up sequence for all modules.
Definition adbms.c:165
void adbms_calculate_balance_cells(adbms_bms_t *bms, float min_voltage, float min_delta)
Compute per-cell discharge flags based on pack voltage spread.
Definition adbms.c:211
bool adbms_write_regb(adbms_bms_t *bms)
Calculate and write REGB configuration to all modules.
Definition adbms.c:75
void adbms_init(adbms_bms_t *bms, SPI_InitConfig_t *spi, uint8_t *tx_buf)
Initialize the ADBMS driver instance and TX buffer.
Definition adbms.c:21
bool adbms_read_and_check_rega(adbms_bms_t *bms)
Read back REGA and compare with cached configuration.
Definition adbms.c:97
bool adbms_write_rega(adbms_bms_t *bms)
Calculate and write REGA configuration to all modules.
Definition adbms.c:55
void adbms_read_cells(adbms_bms_t *bms)
Read all cell voltages and update module/pack statistics.
Definition adbms.c:257
void adbms_balance_and_update_regb(adbms_bms_t *bms, float min_voltage, float min_delta)
Compute discharge flags and write REGB to apply balancing.
Definition adbms.c:244
bool adbms_read_and_check_regb(adbms_bms_t *bms)
Read back REGB and compare with cached configuration.
Definition adbms.c:131
adbms_state_t
ADBMS driver connection/operation state.
Definition adbms.h:52
@ ADBMS_STATE_IDLE
Definition adbms.h:54
@ ADBMS_STATE_CONNECTED
Definition adbms.h:56
Fixed-size string builder. Useful for building large CMD strings before transmission.
Configuration entry for SPI initilization.
Definition spi.h:26
Top-level ADBMS driver state, I/O buffers, measurements, and error flags.
Definition adbms.h:105
float min_voltage
Definition adbms.h:113
bool err_regb_mismatch
Definition adbms.h:145
bool err_connect
Definition adbms.h:141
float max_voltage
Definition adbms.h:115
bool err_rega_mismatch
Definition adbms.h:143
float avg_voltage
Definition adbms.h:117
bool err_regb_pec
Definition adbms.h:150
bool err_spi
Definition adbms.h:139
SPI_InitConfig_t * spi
Definition adbms.h:132
float sum_voltage
Definition adbms.h:119
strbuf_t tx_strbuf
Definition adbms.h:134
bool err_rega_pec
Definition adbms.h:148
float avg_therm_temp
Definition adbms.h:126
bool is_discharge_enabled
Definition adbms.h:129
float min_therm_temp
Definition adbms.h:122
float max_therm_temp
Definition adbms.h:124
adbms_state_t state
Definition adbms.h:107
Per-ADBMS module measurements, config, and error flags.
Definition adbms.h:62
bool err_rega_mismatch
Definition adbms.h:97
float max_therm_temp
Definition adbms.h:84
float sum_voltage
Definition adbms.h:74
float min_voltage
Definition adbms.h:68
float avg_voltage
Definition adbms.h:72
float avg_therm_temp
Definition adbms.h:86
float max_voltage
Definition adbms.h:70
bool err_regb_mismatch
Definition adbms.h:99
float min_therm_temp
Definition adbms.h:82
Definition strbuf.h:15