From 86b0bfc0fc946b5fec294f66114ef5c195f48e8a Mon Sep 17 00:00:00 2001 From: raduet Date: Tue, 30 Jun 2026 18:30:07 +0200 Subject: [PATCH] Remove FAKE_500V Everest workaround; use real setpoints on the bus (v1.0.24). --- Core/Inc/charger_config.h | 5 - Core/Inc/main.h | 2 +- Core/Src/psu_control.c | 6 +- Core/Src/serial.c | 21 +- Debug/CCSModuleSW30Web.bin | Bin 68756 -> 68692 bytes Debug/CCSModuleSW30Web.hex | 7066 +++++++++++++++++------------------ Debug/CCSModuleSW30Web.srec | 7064 +++++++++++++++++----------------- 7 files changed, 7066 insertions(+), 7098 deletions(-) diff --git a/Core/Inc/charger_config.h b/Core/Inc/charger_config.h index aa94dc5..db9f9b6 100755 --- a/Core/Inc/charger_config.h +++ b/Core/Inc/charger_config.h @@ -9,11 +9,6 @@ #define PSU_NUM 1 -/* Everest / стенд: запрос «500 В» на шине — реально на PSU задаются U/I ниже; статус может оставаться 500 В (serial.c). */ -#define FAKE_EVREQ_VOLTAGE_V 500u -#define FAKE_PSU_VOLTAGE_V 300u -#define FAKE_PSU_CURRENT_0P1A 10u - /* Fast discharge: PSU off/on cycle on step-down setpoint (unloaded bus). */ #define PSD_ENABLE 1u #define PSD_MAX_CMD_CURRENT_0P1A 20u /* 2.0 A */ diff --git a/Core/Inc/main.h b/Core/Inc/main.h index 0890cd3..998205a 100644 --- a/Core/Inc/main.h +++ b/Core/Inc/main.h @@ -27,7 +27,7 @@ extern "C" { /* USER CODE BEGIN EC */ #define FW_VERSION_MAJOR 1 #define FW_VERSION_MINOR 0 -#define FW_VERSION_PATCH 23 +#define FW_VERSION_PATCH 24 /* USER CODE END EC */ /* Exported macro ------------------------------------------------------------*/ diff --git a/Core/Src/psu_control.c b/Core/Src/psu_control.c index ed7dac2..c93df3d 100755 --- a/Core/Src/psu_control.c +++ b/Core/Src/psu_control.c @@ -283,11 +283,7 @@ void PSU_ReadWrite(){ uint8_t block_setpoint = PowerSetpoint_HasPending() || PowerSetpoint_IsBusy(); if (PSU0.ready && !block_setpoint) { - if (CONN.RequestedVoltage == FAKE_EVREQ_VOLTAGE_V) { - PSU_SetVoltageCurrent(0, (uint16_t)FAKE_PSU_VOLTAGE_V, (uint16_t)FAKE_PSU_CURRENT_0P1A); - } else { - PSU_SetVoltageCurrent(0, CONN.RequestedVoltage, CONN.RequestedCurrent); // Normal mode - } + PSU_SetVoltageCurrent(0, CONN.RequestedVoltage, CONN.RequestedCurrent); ED_Delay(CAN_DELAY); } } diff --git a/Core/Src/serial.c b/Core/Src/serial.c index 623a8ee..3f8fa37 100644 --- a/Core/Src/serial.c +++ b/Core/Src/serial.c @@ -47,7 +47,6 @@ 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 fake_500_voltage_mode = 0; static uint8_t everest_timed_out = 0; static uint8_t everest_timeout_warn_latched = 0; static uint8_t everest_timeout_stop_latched = 0; @@ -454,9 +453,6 @@ static void send_state(void) { CCS_State.DutyCycle = CP_GetDuty(); CCS_State.OutputEnabled = PSU0.CONT_enabled; CCS_State.MeasuredVoltage = (uint16_t)CONN.MeasuredVoltage; - if (fake_500_voltage_mode) { - CCS_State.MeasuredVoltage = FAKE_EVREQ_VOLTAGE_V; - } CCS_State.MeasuredCurrent = (uint16_t)CONN.MeasuredCurrent; CCS_State.Power = CCS_Power; CCS_State.Energy = CCS_Energy; @@ -534,20 +530,9 @@ ISR_FAST static void apply_command(uint8_t cmd, const uint8_t* payload, uint16_t } case CMD_E2M_SET_OUTPUT_VOLTAGE: { const e2m_set_output_t* p = (const e2m_set_output_t*)payload; - uint16_t psu_voltage_V; - uint16_t psu_current_0p1A; - if (p->voltage_V == FAKE_EVREQ_VOLTAGE_V) { - fake_500_voltage_mode = 1u; - psu_voltage_V = FAKE_PSU_VOLTAGE_V; - psu_current_0p1A = FAKE_PSU_CURRENT_0P1A; - } else { - fake_500_voltage_mode = 0u; - psu_voltage_V = p->voltage_V; - psu_current_0p1A = p->current_0p1A; - } - CONN.RequestedVoltage = psu_voltage_V; - CONN.WantedCurrent = psu_current_0p1A; - PowerSetpoint_OnCommand(psu_voltage_V, psu_current_0p1A); + CONN.RequestedVoltage = p->voltage_V; + CONN.WantedCurrent = p->current_0p1A; + PowerSetpoint_OnCommand(p->voltage_V, p->current_0p1A); break; } case CMD_E2M_ISOLATION_CONTROL: { diff --git a/Debug/CCSModuleSW30Web.bin b/Debug/CCSModuleSW30Web.bin index 9c8d3f8193f21149d3f1a0368168fb29c8bc1c0c..786f490190e32a22eddab34a0d0ae6dc2a55c126 100755 GIT binary patch delta 7710 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