Compare commits

6 Commits

19 changed files with 24749 additions and 24508 deletions

BIN
.DS_Store vendored

Binary file not shown.

File diff suppressed because one or more lines are too long

BIN
Core/.DS_Store vendored

Binary file not shown.

View File

@@ -43,7 +43,7 @@ extern "C" {
/* USER CODE BEGIN EC */
#define FW_VERSION_MAJOR 0x01
#define FW_VERSION_MINOR 0x00
#define FW_VERSION_PATCH 0x02
#define FW_VERSION_PATCH 10
/* USER CODE END EC */
/* Exported macro ------------------------------------------------------------*/

BIN
Core/Src/.DS_Store vendored

Binary file not shown.

View File

@@ -7,6 +7,7 @@
ChargingConnector_t CONN;
CONN_State_t connectorState;
extern uint8_t config_initialized;
void CONN_Init(){
@@ -47,7 +48,7 @@ void CONN_Task(){
return;
}
if (connectorState == Unknown) {
if (connectorState == Unknown && config_initialized) {
CONN_SetState(Unplugged);
} else if (connectorState == Disabled && CONN.chargingError == CONN_NO_ERROR) {
CONN_SetState(Unplugged);

View File

@@ -2,13 +2,50 @@
#include "adc.h"
#include "board.h"
#include "tim.h"
#include "debug.h"
#include <stdint.h>
#define MAX_DUTY 450
#define CP_EMA_ALPHA_Q8 38
#define CP_DEBOUNCE_MS_DEFAULT 10
#define CP_DEBOUNCE_MS_F 60
#define CP_DEBOUNCE_MS_F_LOW_DUTY 100
#define CP_LOW_DUTY_THRESHOLD_PERCENT 10
#define CP_A_ENTER_MV 11000
#define CP_A_EXIT_MV 10000
#define CP_B_ENTER_LOW_MV 8000
#define CP_B_ENTER_HIGH_MV 10000
#define CP_B_EXIT_LOW_MV 7500
#define CP_B_EXIT_HIGH_MV 10500
#define CP_C_ENTER_LOW_MV 5000
#define CP_C_ENTER_HIGH_MV 7000
#define CP_C_EXIT_LOW_MV 4500
#define CP_C_EXIT_HIGH_MV 7500
#define CP_D_ENTER_LOW_MV 2000
#define CP_D_ENTER_HIGH_MV 4000
#define CP_D_EXIT_LOW_MV 1500
#define CP_D_EXIT_HIGH_MV 4500
#define CP_E_ENTER_LOW_MV -1000
#define CP_E_ENTER_HIGH_MV 2000
#define CP_E_EXIT_LOW_MV -1500
#define CP_E_EXIT_HIGH_MV 2500
#define CP_F_ENTER_MV -11500
#define CP_F_EXIT_MV -10500
static int32_t cp_voltage_mv = 0;
static int32_t cp_voltage_filt_mv = 0;
static uint8_t cp_filter_initialized = 0;
static uint8_t cp_duty = 0;
CP_State_t fake_cp_state = EV_STATE_ACQUIRING;
static CP_State_t cp_stable_state = EV_STATE_ACQUIRING;
static CP_State_t cp_candidate_state = EV_STATE_ACQUIRING;
static uint32_t cp_candidate_since_ms = 0;
static uint32_t CP_ReadAdcChannel(uint32_t ch) {
uint32_t adc = 0;
@@ -23,6 +60,64 @@ static uint32_t CP_ReadAdcChannel(uint32_t ch) {
}
#define VREFINT_CAL_ADDR ((uint16_t*)0x1FFFF7BA) // для STM32F1!
static uint8_t CP_IsInRange(int32_t v, int32_t lo, int32_t hi) {
return (v >= lo && v <= hi) ? 1u : 0u;
}
static int32_t CP_ApplyEma(int32_t raw_mv) {
if (!cp_filter_initialized) {
cp_voltage_filt_mv = raw_mv;
cp_filter_initialized = 1;
return cp_voltage_filt_mv;
}
cp_voltage_filt_mv += ((raw_mv - cp_voltage_filt_mv) * CP_EMA_ALPHA_Q8) / 256;
return cp_voltage_filt_mv;
}
static CP_State_t CP_ClassifyWithHysteresis(int32_t v, CP_State_t prev) {
switch (prev) {
case EV_STATE_A_IDLE:
if (v >= CP_A_EXIT_MV) return EV_STATE_A_IDLE;
break;
case EV_STATE_B_CONN_PREP:
if (CP_IsInRange(v, CP_B_EXIT_LOW_MV, CP_B_EXIT_HIGH_MV)) return EV_STATE_B_CONN_PREP;
break;
case EV_STATE_C_CONN_ACTIVE:
if (CP_IsInRange(v, CP_C_EXIT_LOW_MV, CP_C_EXIT_HIGH_MV)) return EV_STATE_C_CONN_ACTIVE;
break;
case EV_STATE_D_CONN_ACT_VENT:
if (CP_IsInRange(v, CP_D_EXIT_LOW_MV, CP_D_EXIT_HIGH_MV)) return EV_STATE_D_CONN_ACT_VENT;
break;
case EV_STATE_E_NO_POWER:
if (CP_IsInRange(v, CP_E_EXIT_LOW_MV, CP_E_EXIT_HIGH_MV)) return EV_STATE_E_NO_POWER;
break;
case EV_STATE_F_ERROR:
if (v <= CP_F_EXIT_MV) return EV_STATE_F_ERROR;
break;
default:
break;
}
if (v >= CP_A_ENTER_MV) return EV_STATE_A_IDLE;
if (CP_IsInRange(v, CP_B_ENTER_LOW_MV, CP_B_ENTER_HIGH_MV)) return EV_STATE_B_CONN_PREP;
if (CP_IsInRange(v, CP_C_ENTER_LOW_MV, CP_C_ENTER_HIGH_MV)) return EV_STATE_C_CONN_ACTIVE;
if (CP_IsInRange(v, CP_D_ENTER_LOW_MV, CP_D_ENTER_HIGH_MV)) return EV_STATE_D_CONN_ACT_VENT;
if (CP_IsInRange(v, CP_E_ENTER_LOW_MV, CP_E_ENTER_HIGH_MV)) return EV_STATE_E_NO_POWER;
if (v <= CP_F_ENTER_MV) return EV_STATE_F_ERROR;
return EV_STATE_ACQUIRING;
}
static uint32_t CP_GetDebounceMs(CP_State_t next_state) {
if (next_state == EV_STATE_F_ERROR) {
if (cp_duty <= CP_LOW_DUTY_THRESHOLD_PERCENT) {
return CP_DEBOUNCE_MS_F_LOW_DUTY;
}
return CP_DEBOUNCE_MS_F;
}
return CP_DEBOUNCE_MS_DEFAULT;
}
static int32_t CP_ReadVoltageMv(void)
{
uint32_t adc = 0;
@@ -75,29 +170,30 @@ int32_t CP_GetVoltage(void) {
}
CP_State_t CP_GetState(void) {
int32_t voltage_real = cp_voltage_mv;
int32_t voltage_real = cp_voltage_filt_mv;
uint32_t now = HAL_GetTick();
if(fake_cp_state != EV_STATE_ACQUIRING) {
return fake_cp_state;
}
if (voltage_real >= (12000-1000)) {
return EV_STATE_A_IDLE;
} else if (voltage_real >= (9000-1000) && voltage_real <= (9000+1000)) {
return EV_STATE_B_CONN_PREP;
} else if (voltage_real >= (6000-1000) && voltage_real <= (6000+1000)) {
return EV_STATE_C_CONN_ACTIVE;
} else if (voltage_real >= (3000-1000) && voltage_real <= (3000 + 1000)) {
return EV_STATE_D_CONN_ACT_VENT;
} else if (voltage_real >= (0-1000) && voltage_real <= (0+2000)){
return EV_STATE_E_NO_POWER;
} else if (voltage_real <= (-12000+1000)) {
return EV_STATE_F_ERROR;
CP_State_t instant_state = CP_ClassifyWithHysteresis(voltage_real, cp_stable_state);
if (instant_state == cp_stable_state) {
cp_candidate_state = cp_stable_state;
cp_candidate_since_ms = now;
} else {
return EV_STATE_ACQUIRING;
if (cp_candidate_state != instant_state) {
cp_candidate_state = instant_state;
cp_candidate_since_ms = now;
} else if ((now - cp_candidate_since_ms) >= CP_GetDebounceMs(cp_candidate_state)) {
cp_stable_state = cp_candidate_state;
}
}
return cp_stable_state;
}
void CP_Loop(void) {
(void)CP_GetState();
}
@@ -109,6 +205,7 @@ void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)
return;
}
cp_voltage_mv = CP_ReadVoltageMv();
(void)CP_ApplyEma(cp_voltage_mv);
ADC_Unlock();
}
}

View File

@@ -261,9 +261,12 @@ void PSU_ReadWrite(){
}
CONN.RequestedPower = CONN.RequestedCurrent * CONN.RequestedVoltage / 10;
if(PSU0.ready){
if (CONN.RequestedVoltage == 500) { // fake
PSU_SetVoltageCurrent(0, 300, 10); // Normal mode
}else{
PSU_SetVoltageCurrent(0, CONN.RequestedVoltage, CONN.RequestedCurrent); // Normal mode
}
ED_Delay(CAN_DELAY);
if(CONN.MeasuredVoltage>490) PSU0.hv_mode = 1;
}

View File

@@ -9,6 +9,7 @@
#include "psu_control.h"
extern UART_HandleTypeDef huart3;
extern uint8_t config_initialized;
static void send_state(void);
static void CCS_SendResetReason(void);
@@ -27,10 +28,10 @@ uint8_t ev_enable_output = 0;
#define CMD_INTERVAL 10
#define MAX_TX_BUFFER_SIZE 256
#define MAX_RX_BUFFER_SIZE 256
#define EVEREST_TIMEOUT_MS 2000
static uint8_t rx_buffer[MAX_RX_BUFFER_SIZE];
static uint8_t tx_buffer[MAX_TX_BUFFER_SIZE];
static uint8_t rx_armed = 0;
uint8_t ESTOP = 0;
uint8_t REPLUG = 0;
@@ -39,6 +40,8 @@ static uint8_t enabled = 0;
static uint8_t pwm_duty_percent = 100;
uint8_t isolation_enable = 0;
static uint32_t last_host_seen = 0;
static uint8_t everest_timed_out = 0;
static uint32_t last_everest_timeout_log_tick = 0;
static CP_State_t cp_state_buffer = EV_STATE_ACQUIRING;
CCS_State_t CCS_State;
@@ -52,7 +55,6 @@ void CCS_RxEventCallback(UART_HandleTypeDef *huart, uint16_t size) {
if (huart != &huart3) {
return;
}
rx_armed = 0;
if (size > 0 && size <= sizeof(rx_buffer)) {
process_received_packet(rx_buffer, size);
}
@@ -64,10 +66,8 @@ void CCS_SerialLoop(void) {
static uint32_t replug_watchdog1_tick = 0;
static uint32_t last_state_sent = 0;
if (!rx_armed && HAL_UART_GetState(&huart3) == HAL_UART_STATE_READY) {
if (HAL_UARTEx_ReceiveToIdle_IT(&huart3, rx_buffer, sizeof(rx_buffer)) == HAL_OK) {
rx_armed = 1;
}
if (HAL_UART_GetState(&huart3) == HAL_UART_STATE_READY) {
(void)HAL_UARTEx_ReceiveToIdle_IT(&huart3, rx_buffer, sizeof(rx_buffer));
}
/* Read CP once per loop and use buffered value below. */
@@ -108,6 +108,11 @@ void CCS_SerialLoop(void) {
(void)replug_watchdog_tick;
(void)replug_watchdog1_tick;
if (!config_initialized) {
// Keep connector in Unknown until host sends valid SET_CONFIG.
RELAY_Write(RELAY_CP, 1);
CONN_SetState(Unknown);
} else {
switch(CCS_ConnectorState){
case CCS_DISABLED:
RELAY_Write(RELAY_CP, 0);
@@ -177,12 +182,28 @@ void CCS_SerialLoop(void) {
}
break;
}
}
if (last_host_seen > 0 && (HAL_GetTick() - last_host_seen) > 500) {
// If Everest timeout happened, keep safe-state and limit log frequency.
// The safe-state must remain until we receive a valid packet from the host.
if (everest_timed_out) {
if (last_everest_timeout_log_tick == 0 ||
(HAL_GetTick() - last_everest_timeout_log_tick) >= EVEREST_TIMEOUT_MS) {
log_printf(LOG_ERR, "Everest timeout\n");
last_everest_timeout_log_tick = HAL_GetTick();
}
CONN.EnableOutput = 0;
CCS_EvseState = Unknown;
CP_SetDuty(100);
} else if (last_host_seen > 0 && (HAL_GetTick() - last_host_seen) > EVEREST_TIMEOUT_MS) {
log_printf(LOG_ERR, "Everest timeout\n");
everest_timed_out = 1;
last_host_seen = HAL_GetTick(); // reset after the first timeout
last_everest_timeout_log_tick = HAL_GetTick();
CONN.EnableOutput = 0;
CCS_EvseState = Unknown;
CP_SetDuty(100);
} else {
if (last_cmd == CMD_STOP) {
CONN.EnableOutput = 0;
@@ -287,6 +308,7 @@ static void send_state(void) {
CCS_State.DutyCycle = CP_GetDuty();
CCS_State.OutputEnabled = PSU0.CONT_enabled;
CCS_State.MeasuredVoltage = (uint16_t)CONN.MeasuredVoltage;
if (CONN.RequestedVoltage == 500) CCS_State.MeasuredVoltage = 500; // fake
CCS_State.MeasuredCurrent = (uint16_t)CONN.MeasuredCurrent;
CCS_State.Power = CCS_Power;
CCS_State.Energy = CCS_Energy;
@@ -327,6 +349,8 @@ static uint16_t expected_payload_len(uint8_t cmd) {
static void apply_command(uint8_t cmd, const uint8_t* payload, uint16_t payload_len) {
(void)payload_len;
last_host_seen = HAL_GetTick();
everest_timed_out = 0;
last_everest_timeout_log_tick = 0;
switch (cmd) {
case CMD_E2M_PWM_DUTY: {
const e2m_pwm_duty_t* p = (const e2m_pwm_duty_t*)payload;

View File

@@ -61,10 +61,6 @@ void MX_TIM3_Init(void)
{
Error_Handler();
}
if (HAL_TIM_OC_Init(&htim3) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
@@ -79,12 +75,6 @@ void MX_TIM3_Init(void)
{
Error_Handler();
}
sConfigOC.OCMode = TIM_OCMODE_TIMING;
sConfigOC.Pulse = 1;
if (HAL_TIM_OC_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN TIM3_Init 2 */
/* USER CODE END TIM3_Init 2 */

View File

@@ -59,7 +59,6 @@ defined in linker script */
.weak Reset_Handler
.type Reset_Handler, %function
Reset_Handler:
ldr sp, =_estack /* set stack pointer */
/* Call the clock system initialization function.*/
bl SystemInit
@@ -253,7 +252,6 @@ g_pfnVectors:
.word 0
.word BootRAM /* @0x1E0. This is for boot in RAM mode for
STM32F10x Connectivity line Devices. */
.word 0x66666666 /* Reserved for OpenBLT checksum*/
/*******************************************************************************
*

Binary file not shown.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +1,5 @@
../Core/Src/charger_control.c:11:6:CONN_Init 1
../Core/Src/charger_control.c:19:6:CONN_Loop 6
../Core/Src/charger_control.c:41:6:CONN_Task 5
../Core/Src/charger_control.c:57:6:CONN_SetState 16
../Core/Src/charger_control.c:83:6:CONN_PrintChargingTotal 1
../Core/Src/charger_control.c:12:6:CONN_Init 1
../Core/Src/charger_control.c:20:6:CONN_Loop 6
../Core/Src/charger_control.c:42:6:CONN_Task 6
../Core/Src/charger_control.c:58:6:CONN_SetState 16
../Core/Src/charger_control.c:84:6:CONN_PrintChargingTotal 1

View File

@@ -1,9 +1,13 @@
../Core/Src/cp.c:13:17:CP_ReadAdcChannel 1
../Core/Src/cp.c:26:16:CP_ReadVoltageMv 1
../Core/Src/cp.c:39:6:CP_Init 1
../Core/Src/cp.c:56:6:CP_SetDuty 1
../Core/Src/cp.c:69:9:CP_GetDuty 1
../Core/Src/cp.c:73:9:CP_GetVoltage 1
../Core/Src/cp.c:77:12:CP_GetState 12
../Core/Src/cp.c:101:6:CP_Loop 1
../Core/Src/cp.c:105:6:HAL_TIM_OC_DelayElapsedCallback 4
../Core/Src/cp.c:50:17:CP_ReadAdcChannel 1
../Core/Src/cp.c:63:16:CP_IsInRange 3
../Core/Src/cp.c:67:16:CP_ApplyEma 3
../Core/Src/cp.c:78:19:CP_ClassifyWithHysteresis 19
../Core/Src/cp.c:111:17:CP_GetDebounceMs 3
../Core/Src/cp.c:121:16:CP_ReadVoltageMv 1
../Core/Src/cp.c:134:6:CP_Init 1
../Core/Src/cp.c:151:6:CP_SetDuty 1
../Core/Src/cp.c:164:9:CP_GetDuty 1
../Core/Src/cp.c:168:9:CP_GetVoltage 1
../Core/Src/cp.c:172:12:CP_GetState 5
../Core/Src/cp.c:197:6:CP_Loop 1
../Core/Src/cp.c:201:6:HAL_TIM_OC_DelayElapsedCallback 4

View File

@@ -8,5 +8,5 @@
../Core/Src/psu_control.c:175:6:PSU_SetVoltageCurrent 5
../Core/Src/psu_control.c:202:6:PSU_SendCmd 4
../Core/Src/psu_control.c:238:10:max 2
../Core/Src/psu_control.c:243:6:PSU_ReadWrite 5
../Core/Src/psu_control.c:276:6:PSU_Task 41
../Core/Src/psu_control.c:243:6:PSU_ReadWrite 6
../Core/Src/psu_control.c:279:6:PSU_Task 41

View File

@@ -1,15 +1,15 @@
../Drivers/CMSIS/Include/core_cm3.h:1762:34:__NVIC_SystemReset 1
../Core/Src/serial.c:51:6:CCS_RxEventCallback 4
../Core/Src/serial.c:61:6:CCS_SerialLoop 41
../Core/Src/serial.c:206:6:CCS_Init 1
../Core/Src/serial.c:218:17:crc16_ibm 4
../Core/Src/serial.c:233:17:CCS_BuildPacket 4
../Core/Src/serial.c:249:13:CCS_SendPacket 2
../Core/Src/serial.c:257:13:CCS_SendResetReason 1
../Core/Src/serial.c:261:6:CCS_SendEmergencyStop 1
../Core/Src/serial.c:265:6:CCS_SendStart 1
../Core/Src/serial.c:269:13:CCS_CalculateEnergy 2
../Core/Src/serial.c:284:13:send_state 2
../Core/Src/serial.c:311:17:expected_payload_len 11
../Core/Src/serial.c:327:13:apply_command 13
../Core/Src/serial.c:394:16:process_received_packet 6
../Core/Src/serial.c:54:6:CCS_RxEventCallback 4
../Core/Src/serial.c:63:6:CCS_SerialLoop 43
../Core/Src/serial.c:227:6:CCS_Init 1
../Core/Src/serial.c:239:17:crc16_ibm 4
../Core/Src/serial.c:254:17:CCS_BuildPacket 4
../Core/Src/serial.c:270:13:CCS_SendPacket 2
../Core/Src/serial.c:278:13:CCS_SendResetReason 1
../Core/Src/serial.c:282:6:CCS_SendEmergencyStop 1
../Core/Src/serial.c:286:6:CCS_SendStart 1
../Core/Src/serial.c:290:13:CCS_CalculateEnergy 2
../Core/Src/serial.c:305:13:send_state 3
../Core/Src/serial.c:333:17:expected_payload_len 11
../Core/Src/serial.c:349:13:apply_command 13
../Core/Src/serial.c:418:16:process_received_packet 6

View File

@@ -1,5 +1,5 @@
../Core/Src/tim.c:31:6:MX_TIM3_Init 8
../Core/Src/tim.c:95:6:MX_TIM4_Init 8
../Core/Src/tim.c:157:6:HAL_TIM_Base_MspInit 3
../Core/Src/tim.c:187:6:HAL_TIM_MspPostInit 3
../Core/Src/tim.c:235:6:HAL_TIM_Base_MspDeInit 3
../Core/Src/tim.c:31:6:MX_TIM3_Init 6
../Core/Src/tim.c:85:6:MX_TIM4_Init 8
../Core/Src/tim.c:147:6:HAL_TIM_Base_MspInit 3
../Core/Src/tim.c:177:6:HAL_TIM_MspPostInit 3
../Core/Src/tim.c:225:6:HAL_TIM_Base_MspDeInit 3