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:
raduet
2026-06-30 19:27:47 +02:00
co-authored by Cursor
parent 86b0bfc0fc
commit 49a4fd8ee1
9 changed files with 7938 additions and 7787 deletions
+8
View File
@@ -9,6 +9,14 @@
#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). */
#define PSD_ENABLE 1u
#define PSD_MAX_CMD_CURRENT_0P1A 20u /* 2.0 A */
+3
View File
@@ -68,6 +68,9 @@ typedef struct{
uint16_t WantedCurrent; //0.1A/bit
CONN_Error_t chargingError; // 0 if okay
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;
+1 -1
View File
@@ -27,7 +27,7 @@ extern "C" {
/* USER CODE BEGIN EC */
#define FW_VERSION_MAJOR 1
#define FW_VERSION_MINOR 0
#define FW_VERSION_PATCH 24
#define FW_VERSION_PATCH 25
/* USER CODE END EC */
/* Exported macro ------------------------------------------------------------*/
-2
View File
@@ -84,8 +84,6 @@ typedef struct {
// Дополнительные параметры для одного модуля DC30
uint32_t power_limit; // лимит мощности [кВт]
uint8_t hv_mode; // HV-режим (ограничение напряжения)
uint32_t hv_tick; // таймер для задержки входа в HV-режим
uint32_t tempAmbient; // температура окружающего воздуха (из PSU_04)
union { uint8_t raw; PSU_Status0_t bits; } status0; // modularForm0
+3
View File
@@ -13,6 +13,9 @@ void CONN_Init(){
CONN.connControl = CMD_NONE;
CONN.connState = Unknown;
CONN.RequestedVoltage = PSU_MIN_VOLTAGE;
CONN.hv_limit = 0u;
CONN.hv_tick = 0u;
CONN.hv_limit_count = 0u;
}
+70 -17
View File
@@ -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_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){
PSU0.state = state;
PSU0.statetick = HAL_GetTick();
@@ -169,8 +232,6 @@ void PSU_Init(){
PSU0.statetick = HAL_GetTick();
PSU0.power_limit = PSU_MAX_POWER; // kW
PSU0.hv_mode = 0;
PSU0.hv_tick = 0;
PSU_Enable(0, 0);
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((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 voltage_mv = voltage * 1000;
@@ -295,20 +358,9 @@ void PSU_ReadWrite(){
#endif
if (PSU0.ready) {
if (CONN.MeasuredVoltage > 490) {
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_HvControl();
}
// PSU_SetHVMode(0, PSU0.hv_mode); // auto set, no need
// ED_Delay(CAN_DELAY);
}
void PSU_Task(void){
@@ -387,8 +439,9 @@ void PSU_Task(void){
case PSU_READY:
// модуль готов, но выключен
PSU0.hv_mode = 0;
PSU0.hv_tick = 0;
CONN.hv_limit = 0u;
CONN.hv_tick = 0u;
CONN.hv_limit_count = 0u;
RELAY_Write(RELAY_DC, 0);
if(!PSU0.ready){
Binary file not shown.
+3927 -3884
View File
File diff suppressed because it is too large Load Diff
+3926 -3883
View File
File diff suppressed because it is too large Load Diff