forked from achamaikin/CCSModuleSW30Web
Replace hv_mode gate with CS60 hv_limit logic for unrestricted HV setpoints (v1.0.25).
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -9,6 +9,14 @@
|
|||||||
|
|
||||||
#define PSU_NUM 1
|
#define PSU_NUM 1
|
||||||
|
|
||||||
|
/* Dynamic LV clamp (CS60 hv_limit): active only on overload at low bus voltage. */
|
||||||
|
#define PSU_LV_CLAMP_V 499u
|
||||||
|
#define PSU_HV_LIMIT_ON_THRESHOLD 480u
|
||||||
|
#define PSU_HV_LIMIT_OFF_THRESHOLD 495u
|
||||||
|
#define PSU_HV_SWITCH_DELAY_MS 1000u
|
||||||
|
#define PSU_HV_LOAD_CURRENT 300u /* 30.0 A, MeasuredCurrent is 0.1 A/bit */
|
||||||
|
#define PSU_HV_LIMIT_MAX_COUNT 3u
|
||||||
|
|
||||||
/* Fast discharge: PSU off/on cycle on step-down setpoint (unloaded bus). */
|
/* Fast discharge: PSU off/on cycle on step-down setpoint (unloaded bus). */
|
||||||
#define PSD_ENABLE 1u
|
#define PSD_ENABLE 1u
|
||||||
#define PSD_MAX_CMD_CURRENT_0P1A 20u /* 2.0 A */
|
#define PSD_MAX_CMD_CURRENT_0P1A 20u /* 2.0 A */
|
||||||
|
|||||||
@@ -68,6 +68,9 @@ typedef struct{
|
|||||||
uint16_t WantedCurrent; //0.1A/bit
|
uint16_t WantedCurrent; //0.1A/bit
|
||||||
CONN_Error_t chargingError; // 0 if okay
|
CONN_Error_t chargingError; // 0 if okay
|
||||||
uint8_t EvConnected;
|
uint8_t EvConnected;
|
||||||
|
uint8_t hv_limit; // Limits PSU voltage to LV range when set
|
||||||
|
uint32_t hv_tick; // Timer for delayed HV limit switching
|
||||||
|
uint8_t hv_limit_count; // Anti-chatter counter for LV limit switching
|
||||||
|
|
||||||
} ChargingConnector_t;
|
} ChargingConnector_t;
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -27,7 +27,7 @@ extern "C" {
|
|||||||
/* USER CODE BEGIN EC */
|
/* USER CODE BEGIN EC */
|
||||||
#define FW_VERSION_MAJOR 1
|
#define FW_VERSION_MAJOR 1
|
||||||
#define FW_VERSION_MINOR 0
|
#define FW_VERSION_MINOR 0
|
||||||
#define FW_VERSION_PATCH 24
|
#define FW_VERSION_PATCH 25
|
||||||
/* USER CODE END EC */
|
/* USER CODE END EC */
|
||||||
|
|
||||||
/* Exported macro ------------------------------------------------------------*/
|
/* Exported macro ------------------------------------------------------------*/
|
||||||
|
|||||||
@@ -84,8 +84,6 @@ typedef struct {
|
|||||||
|
|
||||||
// Дополнительные параметры для одного модуля DC30
|
// Дополнительные параметры для одного модуля DC30
|
||||||
uint32_t power_limit; // лимит мощности [кВт]
|
uint32_t power_limit; // лимит мощности [кВт]
|
||||||
uint8_t hv_mode; // HV-режим (ограничение напряжения)
|
|
||||||
uint32_t hv_tick; // таймер для задержки входа в HV-режим
|
|
||||||
|
|
||||||
uint32_t tempAmbient; // температура окружающего воздуха (из PSU_04)
|
uint32_t tempAmbient; // температура окружающего воздуха (из PSU_04)
|
||||||
union { uint8_t raw; PSU_Status0_t bits; } status0; // modularForm0
|
union { uint8_t raw; PSU_Status0_t bits; } status0; // modularForm0
|
||||||
|
|||||||
@@ -13,6 +13,9 @@ void CONN_Init(){
|
|||||||
CONN.connControl = CMD_NONE;
|
CONN.connControl = CMD_NONE;
|
||||||
CONN.connState = Unknown;
|
CONN.connState = Unknown;
|
||||||
CONN.RequestedVoltage = PSU_MIN_VOLTAGE;
|
CONN.RequestedVoltage = PSU_MIN_VOLTAGE;
|
||||||
|
CONN.hv_limit = 0u;
|
||||||
|
CONN.hv_tick = 0u;
|
||||||
|
CONN.hv_limit_count = 0u;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+70
-17
@@ -33,6 +33,69 @@ extern CAN_HandleTypeDef hcan2;
|
|||||||
|
|
||||||
static void PSU_SendCmd(uint8_t source, uint8_t destination, uint8_t cmd, void *data);
|
static void PSU_SendCmd(uint8_t source, uint8_t destination, uint8_t cmd, void *data);
|
||||||
|
|
||||||
|
static void PSU_HvControl(void)
|
||||||
|
{
|
||||||
|
if (CONN.EnableOutput == 0u) {
|
||||||
|
if ((CONN.hv_limit != 0u) || (CONN.hv_limit_count != 0u)) {
|
||||||
|
log_printf(LOG_INFO, "HV limit reset output off\n");
|
||||||
|
}
|
||||||
|
CONN.hv_limit = 0u;
|
||||||
|
CONN.hv_tick = 0u;
|
||||||
|
CONN.hv_limit_count = 0u;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!PSU0.online) {
|
||||||
|
if ((CONN.hv_limit != 0u) || (CONN.hv_limit_count != 0u)) {
|
||||||
|
log_printf(LOG_INFO, "HV limit reset no PSU\n");
|
||||||
|
}
|
||||||
|
CONN.hv_limit = 0u;
|
||||||
|
CONN.hv_tick = 0u;
|
||||||
|
CONN.hv_limit_count = 0u;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (CONN.hv_limit == 0u) {
|
||||||
|
if ((CONN.hv_limit_count < PSU_HV_LIMIT_MAX_COUNT) &&
|
||||||
|
(CONN.MeasuredVoltage < PSU_HV_LIMIT_ON_THRESHOLD) &&
|
||||||
|
(CONN.MeasuredCurrent > PSU_HV_LOAD_CURRENT)) {
|
||||||
|
if (CONN.hv_tick == 0u) {
|
||||||
|
CONN.hv_tick = HAL_GetTick();
|
||||||
|
} else if ((HAL_GetTick() - CONN.hv_tick) >= PSU_HV_SWITCH_DELAY_MS) {
|
||||||
|
CONN.hv_limit = 1u;
|
||||||
|
CONN.hv_limit_count++;
|
||||||
|
CONN.hv_tick = 0u;
|
||||||
|
log_printf(LOG_WARN, "HV limit ON V=%d I=%d cnt=%d\n",
|
||||||
|
(int)CONN.MeasuredVoltage,
|
||||||
|
(int)CONN.MeasuredCurrent,
|
||||||
|
(int)CONN.hv_limit_count);
|
||||||
|
if (CONN.hv_limit_count >= PSU_HV_LIMIT_MAX_COUNT) {
|
||||||
|
log_printf(LOG_WARN, "HV limit locked cnt=%d\n",
|
||||||
|
(int)CONN.hv_limit_count);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
CONN.hv_tick = 0u;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if ((CONN.MeasuredVoltage > PSU_HV_LIMIT_OFF_THRESHOLD) ||
|
||||||
|
(CONN.MeasuredCurrent <= PSU_HV_LOAD_CURRENT)) {
|
||||||
|
if (CONN.hv_tick == 0u) {
|
||||||
|
CONN.hv_tick = HAL_GetTick();
|
||||||
|
} else if ((HAL_GetTick() - CONN.hv_tick) >= PSU_HV_SWITCH_DELAY_MS) {
|
||||||
|
CONN.hv_limit = 0u;
|
||||||
|
CONN.hv_tick = 0u;
|
||||||
|
log_printf(LOG_INFO, "HV limit OFF V=%d I=%d cnt=%d\n",
|
||||||
|
(int)CONN.MeasuredVoltage,
|
||||||
|
(int)CONN.MeasuredCurrent,
|
||||||
|
(int)CONN.hv_limit_count);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
CONN.hv_tick = 0u;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void PSU_SwitchState(PSU_State_t state){
|
static void PSU_SwitchState(PSU_State_t state){
|
||||||
PSU0.state = state;
|
PSU0.state = state;
|
||||||
PSU0.statetick = HAL_GetTick();
|
PSU0.statetick = HAL_GetTick();
|
||||||
@@ -169,8 +232,6 @@ void PSU_Init(){
|
|||||||
PSU0.statetick = HAL_GetTick();
|
PSU0.statetick = HAL_GetTick();
|
||||||
|
|
||||||
PSU0.power_limit = PSU_MAX_POWER; // kW
|
PSU0.power_limit = PSU_MAX_POWER; // kW
|
||||||
PSU0.hv_mode = 0;
|
|
||||||
PSU0.hv_tick = 0;
|
|
||||||
|
|
||||||
PSU_Enable(0, 0);
|
PSU_Enable(0, 0);
|
||||||
PowerSetpoint_Init();
|
PowerSetpoint_Init();
|
||||||
@@ -203,7 +264,9 @@ void PSU_SetVoltageCurrent(uint8_t addr, uint16_t voltage, uint16_t current){
|
|||||||
|
|
||||||
if(voltage<PSU_MIN_VOLTAGE) voltage = PSU_MIN_VOLTAGE;
|
if(voltage<PSU_MIN_VOLTAGE) voltage = PSU_MIN_VOLTAGE;
|
||||||
|
|
||||||
if((PSU0.hv_mode==0) && voltage>499) voltage = 499;
|
if((CONN.hv_limit != 0u) && (voltage > PSU_LV_CLAMP_V)){
|
||||||
|
voltage = PSU_LV_CLAMP_V;
|
||||||
|
}
|
||||||
|
|
||||||
uint32_t current_ma = current * 100;
|
uint32_t current_ma = current * 100;
|
||||||
uint32_t voltage_mv = voltage * 1000;
|
uint32_t voltage_mv = voltage * 1000;
|
||||||
@@ -295,19 +358,8 @@ void PSU_ReadWrite(){
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (PSU0.ready) {
|
if (PSU0.ready) {
|
||||||
if (CONN.MeasuredVoltage > 490) {
|
PSU_HvControl();
|
||||||
if (PSU0.hv_tick == 0) {
|
|
||||||
PSU0.hv_tick = HAL_GetTick();
|
|
||||||
} else if ((HAL_GetTick() - PSU0.hv_tick) >= 10000) {
|
|
||||||
PSU0.hv_mode = 1;
|
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
PSU0.hv_tick = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// PSU_SetHVMode(0, PSU0.hv_mode); // auto set, no need
|
|
||||||
// ED_Delay(CAN_DELAY);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -387,8 +439,9 @@ void PSU_Task(void){
|
|||||||
|
|
||||||
case PSU_READY:
|
case PSU_READY:
|
||||||
// модуль готов, но выключен
|
// модуль готов, но выключен
|
||||||
PSU0.hv_mode = 0;
|
CONN.hv_limit = 0u;
|
||||||
PSU0.hv_tick = 0;
|
CONN.hv_tick = 0u;
|
||||||
|
CONN.hv_limit_count = 0u;
|
||||||
|
|
||||||
RELAY_Write(RELAY_DC, 0);
|
RELAY_Write(RELAY_DC, 0);
|
||||||
if(!PSU0.ready){
|
if(!PSU0.ready){
|
||||||
|
|||||||
Binary file not shown.
+3927
-3884
File diff suppressed because it is too large
Load Diff
+3926
-3883
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user