V1.12
This commit is contained in:
parent
7b4fc940d3
commit
0bc4a59480
@ -6,6 +6,8 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "AMS_HighLevel.h"
|
#include "AMS_HighLevel.h"
|
||||||
|
#include "ADBMS_LL_Driver.h"
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
Cell_Module module = {};
|
Cell_Module module = {};
|
||||||
uint32_t balancedCells = 0;
|
uint32_t balancedCells = 0;
|
||||||
@ -21,9 +23,10 @@ uint8_t packetChecksumFails = 0;
|
|||||||
#define MAX_PACKET_CHECKSUM_FAILS 5
|
#define MAX_PACKET_CHECKSUM_FAILS 5
|
||||||
|
|
||||||
uint8_t deviceSleeps = 0;
|
uint8_t deviceSleeps = 0;
|
||||||
#define MAX_DEVICE_SLEEP 3 //TODO: change to correct value
|
#define MAX_DEVICE_SLEEP 3 //TODO: change to correct value
|
||||||
#define MAX_CELL_VOLTAGE 4100 //change to 4200
|
#define MAX_CELL_VOLTAGE 4100 //change to 4200
|
||||||
#define MIN_CELL_VOLTAGE 3100 //change to 3000
|
#define MIN_CELL_VOLTAGE 3100 //change to 3000
|
||||||
|
#define CELL_VOLTAGE_DIFF_BALANCING 20 //max difference between lowest cell and any other cell
|
||||||
|
|
||||||
amsState currentAMSState = AMSDEACTIVE;
|
amsState currentAMSState = AMSDEACTIVE;
|
||||||
amsState lastAMSState = AMSDEACTIVE;
|
amsState lastAMSState = AMSDEACTIVE;
|
||||||
@ -181,6 +184,22 @@ uint8_t AMS_Charging_Loop() { return 0; }
|
|||||||
uint8_t AMS_Discharging_Loop() { return 0; }
|
uint8_t AMS_Discharging_Loop() { return 0; }
|
||||||
|
|
||||||
uint8_t AMS_Balancing_Loop() {
|
uint8_t AMS_Balancing_Loop() {
|
||||||
//TODO: implement
|
uint8_t id_cell_lowest_voltage = -1;
|
||||||
|
uint8_t num_of_cells_to_balance = 0;
|
||||||
|
for (int i = 0; i < 13; i++) {
|
||||||
|
if (module.cellVoltages[i] < module.cellVoltages[id_cell_lowest_voltage])
|
||||||
|
id_cell_lowest_voltage = i;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < 13; i++) {
|
||||||
|
if (module.cellVoltages[i] - CELL_VOLTAGE_DIFF_BALANCING < module.cellVoltages[id_cell_lowest_voltage]){
|
||||||
|
amsConfigBalancing((1 << i), 0xF);
|
||||||
|
num_of_cells_to_balance++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (num_of_cells_to_balance == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
amsStartBalancing(0);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
#define MAX_TEMP ((int16_t)(59 / 0.0625f))
|
#define MAX_TEMP ((int16_t)(59 / 0.0625f))
|
||||||
#define MAX_FAILED_TEMP 2 //TODO: change value for compliance with the actual number of sensors
|
#define MAX_FAILED_TEMP 2 //TODO: change value for compliance with the actual number of sensors
|
||||||
#warning "change value for compliance with the actual number of sensors"
|
#warning "change value for compliance with the actual number of sensors", change temps to float
|
||||||
|
|
||||||
int16_t tmp1075_temps[N_TEMP_SENSORS] = {0};
|
int16_t tmp1075_temps[N_TEMP_SENSORS] = {0};
|
||||||
uint32_t tmp1075_failed_sensors = 0;
|
uint32_t tmp1075_failed_sensors = 0;
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
#include "PWM_control.h"
|
#include "PWM_control.h"
|
||||||
#include "can-halal.h"
|
#include "can-halal.h"
|
||||||
#include "eeprom.h"
|
#include "eeprom.h"
|
||||||
|
#include "soc_estimation.h"
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
#define CAN_ID_IN 0x501
|
#define CAN_ID_IN 0x501
|
||||||
@ -72,15 +73,13 @@ void can_handle_send_status() {
|
|||||||
uint8_t data[8] = {};
|
uint8_t data[8] = {};
|
||||||
int8_t id_highest_temp = -1;
|
int8_t id_highest_temp = -1;
|
||||||
int16_t highest_temp = INT16_MIN;
|
int16_t highest_temp = INT16_MIN;
|
||||||
int8_t id_lowest_volt = -1;
|
|
||||||
int16_t lowest_volt = INT16_MIN;
|
|
||||||
sm_check_battery_temperature(&id_highest_temp, &highest_temp);
|
sm_check_battery_temperature(&id_highest_temp, &highest_temp);
|
||||||
|
|
||||||
|
|
||||||
data[0] = ((state.current_state << 4) | (current_powerground_status >> 4)); // 1 bit emptyy | 3 bit state | 4 bit powerground
|
data[0] = ((state.current_state << 4) | (current_powerground_status >> 4)); // 1 bit emptyy | 3 bit state | 4 bit powerground
|
||||||
data[1] = ((current_powerground_status << 4) | (state.error_source >> 4)); // 4 bit powerground | 4 bit error
|
data[1] = ((current_powerground_status << 4) | (state.error_source >> 4)); // 4 bit powerground | 4 bit error
|
||||||
data[2] = ((state.error_source << 4) | (0)); // 4 bit error | 4 bit state of charge
|
data[2] = ((state.error_source << 4)); // 4 bit error | 4 bit state of charge
|
||||||
data[3] = (0); // 8 bit state of charge
|
data[3] = ((int) current_soc); // 8 bit state of charge
|
||||||
data[4] = ((RELAY_BAT_SIDE_VOLTAGE / 1000)); // 8 bit battery voltage
|
data[4] = ((RELAY_BAT_SIDE_VOLTAGE / 1000)); // 8 bit battery voltage
|
||||||
data[5] = ((RELAY_ESC_SIDE_VOLTAGE / 1000)); // 8 bit Inverter voltage
|
data[5] = ((RELAY_ESC_SIDE_VOLTAGE / 1000)); // 8 bit Inverter voltage
|
||||||
data[6] = ((CURRENT_MEASUREMENT / 1000)); // 8 bit Current
|
data[6] = ((CURRENT_MEASUREMENT / 1000)); // 8 bit Current
|
||||||
@ -139,10 +138,10 @@ void can_handle_dump() {
|
|||||||
if (can_delay_manager > HAL_GetTick())
|
if (can_delay_manager > HAL_GetTick())
|
||||||
continue;
|
continue;
|
||||||
else
|
else
|
||||||
can_delay_manager = HAL_GetTick() + CAN_STATUS_FREQ;
|
can_delay_manager = HAL_GetTick() + CAN_DUMP_FREQ;
|
||||||
eeprom_read(data, 64);
|
eeprom_read(data, 64);
|
||||||
for (int i = 0; i < 63; i += 8) {
|
for (int i = 0; i < 63; i += 8) {
|
||||||
ftcan_transmit(CAN_ID_OUT, data[i], 8);
|
ftcan_transmit(CAN_ID_OUT, &data[i], 8);
|
||||||
}
|
}
|
||||||
ftcan_transmit(CAN_ID_OUT, 0, 1);
|
ftcan_transmit(CAN_ID_OUT, 0, 1);
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
|
|
||||||
#include "ADBMS_LL_Driver.h"
|
#include "ADBMS_LL_Driver.h"
|
||||||
#include "TMP1075.h"
|
#include "TMP1075.h"
|
||||||
|
#include "soc_estimation.h"
|
||||||
#include "stm32f3xx_hal_def.h"
|
#include "stm32f3xx_hal_def.h"
|
||||||
#include <eeprom.h>
|
#include <eeprom.h>
|
||||||
|
|
||||||
@ -19,6 +20,8 @@
|
|||||||
static I2C_HandleTypeDef* hi2c;
|
static I2C_HandleTypeDef* hi2c;
|
||||||
uint32_t write_address, read_address;
|
uint32_t write_address, read_address;
|
||||||
|
|
||||||
|
#warning TEST THIS
|
||||||
|
|
||||||
void eeprom_init(I2C_HandleTypeDef* handle) {
|
void eeprom_init(I2C_HandleTypeDef* handle) {
|
||||||
hi2c = handle;
|
hi2c = handle;
|
||||||
write_address = 0;
|
write_address = 0;
|
||||||
@ -32,7 +35,7 @@ void eeprom_write_status(){
|
|||||||
data[0] = ((state.current_state << 4) | (current_powerground_status >> 4));
|
data[0] = ((state.current_state << 4) | (current_powerground_status >> 4));
|
||||||
data[1] = ((current_powerground_status << 4) | (state.error_source >> 4)); // 4 bit powerground | 4 bit error
|
data[1] = ((current_powerground_status << 4) | (state.error_source >> 4)); // 4 bit powerground | 4 bit error
|
||||||
data[2] = ((state.error_source << 4) | (0)); // 4 bit error | 4 bit state of charge
|
data[2] = ((state.error_source << 4) | (0)); // 4 bit error | 4 bit state of charge
|
||||||
data[3] = (0); // 8 bit state of charge
|
data[3] = ((int) current_soc); // 8 bit state of charge
|
||||||
data[4] = (RELAY_BAT_SIDE_VOLTAGE >> 8); // 16 bit battery voltage
|
data[4] = (RELAY_BAT_SIDE_VOLTAGE >> 8); // 16 bit battery voltage
|
||||||
data[5] = (RELAY_BAT_SIDE_VOLTAGE);
|
data[5] = (RELAY_BAT_SIDE_VOLTAGE);
|
||||||
data[6] = (RELAY_ESC_SIDE_VOLTAGE >> 8); // 16 bit Inverter voltage
|
data[6] = (RELAY_ESC_SIDE_VOLTAGE >> 8); // 16 bit Inverter voltage
|
||||||
|
@ -1,6 +1,9 @@
|
|||||||
#include "errors.h"
|
#include "errors.h"
|
||||||
#include "stm32f3xx_hal.h"
|
#include "stm32f3xx_hal.h"
|
||||||
|
|
||||||
|
|
||||||
|
#warning move all errors here
|
||||||
|
|
||||||
SlaveErrorData error_data;
|
SlaveErrorData error_data;
|
||||||
|
|
||||||
void set_error_source(SlaveErrorKind source) {
|
void set_error_source(SlaveErrorKind source) {
|
||||||
|
@ -26,6 +26,7 @@
|
|||||||
#include "PWM_control.h"
|
#include "PWM_control.h"
|
||||||
#include "can.h"
|
#include "can.h"
|
||||||
#include "AMS_HighLevel.h"
|
#include "AMS_HighLevel.h"
|
||||||
|
#include "soc_estimation.h"
|
||||||
#include "state_machine.h"
|
#include "state_machine.h"
|
||||||
#include <status_LED.h>
|
#include <status_LED.h>
|
||||||
#include "TMP1075.h"
|
#include "TMP1075.h"
|
||||||
@ -135,6 +136,7 @@ int main(void)
|
|||||||
AMS_Init(&hspi1);
|
AMS_Init(&hspi1);
|
||||||
can_init(&hcan);
|
can_init(&hcan);
|
||||||
PWM_control_init(&htim3, &htim2, &htim15);
|
PWM_control_init(&htim3, &htim2, &htim15);
|
||||||
|
soc_init();
|
||||||
status_led_init(&htim4, &htim4, &htim4);
|
status_led_init(&htim4, &htim4, &htim4);
|
||||||
|
|
||||||
//AMS_Loop();
|
//AMS_Loop();
|
||||||
|
@ -6,13 +6,15 @@
|
|||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
#define SOC_ESTIMATION_NO_CURRENT_THRESH 200 // mA
|
#define SOC_ESTIMATION_NO_CURRENT_THRESH 500 // mA
|
||||||
#define SOC_ESTIMATION_NO_CURRENT_TIME 100000 // ms
|
#define SOC_ESTIMATION_NO_CURRENT_TIME 100000 // ms
|
||||||
#define SOC_ESTIMATION_BATTERY_CAPACITY 70300800 // mAs
|
#define SOC_ESTIMATION_BATTERY_CAPACITY 70300800 // mAs
|
||||||
|
|
||||||
#define MIN_CELL_VOLTAGE 3000
|
#define MIN_CELL_VOLTAGE 3000
|
||||||
#define MAX_CELL_VOLTAGE 4200
|
#define MAX_CELL_VOLTAGE 4200
|
||||||
|
|
||||||
|
|
||||||
|
#warning TODO
|
||||||
ocv_soc_pair_t OCV_SOC_PAIRS[] = {
|
ocv_soc_pair_t OCV_SOC_PAIRS[] = {
|
||||||
{25000, 0.00f}, {29900, 3.97f}, {32300, 9.36f}, {33200, 12.60f},
|
{25000, 0.00f}, {29900, 3.97f}, {32300, 9.36f}, {33200, 12.60f},
|
||||||
{33500, 13.68f}, {34100, 20.15f}, {35300, 32.01f}, {38400, 66.53f},
|
{33500, 13.68f}, {34100, 20.15f}, {35300, 32.01f}, {38400, 66.53f},
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
#include "PWM_control.h"
|
#include "PWM_control.h"
|
||||||
#include "eeprom.h"
|
#include "eeprom.h"
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
|
#include "soc_estimation.h"
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
// Time to wait after reaching 95% of battery voltage before exiting precharge
|
// Time to wait after reaching 95% of battery voltage before exiting precharge
|
||||||
@ -23,8 +24,7 @@
|
|||||||
// Max time to wait for CAN messages. If we reach it then we emergency shutdown.
|
// Max time to wait for CAN messages. If we reach it then we emergency shutdown.
|
||||||
#define CAN_TIMEOUT 1000
|
#define CAN_TIMEOUT 1000
|
||||||
// waiting time between to eeprom writes
|
// waiting time between to eeprom writes
|
||||||
#define EEPROM_WRITE_FREQ_INACTIVE 10000
|
#define EEPROM_WRITE_FREQ_INACTIVE 1000
|
||||||
#define EEPROM_WRITE_FREQ_ACTIVE 1000
|
|
||||||
|
|
||||||
StateHandle state;
|
StateHandle state;
|
||||||
int32_t RELAY_BAT_SIDE_VOLTAGE;
|
int32_t RELAY_BAT_SIDE_VOLTAGE;
|
||||||
@ -61,6 +61,8 @@ void sm_update(){
|
|||||||
sm_precharge_discharge_manager();
|
sm_precharge_discharge_manager();
|
||||||
sm_calibrate_powerground();
|
sm_calibrate_powerground();
|
||||||
sm_powerground_manager();
|
sm_powerground_manager();
|
||||||
|
soc_update();
|
||||||
|
|
||||||
if (CAN_timer < HAL_GetTick())
|
if (CAN_timer < HAL_GetTick())
|
||||||
state.current_state = state.target_state = STATE_ERROR;
|
state.current_state = state.target_state = STATE_ERROR;
|
||||||
|
|
||||||
@ -79,22 +81,22 @@ void sm_update(){
|
|||||||
state.current_state = sm_update_inactive(); // monitor only
|
state.current_state = sm_update_inactive(); // monitor only
|
||||||
break;
|
break;
|
||||||
case STATE_PRECHARGE:
|
case STATE_PRECHARGE:
|
||||||
state.current_state = sm_update_precharge(); // set PRECHARGE and turn on cooling at 50% or such
|
state.current_state = sm_update_precharge(); // set PRECHARGE
|
||||||
break;
|
break;
|
||||||
case STATE_READY:
|
case STATE_READY:
|
||||||
state.current_state = sm_update_ready(); // keep cooling at 50%, get ready to turn on powerground
|
state.current_state = sm_update_ready();
|
||||||
break;
|
break;
|
||||||
case STATE_ACTIVE:
|
case STATE_ACTIVE:
|
||||||
state.current_state = sm_update_active(); // set PRECHARGE and turn on cooling at 50% or such
|
state.current_state = sm_update_active();
|
||||||
break;
|
break;
|
||||||
case STATE_DISCHARGE:
|
case STATE_DISCHARGE:
|
||||||
state.current_state = sm_update_discharge(); // open the main relay, keep PRECHARGE closed
|
state.current_state = sm_update_discharge();
|
||||||
break;
|
break;
|
||||||
case STATE_CHARGING_PRECHARGE:
|
case STATE_CHARGING_PRECHARGE:
|
||||||
state.current_state = sm_update_charging_precharge();
|
state.current_state = sm_update_charging_precharge();
|
||||||
break;
|
break;
|
||||||
case STATE_CHARGING:
|
case STATE_CHARGING:
|
||||||
state.current_state = sm_update_charging(); // monitor and turn on cooling if needed.
|
state.current_state = sm_update_charging();
|
||||||
break;
|
break;
|
||||||
case STATE_ERROR:
|
case STATE_ERROR:
|
||||||
state.current_state = sm_update_error(); // enter the correct ERROR state
|
state.current_state = sm_update_error(); // enter the correct ERROR state
|
||||||
@ -136,6 +138,8 @@ void sm_handle_ams_in(const uint8_t *data){
|
|||||||
break;
|
break;
|
||||||
#warning implement this
|
#warning implement this
|
||||||
case 0xF1: // EEPROM
|
case 0xF1: // EEPROM
|
||||||
|
if (state.current_state == STATE_INACTIVE)
|
||||||
|
sm_eeprom_write_status();
|
||||||
break;
|
break;
|
||||||
case 0xFF: // EMERGENCY SHUTDOWN
|
case 0xFF: // EMERGENCY SHUTDOWN
|
||||||
state.current_state = STATE_DISCHARGE;
|
state.current_state = STATE_DISCHARGE;
|
||||||
@ -236,13 +240,6 @@ void sm_program_powerground(){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void sm_balancing(){
|
|
||||||
for (int i = 0; i < 13; i++) {
|
|
||||||
amsConfigBalancing((1 << i), 0xF);
|
|
||||||
}
|
|
||||||
amsStartBalancing(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void sm_eeprom_write_status(){
|
void sm_eeprom_write_status(){
|
||||||
if (EEPROM_timer < HAL_GetTick()){
|
if (EEPROM_timer < HAL_GetTick()){
|
||||||
eeprom_write_status();
|
eeprom_write_status();
|
||||||
|
@ -11,6 +11,8 @@
|
|||||||
#include <status_LED.h>
|
#include <status_LED.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#warning test out pulldown and pushpull settings
|
||||||
|
|
||||||
/* The PWM period (1/FPWM) is defined by the following parameters:
|
/* The PWM period (1/FPWM) is defined by the following parameters:
|
||||||
ARR value, the Prescaler value, and the internal clock itself which drives the timer module FCLK.
|
ARR value, the Prescaler value, and the internal clock itself which drives the timer module FCLK.
|
||||||
F_PWM = (F_CLK)/((ARR + 1) * (PSC + 1))
|
F_PWM = (F_CLK)/((ARR + 1) * (PSC + 1))
|
||||||
@ -54,17 +56,15 @@ void status_led_init(TIM_HandleTypeDef* r, TIM_HandleTypeDef* g, TIM_HandleTypeD
|
|||||||
void status_led_update(){
|
void status_led_update(){
|
||||||
switch (state.current_state) {
|
switch (state.current_state) {
|
||||||
case STATE_INACTIVE:
|
case STATE_INACTIVE:
|
||||||
status_led_blink_sequence(1, GREEN);
|
status_led_set_color(GREEN);
|
||||||
break;
|
break;
|
||||||
case STATE_CHARGING_PRECHARGE:
|
case STATE_CHARGING_PRECHARGE:
|
||||||
case STATE_PRECHARGE:
|
case STATE_PRECHARGE:
|
||||||
case STATE_DISCHARGE:
|
case STATE_DISCHARGE:
|
||||||
status_led_blink_sequence(2, YELLOW);
|
status_led_set_color( YELLOW);
|
||||||
break;
|
break;
|
||||||
case STATE_CHARGING:
|
case STATE_CHARGING:
|
||||||
case STATE_READY:
|
case STATE_READY:
|
||||||
status_led_blink_sequence(3, PINK);
|
|
||||||
break;
|
|
||||||
case STATE_ACTIVE:
|
case STATE_ACTIVE:
|
||||||
status_led_set_color(PINK);
|
status_led_set_color(PINK);
|
||||||
break;
|
break;
|
||||||
@ -118,6 +118,9 @@ void status_led_set_color(color color){
|
|||||||
case WHITE:
|
case WHITE:
|
||||||
status_led_set(255, 255, 255);
|
status_led_set(255, 255, 255);
|
||||||
break;
|
break;
|
||||||
|
case OFF:
|
||||||
|
status_led_set(0,0,0);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user