Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 46 additions & 1 deletion Core/Inc/u_efuses.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,18 @@
#include <stdint.h>
#include <stdbool.h>
#include "main.h"
#include "can_messages_tx.h"
#include "serial.h"
#include "u_dti.h"

/* Tempeature constants to control */

#define PUMP1_UPPER_MOTOR_TEMP 45
#define PUMP1_LOWER_MOTOR_TEMP 35
#define PUMP2_UPPER_CONTROLLER_TEMP 45
#define PUMP2_LOWER_CONTROLLER_TEMP 35
#define RADFAN_UPPER_MOTOR_TEMP 65
#define RADFAN_LOWER_MOTOR_TEMP 35

typedef enum {
EFUSE_DASHBOARD,
Expand Down Expand Up @@ -31,8 +43,41 @@ typedef struct {
} efuse_data_t;

/* API */
efuse_data_t efuse_getData(void); // Returns an instance of efuse_data_t with all current eFuse data.
void efuse_enable(efuse_t efuse); // Enables an eFuse.
void efuse_disable(efuse_t efuse); // Disables an eFuse.


/**
* @brief Enables eFuses which should be on by default.
*
* The following eFuses should be enabled by default:
* - `EFUSE_DASHBOARD`
* - `EFUSE_LV`
* - `EFUSE_BATTBOX`
* - `EFUSE_MC`
* - `EFUSE_FANBATT` ?? (We may need to do this conditionally based on pack temp)
*/
void efuse_init(void);

/**
* @brief Updates the states of eFuses.
*
* The following eFuses are controlled based on temperature:
* - `EFUSE_PUMP1`
* - Turned on if the motor temperature exceeds `PUMP1_UPPER_MOTOR_TEMP`.
* - Turned off if the motor temperature falls below `PUMP1_LOWER_MOTOR_TEMP`.
* - `EFUSE_PUMP2`
* - Turned on if the motor controller (MC) temperature exceeds `PUMP2_UPPER_CONTROLLER_TEMP`.
* - Turned off if the MC temperature falls below `PUMP2_LOWER_CONTROLLER_TEMP`.
* - `EFUSE_RADFAN`
* - Turned on if the motor temperature exceeds `RADFAN_UPPER_MOTOR_TEMP`.
* - Turned off if the motor temperature falls below `RADFAN_LOWER_MOTOR_TEMP`.
*
* Also, some eFuses should be updated according to the CAN message.
*/
void efuse_update(void);

void efuse_send_to_dashboard(void);
void efuse_send_to_serial(void);

#endif /* u_efuses.h */
154 changes: 150 additions & 4 deletions Core/Src/u_efuses.c
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ static const _metadata efuses[] = {

/* Returns an instance of efuse_data_t with all current eFuse data. */
#define V_REF 3.3f // V_(REF) = 3V3
efuse_data_t efuse_getData(void) {
static efuse_data_t efuse_getData(void) {
raw_efuse_adc_t adc = adc_getEFuseData();

/* Loop through each eFuse and calculate the necessary values. */
Expand All @@ -62,12 +62,158 @@ efuse_data_t efuse_getData(void) {
return data;
}

/* Enables an eFuse. */
void efuse_enable(efuse_t efuse) {
HAL_GPIO_WritePin(efuses[efuse].en_port, efuses[efuse].en_pin, GPIO_PIN_SET);
}

/* Disables an eFuse. */
void efuse_disable(efuse_t efuse) {
HAL_GPIO_WritePin(efuses[efuse].en_port, efuses[efuse].en_pin, GPIO_PIN_RESET);
}
}

void efuse_init(void) {
efuse_enable(EFUSE_DASHBOARD);
efuse_enable(EFUSE_LV);
efuse_enable(EFUSE_BATTBOX);
efuse_enable(EFUSE_MC);
efuse_enable(EFUSE_FANBATT);
}

void efuse_update(void) {
efuse_data_t eFuse_data = efuse_getData();

uint16_t motor_temp = dti_get_motor_temp();
uint16_t controller_temp = dti_get_controller_temp();

if (motor_temp > PUMP1_UPPER_MOTOR_TEMP) {
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Take a look at our debounce() implementation in debounce.c in Embedded-Base. We should be able to configure hoe long this condition stays true for the efuse to be enabled

if (eFuse_data.enabled[EFUSE_PUMP1] == false) {
efuse_enable(EFUSE_PUMP1);
}
}
if (motor_temp < PUMP1_LOWER_MOTOR_TEMP) {
if (eFuse_data.enabled[EFUSE_PUMP1] == true) {
efuse_disable(EFUSE_PUMP1);
}
}

if (controller_temp > PUMP2_UPPER_CONTROLLER_TEMP) {
if (eFuse_data.enabled[EFUSE_PUMP2] == false) {
efuse_enable(EFUSE_PUMP2);
}
}
if (controller_temp < PUMP2_LOWER_CONTROLLER_TEMP) {
if (eFuse_data.enabled[EFUSE_PUMP2] == true) {
efuse_disable(EFUSE_PUMP2);
}
}

if (motor_temp > RADFAN_UPPER_MOTOR_TEMP) {
if (eFuse_data.enabled[EFUSE_RADFAN] == false) {
efuse_enable(EFUSE_RADFAN);
}
}
if (motor_temp < RADFAN_LOWER_MOTOR_TEMP) {
if (eFuse_data.enabled[EFUSE_RADFAN] == true) {
efuse_disable(EFUSE_RADFAN);
}
}
}

void efuse_send_to_dashboard(void) {
efuse_data_t data = efuse_getData();

send_dashboard_efuse(
data.raw[EFUSE_DASHBOARD],
data.voltage[EFUSE_DASHBOARD],
data.current[EFUSE_DASHBOARD],
data.faulted[EFUSE_DASHBOARD],
data.enabled[EFUSE_DASHBOARD]
);

send_brake_efuse(
data.raw[EFUSE_BRAKE],
data.voltage[EFUSE_BRAKE],
data.current[EFUSE_BRAKE],
data.faulted[EFUSE_BRAKE],
data.enabled[EFUSE_BRAKE]
);

send_shutdown_efuse(
data.raw[EFUSE_SHUTDOWN],
data.voltage[EFUSE_SHUTDOWN],
data.current[EFUSE_SHUTDOWN],
data.faulted[EFUSE_SHUTDOWN],
data.enabled[EFUSE_SHUTDOWN]
);

send_lv_efuse(
data.raw[EFUSE_LV],
data.voltage[EFUSE_LV],
data.current[EFUSE_LV],
data.faulted[EFUSE_LV],
data.enabled[EFUSE_LV]
);

send_radfan_efuse(
data.raw[EFUSE_RADFAN],
data.voltage[EFUSE_RADFAN],
data.current[EFUSE_RADFAN],
data.faulted[EFUSE_RADFAN],
data.enabled[EFUSE_RADFAN]
);

send_fanbatt_efuse(
data.raw[EFUSE_FANBATT],
data.voltage[EFUSE_FANBATT],
data.current[EFUSE_FANBATT],
data.faulted[EFUSE_FANBATT],
data.enabled[EFUSE_FANBATT]
);

send_pumpone_efuse(
data.raw[EFUSE_PUMP1],
data.voltage[EFUSE_PUMP1],
data.current[EFUSE_PUMP1],
data.faulted[EFUSE_PUMP1],
data.enabled[EFUSE_PUMP1]
);

send_pumptwo_efuse(
data.raw[EFUSE_PUMP2],
data.voltage[EFUSE_PUMP2],
data.current[EFUSE_PUMP2],
data.faulted[EFUSE_PUMP2],
data.enabled[EFUSE_PUMP2]
);

send_battbox_efuse(
data.raw[EFUSE_BATTBOX],
data.voltage[EFUSE_BATTBOX],
data.current[EFUSE_BATTBOX],
data.faulted[EFUSE_BATTBOX],
data.enabled[EFUSE_BATTBOX]
);

send_mc_efuse(
data.raw[EFUSE_MC],
data.voltage[EFUSE_MC],
data.current[EFUSE_MC],
data.faulted[EFUSE_MC],
data.enabled[EFUSE_MC]
);
}

void efuse_send_to_serial(void) {
efuse_data_t data = efuse_getData();

serial_monitor("lv_efuse", "raw", "%d", data.raw[EFUSE_LV]);
serial_monitor("lv_efuse", "voltage", "%f", data.voltage[EFUSE_LV]);
serial_monitor("lv_efuse", "current", "%f", data.current[EFUSE_LV]);
serial_monitor("lv_efuse", "faulted?", "%d", data.faulted[EFUSE_LV]);
serial_monitor("lv_efuse", "enabled?", "%d", data.enabled[EFUSE_LV]);

serial_monitor("radfan_efuse", "raw", "%d", data.raw[EFUSE_RADFAN]);
serial_monitor("radfan_efuse", "voltage", "%f", data.voltage[EFUSE_RADFAN]);
serial_monitor("radfan_efuse", "current", "%f", data.current[EFUSE_RADFAN]);
serial_monitor("radfan_efuse", "faulted?", "%d", data.faulted[EFUSE_RADFAN]);
serial_monitor("radfan_efuse", "enabled?", "%d", data.enabled[EFUSE_RADFAN]);
}
126 changes: 5 additions & 121 deletions Core/Src/u_threads.c
Original file line number Diff line number Diff line change
Expand Up @@ -440,133 +440,17 @@ void vEFuses(ULONG thread_input) {
bool faulted;
bool enabled;
} efuse_message_t;

efuse_init();

while(1) {

PRINTLN_INFO("thread ran");

/* Get data. */
efuse_data_t data = efuse_getData();
efuse_update();

/* Send dashboard eFuse message. */
send_dashboard_efuse(
data.raw[EFUSE_DASHBOARD],
data.voltage[EFUSE_DASHBOARD],
data.current[EFUSE_DASHBOARD],
data.faulted[EFUSE_DASHBOARD],
data.enabled[EFUSE_DASHBOARD]
);
// serial_monitor("dashboard_efuse", "raw", "%d", data.raw[EFUSE_DASHBOARD]);
// serial_monitor("dashboard_efuse", "voltage", "%f", data.voltage[EFUSE_DASHBOARD]);
// serial_monitor("dashboard_efuse", "current", "%f", data.current[EFUSE_DASHBOARD]);
// serial_monitor("dashboard_efuse", "faulted?", "%d", data.faulted[EFUSE_DASHBOARD]);
// serial_monitor("dashboard_efuse", "enabled?", "%d", data.enabled[EFUSE_DASHBOARD]);
efuse_enable(EFUSE_DASHBOARD);


/* Send brake eFuse message. */
send_brake_efuse(
data.raw[EFUSE_BRAKE],
data.voltage[EFUSE_BRAKE],
data.current[EFUSE_BRAKE],
data.faulted[EFUSE_BRAKE],
data.enabled[EFUSE_BRAKE]
);
// serial_monitor("brake_efuse", "raw", "%d", data.raw[EFUSE_BRAKE]);
// serial_monitor("brake_efuse", "voltage", "%f", data.voltage[EFUSE_BRAKE]);
// serial_monitor("brake_efuse", "current", "%f", data.current[EFUSE_BRAKE]);
// serial_monitor("brake_efuse", "faulted?", "%d", data.faulted[EFUSE_BRAKE]);
// serial_monitor("brake_efuse", "enabled?", "%d", data.enabled[EFUSE_BRAKE]);

/* Send shutdown eFuse message. */
send_shutdown_efuse(
data.raw[EFUSE_SHUTDOWN],
data.voltage[EFUSE_SHUTDOWN],
data.current[EFUSE_SHUTDOWN],
data.faulted[EFUSE_SHUTDOWN],
data.enabled[EFUSE_SHUTDOWN]
);
// serial_monitor("shutdown_efuse", "raw", "%d", data.raw[EFUSE_SHUTDOWN]);
// serial_monitor("shutdown_efuse", "voltage", "%f", data.voltage[EFUSE_SHUTDOWN]);
// serial_monitor("shutdown_efuse", "current", "%f", data.current[EFUSE_SHUTDOWN]);
// serial_monitor("shutdown_efuse", "faulted?", "%d", data.faulted[EFUSE_SHUTDOWN]);
// serial_monitor("shutdown_efuse", "enabled?", "%d", data.enabled[EFUSE_SHUTDOWN]);

/* Send LV eFuse message. */
send_lv_efuse(
data.raw[EFUSE_LV],
data.voltage[EFUSE_LV],
data.current[EFUSE_LV],
data.faulted[EFUSE_LV],
data.enabled[EFUSE_LV]
);
efuse_enable(EFUSE_LV);
serial_monitor("lv_efuse", "raw", "%d", data.raw[EFUSE_LV]);
serial_monitor("lv_efuse", "voltage", "%f", data.voltage[EFUSE_LV]);
serial_monitor("lv_efuse", "current", "%f", data.current[EFUSE_LV]);
serial_monitor("lv_efuse", "faulted?", "%d", data.faulted[EFUSE_LV]);
serial_monitor("lv_efuse", "enabled?", "%d", data.enabled[EFUSE_LV]);


/* Send radfan eFuse message. */
send_radfan_efuse(
data.raw[EFUSE_RADFAN],
data.voltage[EFUSE_RADFAN],
data.current[EFUSE_RADFAN],
data.faulted[EFUSE_RADFAN],
data.enabled[EFUSE_RADFAN]
);
efuse_enable(EFUSE_RADFAN);
serial_monitor("radfan_efuse", "raw", "%d", data.raw[EFUSE_RADFAN]);
serial_monitor("radfan_efuse", "voltage", "%f", data.voltage[EFUSE_RADFAN]);
serial_monitor("radfan_efuse", "current", "%f", data.current[EFUSE_RADFAN]);
serial_monitor("radfan_efuse", "faulted?", "%d", data.faulted[EFUSE_RADFAN]);
serial_monitor("radfan_efuse", "enabled?", "%d", data.enabled[EFUSE_RADFAN]);

/* Send fanbatt eFuse message. */
send_fanbatt_efuse(
data.raw[EFUSE_FANBATT],
data.voltage[EFUSE_FANBATT],
data.current[EFUSE_FANBATT],
data.faulted[EFUSE_FANBATT],
data.enabled[EFUSE_FANBATT]
);

/* Send pump1 eFuse message. */
send_pumpone_efuse(
data.raw[EFUSE_PUMP1],
data.voltage[EFUSE_PUMP1],
data.current[EFUSE_PUMP1],
data.faulted[EFUSE_PUMP1],
data.enabled[EFUSE_PUMP1]
);

/* Send pump2 eFuse message. */
send_pumptwo_efuse(
data.raw[EFUSE_PUMP2],
data.voltage[EFUSE_PUMP2],
data.current[EFUSE_PUMP2],
data.faulted[EFUSE_PUMP2],
data.enabled[EFUSE_PUMP2]
);

/* Send battbox eFuse message. */
send_battbox_efuse(
data.raw[EFUSE_BATTBOX],
data.voltage[EFUSE_BATTBOX],
data.current[EFUSE_BATTBOX],
data.faulted[EFUSE_BATTBOX],
data.enabled[EFUSE_BATTBOX]
);

/* Send MC eFuse message. */
send_mc_efuse(
data.raw[EFUSE_MC],
data.voltage[EFUSE_MC],
data.current[EFUSE_MC],
data.faulted[EFUSE_MC],
data.enabled[EFUSE_MC]
);
efuse_send_to_dashboard();
efuse_send_to_serial();

/* Sleep Thread for specified number of ticks. */
tx_thread_sleep(efuses_thread.sleep);
Expand Down
2 changes: 1 addition & 1 deletion Drivers/Odyssey-Definitions
Loading