V1.0
This commit is contained in:
		@ -6,6 +6,7 @@
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "AMS_HighLevel.h"
 | 
					#include "AMS_HighLevel.h"
 | 
				
			||||||
 | 
					#include "ADBMS_Abstraction.h"
 | 
				
			||||||
#include "ADBMS_LL_Driver.h"
 | 
					#include "ADBMS_LL_Driver.h"
 | 
				
			||||||
#include <stdint.h>
 | 
					#include <stdint.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -169,10 +170,7 @@ uint8_t AMS_Idle_Loop() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  mcuDelay(10);
 | 
					  mcuDelay(10);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if ((module.overVoltage | module.underVoltage)) {
 | 
					  AMS_Balancing_Loop();
 | 
				
			||||||
    
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  return 0;
 | 
					  return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -185,9 +183,9 @@ 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() {
 | 
				
			||||||
  AMS_Idle_Loop();
 | 
					 | 
				
			||||||
  uint8_t id_cell_lowest_voltage = 0;
 | 
					  uint8_t id_cell_lowest_voltage = 0;
 | 
				
			||||||
  uint8_t num_of_cells_to_balance = 0;
 | 
					  uint8_t num_of_cells_to_balance = 0;
 | 
				
			||||||
 | 
					  uint32_t channels = 0;
 | 
				
			||||||
  for (int i = 0; i < 13; i++) {
 | 
					  for (int i = 0; i < 13; i++) {
 | 
				
			||||||
    if (module.cellVoltages[i] < module.cellVoltages[id_cell_lowest_voltage]) 
 | 
					    if (module.cellVoltages[i] < module.cellVoltages[id_cell_lowest_voltage]) 
 | 
				
			||||||
      id_cell_lowest_voltage = i;
 | 
					      id_cell_lowest_voltage = i;
 | 
				
			||||||
@ -195,18 +193,17 @@ uint8_t AMS_Balancing_Loop() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  for (int i = 0; i < 13; i++) {
 | 
					  for (int i = 0; i < 13; i++) {
 | 
				
			||||||
    if (module.cellVoltages[i] - CELL_VOLTAGE_DIFF_BALANCING < module.cellVoltages[id_cell_lowest_voltage]){
 | 
					    if (module.cellVoltages[i] - CELL_VOLTAGE_DIFF_BALANCING < module.cellVoltages[id_cell_lowest_voltage]){
 | 
				
			||||||
      amsConfigBalancing((1 << i), 0xF);
 | 
					      channels |= 1 << i;
 | 
				
			||||||
      num_of_cells_to_balance++;
 | 
					      num_of_cells_to_balance++;
 | 
				
			||||||
    } else {
 | 
					 | 
				
			||||||
      amsConfigBalancing((1 << i), 0x0);
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (num_of_cells_to_balance == 0){
 | 
					  if (num_of_cells_to_balance == 0){
 | 
				
			||||||
    balancingActive = 0;
 | 
					    balancingActive = 0;
 | 
				
			||||||
    return 0;
 | 
					    return 0;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
 | 
					  amsConfigBalancing(channels, 0xF);
 | 
				
			||||||
  balancingActive = 1;
 | 
					  balancingActive = 1;
 | 
				
			||||||
  amsStartBalancing(0);
 | 
					 | 
				
			||||||
  return 0;
 | 
					  return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -93,9 +93,9 @@ void can_handle_send_status() {
 | 
				
			|||||||
    uint16_t highest_temp = 0;
 | 
					    uint16_t highest_temp = 0;
 | 
				
			||||||
    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);                              // 8 bit state (only 3 are use) 
 | 
				
			||||||
    data[1] = ((current_powerground_status << 4) | (state.error_source >> 4));        // 4 bit powerground | 4 bit error 
 | 
					    data[1] = (current_powerground_status);                       // 8 bit powerground 
 | 
				
			||||||
    data[2] = ((state.error_source << 4));                                            // 4 bit error | 4 bit state of charge
 | 
					    data[2] = (state.error_source);                               // 8 bit error
 | 
				
			||||||
    data[3] = ((int) current_soc);                                // 8 bit state of charge
 | 
					    data[3] = ((int) current_soc);                                // 8 bit state of charge
 | 
				
			||||||
    data[4] = (roundf(RELAY_BAT_SIDE_VOLTAGE / 1000.0));        // 8 bit battery voltage
 | 
					    data[4] = (roundf(RELAY_BAT_SIDE_VOLTAGE / 1000.0));        // 8 bit battery voltage
 | 
				
			||||||
    data[5] = (roundf(RELAY_ESC_SIDE_VOLTAGE / 1000.0));        // 8 bit Inverter voltage
 | 
					    data[5] = (roundf(RELAY_ESC_SIDE_VOLTAGE / 1000.0));        // 8 bit Inverter voltage
 | 
				
			||||||
@ -110,7 +110,7 @@ void can_handle_send_log(){
 | 
				
			|||||||
  if (can_log_timer > HAL_GetTick())
 | 
					  if (can_log_timer > HAL_GetTick())
 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
  else {
 | 
					  else {
 | 
				
			||||||
    uint8_t data[8] = {};
 | 
					    uint8_t data[4] = {};
 | 
				
			||||||
    can_log_timer = HAL_GetTick() + CAN_LOGGING_FREQ;
 | 
					    can_log_timer = HAL_GetTick() + CAN_LOGGING_FREQ;
 | 
				
			||||||
    data[0] = id_to_log;
 | 
					    data[0] = id_to_log;
 | 
				
			||||||
    data[1] = module.cellVoltages[id_to_log] >> 8;
 | 
					    data[1] = module.cellVoltages[id_to_log] >> 8;
 | 
				
			||||||
@ -140,7 +140,7 @@ This function recieves a command from the Autobox with the CAN ID of 0x501.
 | 
				
			|||||||
with format of:
 | 
					with format of:
 | 
				
			||||||
data[0] = target state 
 | 
					data[0] = target state 
 | 
				
			||||||
  0x00 STATE_INACTIVE  | disconnect power to the ESC of powerground. Send it to return the mvbms to idle/monitoring mode.  If data[1] != 0 -> assume bad CAN message.
 | 
					  0x00 STATE_INACTIVE  | disconnect power to the ESC of powerground. Send it to return the mvbms to idle/monitoring mode.  If data[1] != 0 -> assume bad CAN message.
 | 
				
			||||||
  0x01 STATE_READY     | conneect power to the ESC of powerground and but with no PWM signal.                              If data[1] != 0 -> assume bad CAN message.
 | 
					  0x01 STATE_READY     | connect power to the ESC of powerground and but with no PWM signal.                              If data[1] != 0 -> assume bad CAN message.
 | 
				
			||||||
  0x02 STATE_ACTIVE    | activate powerground at (data[1]) percent.                                                        If data[1] > 100 -> assume bad CAN message.            
 | 
					  0x02 STATE_ACTIVE    | activate powerground at (data[1]) percent.                                                        If data[1] > 100 -> assume bad CAN message.            
 | 
				
			||||||
 | 
					
 | 
				
			||||||
allowed transitions:
 | 
					allowed transitions:
 | 
				
			||||||
@ -149,7 +149,7 @@ allowed transitions:
 | 
				
			|||||||
  STATE_ACTIVE    ->  STATE_INACTIVE, STATE_READY
 | 
					  STATE_ACTIVE    ->  STATE_INACTIVE, STATE_READY
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
void can_handle_recieve_command(const uint8_t *data){
 | 
					void can_handle_recieve_command(const uint8_t *data){
 | 
				
			||||||
  if (data[0] == 0x00 && data[1] == 0x00){
 | 
					  if (data[0] == 0x00){
 | 
				
			||||||
    sm_handle_ams_in(data);
 | 
					    sm_handle_ams_in(data);
 | 
				
			||||||
  } else if (data[0] == 0x01 && data[1] == 0x00){
 | 
					  } else if (data[0] == 0x01 && data[1] == 0x00){
 | 
				
			||||||
    sm_handle_ams_in(data);
 | 
					    sm_handle_ams_in(data);
 | 
				
			||||||
@ -159,10 +159,6 @@ void can_handle_recieve_command(const uint8_t *data){
 | 
				
			|||||||
    sm_handle_ams_in(data);
 | 
					    sm_handle_ams_in(data);
 | 
				
			||||||
  } else if (data[0] == 0xF1 && data[1] == 0x00) { 
 | 
					  } else if (data[0] == 0xF1 && data[1] == 0x00) { 
 | 
				
			||||||
    sm_handle_ams_in(data);
 | 
					    sm_handle_ams_in(data);
 | 
				
			||||||
  } else if (data[0] == 0xF2 && data[1] == 0x00) { 
 | 
					 | 
				
			||||||
    sm_handle_ams_in(data);
 | 
					 | 
				
			||||||
  } else if (data[0] == 0xFA && data[1] == 0x00) { 
 | 
					 | 
				
			||||||
    sm_handle_ams_in(data);
 | 
					 | 
				
			||||||
  } else if (data[0] == 0xFF && data[1] == 0x00) { 
 | 
					  } else if (data[0] == 0xFF && data[1] == 0x00) { 
 | 
				
			||||||
    sm_handle_ams_in(data);
 | 
					    sm_handle_ams_in(data);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
				
			|||||||
@ -7,6 +7,7 @@
 | 
				
			|||||||
 
 | 
					 
 | 
				
			||||||
#include <state_machine.h>
 | 
					#include <state_machine.h>
 | 
				
			||||||
#include <stdint.h>
 | 
					#include <stdint.h>
 | 
				
			||||||
 | 
					#include "ADBMS_Abstraction.h"
 | 
				
			||||||
#include "AMS_HighLevel.h"
 | 
					#include "AMS_HighLevel.h"
 | 
				
			||||||
#include "PWM_control.h"
 | 
					#include "PWM_control.h"
 | 
				
			||||||
#include "can.h"
 | 
					#include "can.h"
 | 
				
			||||||
@ -48,11 +49,13 @@ int32_t RELAY_BAT_SIDE_VOLTAGE;
 | 
				
			|||||||
int32_t RELAY_ESC_SIDE_VOLTAGE;
 | 
					int32_t RELAY_ESC_SIDE_VOLTAGE;
 | 
				
			||||||
int32_t CURRENT_MEASUREMENT;
 | 
					int32_t CURRENT_MEASUREMENT;
 | 
				
			||||||
bool CURRENT_MEASUREMENT_ON;
 | 
					bool CURRENT_MEASUREMENT_ON;
 | 
				
			||||||
 | 
					bool balancing_state;
 | 
				
			||||||
float base_offset = 0;
 | 
					float base_offset = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
uint32_t error_timer;
 | 
					uint32_t error_timer;
 | 
				
			||||||
uint32_t precharge_timer;
 | 
					uint32_t precharge_timer;
 | 
				
			||||||
uint32_t discharge_timer;
 | 
					uint32_t discharge_timer;
 | 
				
			||||||
 | 
					uint32_t balancing_timer;
 | 
				
			||||||
uint32_t eeprom_timer;
 | 
					uint32_t eeprom_timer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
uint32_t powerground_softstart_timer;
 | 
					uint32_t powerground_softstart_timer;
 | 
				
			||||||
@ -68,9 +71,10 @@ void sm_init(){
 | 
				
			|||||||
  state.current_state = STATE_INACTIVE;
 | 
					  state.current_state = STATE_INACTIVE;
 | 
				
			||||||
  state.target_state = STATE_INACTIVE;
 | 
					  state.target_state = STATE_INACTIVE;
 | 
				
			||||||
  state.error_source = 0;
 | 
					  state.error_source = 0;
 | 
				
			||||||
  precharge_timer = discharge_timer = powerground_calibration_timer = error_timer = eeprom_timer = 0;  
 | 
					  precharge_timer = discharge_timer = powerground_calibration_timer = error_timer = eeprom_timer = balancing_timer = 0;  
 | 
				
			||||||
  programming_mode = 0;
 | 
					  programming_mode = 0;
 | 
				
			||||||
  debugging_mode = 0;
 | 
					  debugging_mode = 0;
 | 
				
			||||||
 | 
					  balancing_state = 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void sm_update(){  
 | 
					void sm_update(){  
 | 
				
			||||||
@ -93,6 +97,7 @@ void sm_update(){
 | 
				
			|||||||
  sm_check_errors();
 | 
					  sm_check_errors();
 | 
				
			||||||
  sm_precharge_discharge_manager();
 | 
					  sm_precharge_discharge_manager();
 | 
				
			||||||
  //sm_calibrate_powerground();
 | 
					  //sm_calibrate_powerground();
 | 
				
			||||||
 | 
					  sm_balancing();
 | 
				
			||||||
  sm_powerground_manager();
 | 
					  sm_powerground_manager();
 | 
				
			||||||
  tmp1075_measure();
 | 
					  tmp1075_measure();
 | 
				
			||||||
  status_led_update();
 | 
					  status_led_update();
 | 
				
			||||||
@ -248,6 +253,44 @@ void sm_calibrate_powerground(){
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void sm_balancing(){
 | 
				
			||||||
 | 
					  if (balancing_timer < HAL_GetTick()){
 | 
				
			||||||
 | 
					    if (balancing_state){
 | 
				
			||||||
 | 
					      balancing_timer = HAL_GetTick() + 10000;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      uint8_t id_cell_lowest_voltage = 0;
 | 
				
			||||||
 | 
					      uint8_t num_of_cells_to_balance = 0;
 | 
				
			||||||
 | 
					      uint32_t channels = 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] - 20 < module.cellVoltages[id_cell_lowest_voltage]){
 | 
				
			||||||
 | 
					          channels |= 1 << i;
 | 
				
			||||||
 | 
					          num_of_cells_to_balance++;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (num_of_cells_to_balance == 0){
 | 
				
			||||||
 | 
					        amsStopBalancing();
 | 
				
			||||||
 | 
					        balancing_state = 0;
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      amsConfigBalancing(channels, 0xF);
 | 
				
			||||||
 | 
					      amsStartBalancing(0xF);
 | 
				
			||||||
 | 
					      balancing_state = 1;
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					      balancing_timer = HAL_GetTick() + 1000;
 | 
				
			||||||
 | 
					      balancing_state = 0;
 | 
				
			||||||
 | 
					      amsStopBalancing();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void sm_program_powerground(){
 | 
					void sm_program_powerground(){
 | 
				
			||||||
  if (programming_mode == 0)
 | 
					  if (programming_mode == 0)
 | 
				
			||||||
    return; 
 | 
					    return; 
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user