|
|
|
|
@@ -105,6 +105,7 @@ modPowerElectronicsPackStateTypedef packState;
|
|
|
|
|
uint16_t LED_Blink_Delay;
|
|
|
|
|
|
|
|
|
|
uint64_t TIM_Clock;
|
|
|
|
|
uint64_t TIM3_Clock;
|
|
|
|
|
uint64_t Led_Timer;
|
|
|
|
|
uint64_t HTTP_timer;
|
|
|
|
|
uint8_t service_sw;
|
|
|
|
|
@@ -265,6 +266,7 @@ SPI_HandleTypeDef hspi3;
|
|
|
|
|
UART_HandleTypeDef huart2;
|
|
|
|
|
|
|
|
|
|
TIM_HandleTypeDef htim2;
|
|
|
|
|
TIM_HandleTypeDef htim3;
|
|
|
|
|
TIM_HandleTypeDef htim6;
|
|
|
|
|
|
|
|
|
|
uint8_t OVP_counter = 0;
|
|
|
|
|
@@ -280,6 +282,12 @@ uint64_t shunt_charging_contractor_clock = 0;
|
|
|
|
|
uint64_t can1_transmit_clock = 0;
|
|
|
|
|
uint64_t can2_transmit_clock = 0;
|
|
|
|
|
|
|
|
|
|
uint8_t* can1_transmit_queue = 0;
|
|
|
|
|
uint8_t* can2_transmit_queue = 0;
|
|
|
|
|
|
|
|
|
|
uint16_t can1_transmit_queue_size = 0;
|
|
|
|
|
uint16_t can2_transmit_queue_size = 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define __MA_WIN_SIZE (500)
|
|
|
|
|
#define __MA_ARRAY_QTY 2
|
|
|
|
|
@@ -297,6 +305,7 @@ static void MX_SPI1_Init(void);
|
|
|
|
|
//static void MX_SPI3_Init(void);
|
|
|
|
|
static void MX_USART2_UART_Init(void);
|
|
|
|
|
static void MX_TIM6_Init(void);
|
|
|
|
|
static void MX_TIM3_Init(void);
|
|
|
|
|
static void MX_TIM2_Init(void);
|
|
|
|
|
|
|
|
|
|
uint8_t SS_status(uint8_t type, Time_Struct* Event_time);
|
|
|
|
|
@@ -305,6 +314,10 @@ void Status_Clear(uint8_t Type);
|
|
|
|
|
void Save_data_to_Backup();
|
|
|
|
|
void Restore_shutdown_data();
|
|
|
|
|
void updateLimitsFromMem();
|
|
|
|
|
|
|
|
|
|
void addCanPacketToQueue(uint16_t id, uint8_t* data, uint8_t** queue, uint16_t* queueSize);
|
|
|
|
|
void transmitCanPacketFromQueue(uint8_t** queue, uint16_t* queueSize, CAN_HandleTypeDef* hcan);
|
|
|
|
|
|
|
|
|
|
void modem_init();
|
|
|
|
|
|
|
|
|
|
uint8_t SS_param(Battery_Data_Struct* Source_Data);
|
|
|
|
|
@@ -361,30 +374,30 @@ void usbTIM(uint8_t OnOff) {
|
|
|
|
|
|
|
|
|
|
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
|
|
|
|
|
{
|
|
|
|
|
// testsi++;
|
|
|
|
|
if (htim->Instance == TIM2)
|
|
|
|
|
{
|
|
|
|
|
TimeoutMng();
|
|
|
|
|
TIM_Clock++;
|
|
|
|
|
}
|
|
|
|
|
else if (htim->Instance == TIM3)
|
|
|
|
|
{
|
|
|
|
|
CAN_TransmitRTR(0x500, 8, &hcan2);
|
|
|
|
|
|
|
|
|
|
if (TIM3_Clock % 2)
|
|
|
|
|
{
|
|
|
|
|
transmitCanPacketFromQueue(&can1_transmit_queue, &can1_transmit_queue_size, &hcan1);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
transmitCanPacketFromQueue(&can2_transmit_queue, &can2_transmit_queue_size, &hcan2);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (htim->Instance == TIM2)
|
|
|
|
|
TIM3_Clock++;
|
|
|
|
|
}
|
|
|
|
|
else if (htim->Instance == TIM6)
|
|
|
|
|
{
|
|
|
|
|
TimeoutMng();
|
|
|
|
|
TIM_Clock++;
|
|
|
|
|
}
|
|
|
|
|
else if (htim->Instance == TIM6)
|
|
|
|
|
{
|
|
|
|
|
libPacketTimerFunc();
|
|
|
|
|
// HAL_TIM_Base_Stop_IT(&htim6);
|
|
|
|
|
// HAL_GPIO_TogglePin(HL3_GPIO_Port, HL3_Pin);
|
|
|
|
|
// if(USB_On_Flag){
|
|
|
|
|
// if(USB_On_Flag){
|
|
|
|
|
modUARTTask();
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//TimeoutMng();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// HAL_TIM_Base_Start_IT(&htim6);
|
|
|
|
|
libPacketTimerFunc();
|
|
|
|
|
modUARTTask();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -1270,30 +1283,41 @@ void transmitCan2Packet()
|
|
|
|
|
|
|
|
|
|
uint8_t buffer[8] = {0};
|
|
|
|
|
|
|
|
|
|
// sending heartbeat command
|
|
|
|
|
memset(buffer, 0xFF, sizeof(buffer));
|
|
|
|
|
CAN_Transmit(0x500, buffer, 8, &hcan2);
|
|
|
|
|
|
|
|
|
|
// sending common current and voltage command
|
|
|
|
|
memcpy(buffer, &packState.packCurrent, sizeof(packState.packCurrent));
|
|
|
|
|
memcpy(buffer + 4, &packState.packVoltage, sizeof(packState.packVoltage));
|
|
|
|
|
CAN_Transmit(0x501, buffer, 8, &hcan2);
|
|
|
|
|
addCanPacketToQueue(0x501, buffer, &can2_transmit_queue, &can2_transmit_queue_size);
|
|
|
|
|
|
|
|
|
|
// sending charge voltages (start, end) command
|
|
|
|
|
memcpy(buffer, &generalConfig->cellLCSoftUnderVoltage, sizeof(generalConfig->cellLCSoftUnderVoltage));
|
|
|
|
|
memcpy(buffer + 4, &generalConfig->cellSoftOverVoltage, sizeof(generalConfig->cellSoftOverVoltage));
|
|
|
|
|
CAN_Transmit(0x502, buffer, 8, &hcan2);
|
|
|
|
|
const float startVoltage = generalConfig->cellHardUnderVoltage * generalConfig->noOfCellsSeries;
|
|
|
|
|
const float endVoltage = generalConfig->cellHardOverVoltage * generalConfig->noOfCellsSeries;
|
|
|
|
|
memcpy(buffer, &startVoltage, sizeof(startVoltage));
|
|
|
|
|
memcpy(buffer + 4, &endVoltage, sizeof(endVoltage));
|
|
|
|
|
addCanPacketToQueue(0x502, buffer, &can2_transmit_queue, &can2_transmit_queue_size);
|
|
|
|
|
|
|
|
|
|
// sending fault voltages (under, over) command
|
|
|
|
|
memcpy(buffer, &generalConfig->cellHardUnderVoltage, sizeof(generalConfig->cellHardUnderVoltage));
|
|
|
|
|
memcpy(buffer + 4, &generalConfig->cellHardOverVoltage, sizeof(generalConfig->cellHardOverVoltage));
|
|
|
|
|
CAN_Transmit(0x503, buffer, 8, &hcan2);
|
|
|
|
|
const float startFaultVoltage = generalConfig->cellLCSoftUnderVoltage * generalConfig->noOfCellsSeries;
|
|
|
|
|
const float endFaultVoltage = generalConfig->cellSoftOverVoltage * generalConfig->noOfCellsSeries;
|
|
|
|
|
memcpy(buffer, &startFaultVoltage, sizeof(startFaultVoltage));
|
|
|
|
|
memcpy(buffer + 4, &endFaultVoltage, sizeof(endFaultVoltage));
|
|
|
|
|
addCanPacketToQueue(0x503, buffer, &can2_transmit_queue, &can2_transmit_queue_size);
|
|
|
|
|
|
|
|
|
|
// sending charge starting and ending command
|
|
|
|
|
float chargeStartingCurrent = 15; // TODO move to generalConfig
|
|
|
|
|
float chargeEndingCurrent = 5; // TODO move to generalConfig
|
|
|
|
|
|
|
|
|
|
memcpy(buffer, &chargeStartingCurrent, sizeof(chargeStartingCurrent));
|
|
|
|
|
memcpy(buffer + 4, &chargeEndingCurrent, sizeof(chargeEndingCurrent));
|
|
|
|
|
addCanPacketToQueue(0x504, buffer, &can2_transmit_queue, &can2_transmit_queue_size);
|
|
|
|
|
|
|
|
|
|
// sending charge permission, charge ending, charge/discharge state and table current command
|
|
|
|
|
const uint8_t chargeAllowed = packState.chargeAllowed ? 0xFF : 0x00;
|
|
|
|
|
const uint8_t chargeEnding = packState.SoC > 95 ? 0xFF : 0x00;
|
|
|
|
|
const uint8_t chargeSwitchState = charge_switch_state ? 0xFF : 0x00;
|
|
|
|
|
|
|
|
|
|
// sending charge current command
|
|
|
|
|
const int socIndex = getIndexBySoc();
|
|
|
|
|
const int temperatureIndex = getIndexByTemperature();
|
|
|
|
|
float tableCurrent = 0;
|
|
|
|
|
float chargeEndingCurrent = 5; // TODO move to generalConfig
|
|
|
|
|
|
|
|
|
|
if (socIndex != -1 && temperatureIndex != -1)
|
|
|
|
|
{
|
|
|
|
|
@@ -1302,20 +1326,38 @@ void transmitCan2Packet()
|
|
|
|
|
tableCurrent = pureCurrent ? tableValue : generalConfig->batteryCapacity * tableValue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
memcpy(buffer, &tableCurrent, sizeof(tableCurrent));
|
|
|
|
|
memcpy(buffer + 4, &chargeEndingCurrent, sizeof(chargeEndingCurrent));
|
|
|
|
|
CAN_Transmit(0x504, buffer, 8, &hcan2);
|
|
|
|
|
|
|
|
|
|
// sending charge permission, charge ending and charge/discharge state command
|
|
|
|
|
const uint8_t chargeAllowed = packState.chargeAllowed ? 0xFF : 0x00;
|
|
|
|
|
const uint8_t chargeEnding = packState.SoC > 95 ? 0xFF : 0x00;
|
|
|
|
|
const uint8_t chargeSwitchState = charge_switch_state ? 0xFF : 0x00;
|
|
|
|
|
|
|
|
|
|
memset(buffer, '\0', sizeof(buffer));
|
|
|
|
|
memcpy(buffer + 0, &chargeAllowed, sizeof(chargeAllowed));
|
|
|
|
|
memcpy(buffer + 1, &chargeEnding, sizeof(chargeEnding));
|
|
|
|
|
memcpy(buffer + 2, &chargeSwitchState, sizeof(chargeSwitchState));
|
|
|
|
|
CAN_Transmit(0x505, buffer, 8, &hcan2);
|
|
|
|
|
memcpy(buffer + 4, &tableCurrent, sizeof(tableCurrent));
|
|
|
|
|
addCanPacketToQueue(0x505, buffer, &can2_transmit_queue, &can2_transmit_queue_size);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void addCanPacketToQueue(uint16_t id, uint8_t* data, uint8_t** queue, uint16_t* queueSize)
|
|
|
|
|
{
|
|
|
|
|
*queueSize += 10;
|
|
|
|
|
*queue = (uint8_t*)realloc(*queue, *queueSize);
|
|
|
|
|
|
|
|
|
|
memcpy(*queue + *queueSize - 10, &id, 2);
|
|
|
|
|
memcpy(*queue + *queueSize - 8, data, 8);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void transmitCanPacketFromQueue(uint8_t** queue, uint16_t* queueSize, CAN_HandleTypeDef* hcan)
|
|
|
|
|
{
|
|
|
|
|
if (*queueSize < 10)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
uint16_t id = 0;
|
|
|
|
|
uint8_t data[8] = {};
|
|
|
|
|
|
|
|
|
|
memcpy(&id, *queue + *queueSize - 10, 2);
|
|
|
|
|
memcpy(data, *queue + *queueSize - 8, 8);
|
|
|
|
|
|
|
|
|
|
*queueSize -= 10;
|
|
|
|
|
*queue = (uint8_t*)realloc(*queue, *queueSize);
|
|
|
|
|
|
|
|
|
|
CAN_Transmit(id, data, 8, hcan);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void modem_init(){
|
|
|
|
|
@@ -2112,6 +2154,7 @@ void SD_Update_Filename(SD_CARD_Global_Struct* source ){
|
|
|
|
|
void Total_DeInit(){
|
|
|
|
|
MX_FATFS_DeInit();
|
|
|
|
|
HAL_TIM_Base_DeInit(&htim2);
|
|
|
|
|
HAL_TIM_Base_DeInit(&htim3);
|
|
|
|
|
HAL_TIM_Base_DeInit(&htim6);
|
|
|
|
|
MX_USB_DEVICE_DeInit();
|
|
|
|
|
HAL_UART_DeInit(&huart2);
|
|
|
|
|
@@ -2201,7 +2244,9 @@ int main(void)
|
|
|
|
|
// MX_SPI3_Init();
|
|
|
|
|
MX_USART2_UART_Init();
|
|
|
|
|
MX_USB_DEVICE_Init();
|
|
|
|
|
|
|
|
|
|
MX_TIM6_Init();
|
|
|
|
|
MX_TIM3_Init();
|
|
|
|
|
MX_TIM2_Init();
|
|
|
|
|
|
|
|
|
|
MX_FATFS_Init();
|
|
|
|
|
@@ -2228,6 +2273,7 @@ int main(void)
|
|
|
|
|
Battery_Serial = generalConfig->serialNumber;
|
|
|
|
|
|
|
|
|
|
HAL_TIM_Base_Start_IT(&htim6);
|
|
|
|
|
HAL_TIM_Base_Start_IT(&htim3);
|
|
|
|
|
HAL_TIM_Base_Start_IT(&htim2);
|
|
|
|
|
|
|
|
|
|
SimStatus_Struct.Status_flag[__STATUS_CHARGING_DISCONNECT]=1;
|
|
|
|
|
@@ -2545,6 +2591,40 @@ static void MX_TIM2_Init(void)
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void MX_TIM3_Init(void)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
/* USER CODE BEGIN TIM3_Init 0 */
|
|
|
|
|
|
|
|
|
|
/* USER CODE END TIM3_Init 0 */
|
|
|
|
|
|
|
|
|
|
TIM_MasterConfigTypeDef sMasterConfig = {0};
|
|
|
|
|
|
|
|
|
|
/* USER CODE BEGIN TIM3_Init 1 */
|
|
|
|
|
|
|
|
|
|
/* USER CODE END TIM3_Init 1 */
|
|
|
|
|
htim3.Instance = TIM3;
|
|
|
|
|
htim3.Init.Prescaler = 71;
|
|
|
|
|
htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
|
|
|
|
|
htim3.Init.Period = 999;
|
|
|
|
|
htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
|
|
|
|
|
htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
|
|
|
|
|
if (HAL_TIM_Base_Init(&htim3) != HAL_OK)
|
|
|
|
|
{
|
|
|
|
|
Error_Handler();
|
|
|
|
|
}
|
|
|
|
|
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
|
|
|
|
|
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
|
|
|
|
|
if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
|
|
|
|
|
{
|
|
|
|
|
Error_Handler();
|
|
|
|
|
}
|
|
|
|
|
/* USER CODE BEGIN TIM3_Init 2 */
|
|
|
|
|
|
|
|
|
|
/* USER CODE END TIM3_Init 2 */
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void MX_TIM6_Init(void)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|