Midnight Sun Firmware
Loading...
Searching...
No Matches
adbms_afe.h
1#pragma once
2
3/************************************************************************************************
4 * @file adbms_afe.h
5 *
6 * @brief Header file for the ADBMS1818 AFE driver
7 *
8 * @date 2025-04-13
9 * @author Midnight Sun Team #24 - MSXVI
10 ************************************************************************************************/
11
21/* Standard library Headers */
22#include <assert.h>
23#include <stdbool.h>
24#include <stdint.h>
25#include <stdlib.h>
26
27/* Inter-component Headers */
28#include "gpio.h"
29#include "spi.h"
30
31/* Intra-component Headers */
32#include "adbms_afe_regs.h"
33#include "status.h"
34
41/* Removes padding, if possible */
42#if defined(__GNUC__)
43#define _PACKED __attribute__((packed))
44#else
45#define _PACKED
46#endif
47
52#define ADBMS_AFE_MAX_DEVICES 3
53
58#define ADBMS_AFE_MAX_CELLS_PER_DEVICE 18
59#define ADBMS_AFE_MAX_CELL_THERMISTORS_PER_DEVICE 16
60#define ADBMS_AFE_MAX_BOARD_THERMISTORS_PER_DEVICE 1
61
65#define ADBMS_AFE_MAX_CELLS (ADBMS_AFE_MAX_DEVICES * ADBMS_AFE_MAX_CELLS_PER_DEVICE)
66#define ADBMS_AFE_MAX_CELL_THERMISTORS (ADBMS_AFE_MAX_DEVICES * ADBMS_AFE_MAX_CELL_THERMISTORS_PER_DEVICE)
67#define ADBMS_AFE_MAX_BOARD_THERMISTORS (ADBMS_AFE_MAX_DEVICES * ADBMS_AFE_MAX_CELL_THERMISTORS_PER_DEVICE)
68
74typedef enum {
75 ADBMS_AFE_ADC_MODE_422HZ = 0,
79 ADBMS_AFE_ADC_MODE_1KHZ,
80 ADBMS_AFE_ADC_MODE_14KHZ,
81 ADBMS_AFE_ADC_MODE_3KHZ,
82 ADBMS_AFE_ADC_MODE_2KHZ,
83 NUM_ADBMS_AFE_ADC_MODES
85
92typedef struct AdbmsAfeSettings {
97 size_t num_devices;
98 size_t num_cells;
104
113typedef struct AdbmsAfeStorage {
115 uint16_t thermistor_voltages[ADBMS_AFE_MAX_CELL_THERMISTORS];
116 uint16_t board_thermistor_voltages[ADBMS_AFE_MAX_BOARD_THERMISTORS];
122 AdbmsAfeWriteConfigAPacket config_a[ADBMS_AFE_MAX_DEVICES];
123 AdbmsAfeWriteConfigBPacket config_b[ADBMS_AFE_MAX_DEVICES];
125
138
150
162
175StatusCode adbms_afe_trigger_thermistor_conv(AdbmsAfeStorage *afe, uint8_t device_num, uint8_t thermistor_index);
176
189
201
213StatusCode adbms_afe_read_thermistor(AdbmsAfeStorage *afe, uint8_t device_num, uint8_t thermistor_index);
214
226
238StatusCode adbms_afe_toggle_cell_discharge(AdbmsAfeStorage *afe, uint16_t cell, bool discharge);
239
252
253#ifdef MS_PLATFORM_X86
254
259AdbmsAfeStorage *adbms_afe_get_storage(void);
260
268StatusCode adbms_afe_set_cell_voltage(AdbmsAfeStorage *afe, uint8_t cell_index, float voltage);
269
278StatusCode adbms_afe_set_thermistor_voltage(AdbmsAfeStorage *afe, uint8_t device_num, uint8_t thermistor_index, float voltage);
279
287StatusCode adbms_afe_set_board_thermistor_voltage(AdbmsAfeStorage *afe, uint8_t device_num, float voltage);
288
296StatusCode adbms_afe_set_afe_dev_cell_voltages(AdbmsAfeStorage *afe, size_t device_num, float voltage);
297
305StatusCode adbms_afe_set_afe_dev_thermistor_voltages(AdbmsAfeStorage *afe, size_t device_num, float voltage);
306
313StatusCode adbms_afe_set_pack_cell_voltages(AdbmsAfeStorage *afe, float voltage);
314
321StatusCode adbms_afe_set_pack_thermistor_voltages(AdbmsAfeStorage *afe, float voltage);
322
329StatusCode adbms_afe_set_pack_board_thermistor_voltages(AdbmsAfeStorage *afe, float voltage);
330
336uint16_t adbms_afe_get_cell_voltage(AdbmsAfeStorage *afe, uint16_t cell_index);
337
344uint16_t adbms_afe_get_thermistor_voltage(AdbmsAfeStorage *afe, uint8_t device_num, uint16_t thermistor_index);
345
351uint16_t adbms_afe_get_board_thermistor_voltage(AdbmsAfeStorage *afe, uint8_t device_num);
352
359bool adbms_afe_get_cell_discharge(AdbmsAfeStorage *afe, uint16_t cell);
360#endif
StatusCode adbms_afe_set_discharge_pwm_cycle(AdbmsAfeStorage *afe, uint8_t duty_cycle)
Sets the same discharge PWM duty cycle for all cells across all AFE devices.
Definition: adbms_afe.c:474
#define ADBMS_AFE_MAX_CELLS
Maximum across all devices.
Definition: adbms_afe.h:65
StatusCode adbms_afe_trigger_thermistor_conv(AdbmsAfeStorage *afe, uint8_t device_num, uint8_t thermistor_index)
Triggers ADC conversion for the specified thermistor voltage inputs.
Definition: adbms_afe.c:246
StatusCode adbms_afe_write_config(AdbmsAfeStorage *afe)
Writes configuration bits onto CFGR (Configuration Register Group)
Definition: adbms_afe.c:220
#define ADBMS_AFE_MAX_DEVICES
Maximum AFE devices in daisy chain config.
Definition: adbms_afe.h:52
StatusCode adbms_afe_init(AdbmsAfeStorage *afe, const AdbmsAfeSettings *config)
Initializes the ADBMS AFE system with provided configuration settings.
Definition: adbms_afe.c:161
StatusCode adbms_afe_read_thermistor(AdbmsAfeStorage *afe, uint8_t device_num, uint8_t thermistor_index)
Reads and stores thermistor voltages from the aux voltage registers of each afe.
Definition: adbms_afe.c:362
StatusCode adbms_afe_trigger_cell_conv(AdbmsAfeStorage *afe)
Triggers ADC conversion for all enabled cell voltage inputs.
Definition: adbms_afe.c:230
StatusCode adbms_afe_toggle_cell_discharge(AdbmsAfeStorage *afe, uint16_t cell, bool discharge)
Mark cell for discharging in each device.
Definition: adbms_afe.c:441
AdbmsAfeAdcMode
Select the ADC mode.
Definition: adbms_afe.h:74
StatusCode adbms_afe_read_board_temp(AdbmsAfeStorage *afe, uint8_t device_num)
Reads and stores board temperature thermistor voltage from the aux voltage registers of each afe.
Definition: adbms_afe.c:404
StatusCode adbms_afe_trigger_board_temp_conv(AdbmsAfeStorage *afe, uint8_t device_num)
Triggers ADC conversion for the specified board temperature thermistor input.
Definition: adbms_afe.c:283
StatusCode adbms_afe_read_cells(AdbmsAfeStorage *afe)
Reads and stores cell voltages from the voltage cell registers of each afe.
Definition: adbms_afe.c:315
@ ADBMS_AFE_ADC_MODE_26HZ
Definition: adbms_afe.h:78
@ ADBMS_AFE_ADC_MODE_27KHZ
Definition: adbms_afe.h:76
@ ADBMS_AFE_ADC_MODE_7KHZ
Definition: adbms_afe.h:77
SpiPort
SPI Port selection.
Definition: spi.h:34
StatusCode
StatusCodes for various errors.
Definition: status.h:27
Afe Settings Data.
Definition: adbms_afe.h:92
SpiSettings * spi_settings
Definition: adbms_afe.h:101
uint16_t cell_bitset[ADBMS_AFE_MAX_DEVICES]
Definition: adbms_afe.h:95
AdbmsAfeAdcMode adc_mode
Definition: adbms_afe.h:93
const SpiPort spi_port
Definition: adbms_afe.h:102
size_t num_thermistors
Definition: adbms_afe.h:99
size_t num_devices
Definition: adbms_afe.h:97
size_t num_cells
Definition: adbms_afe.h:98
Runtime Data Storage.
Definition: adbms_afe.h:113
uint16_t cell_result_lookup[ADBMS_AFE_MAX_CELLS]
Definition: adbms_afe.h:118
uint16_t thermistor_voltages[ADBMS_AFE_MAX_CELL_THERMISTORS]
Definition: adbms_afe.h:115
AdbmsAfeWriteConfigBPacket config_b[ADBMS_AFE_MAX_DEVICES]
Definition: adbms_afe.h:123
uint16_t cell_voltages[ADBMS_AFE_MAX_CELLS]
Definition: adbms_afe.h:114
AdbmsAfeWriteConfigAPacket config_a[ADBMS_AFE_MAX_DEVICES]
Definition: adbms_afe.h:122
AdbmsAfeSettings * settings
Definition: adbms_afe.h:121
uint16_t discharge_cell_lookup[ADBMS_AFE_MAX_CELLS]
Definition: adbms_afe.h:119
uint16_t board_thermistor_voltages[ADBMS_AFE_MAX_BOARD_THERMISTORS]
Definition: adbms_afe.h:116
SPI settings struct.
Definition: spi.h:76