feat: receive ChargeLimit_pct from VCU on CAN 0x212 (SKUDAK-516)
Build Firmware / Build stm32-teslacharger (pull_request) Successful in 59s
Build Firmware / Build stm32-teslacharger (pull_request) Successful in 59s
Pairs with stm32-hal-vcu PR #42. Adds a runtime "vcuchglim" param that the VCU broadcasts every 200 ms; on receipt, the param's Change() callback translates 20-100% to the charger's udcspnt (DC voltage setpoint) using a linear cell-voltage ramp. Without this, the teslacharger had no path for the user's app-set charge limit to actually limit charging — udcspnt was effectively a compile-time setpoint. What's added ------------ - Param::vcuchglim in include/param_prj.h: PARAM_ENTRY(CAT_CHARGER, vcuchglim, "%", 20, 100, 80, 23) - Range 20-100 (matches VCU validation) - Default 80% if VCU never connects - ID 23 (next free per the comment, bumped to 24) - Saveable so a flashed charger paired with a silent VCU still behaves predictably across reboots - can->AddRecv(Param::vcuchglim, 0x212, 0, 8, 1) registration in ChargerCAN::MapMessages() — libopeninv's CanMap dispatches to the Change() callback on each received frame. - Param::Change(vcuchglim) handler in src/main.cpp: cell_target = 3.30 + (4.15 - 3.30) * (pct - 20) / 80 udcspnt = cell_target * 96 Endpoints chosen to be safe across Tesla LDU / VW MEB / Volt2: 20% → 3.30 V/cell × 96 = 316.8 V (deep-cycle storage floor) 80% → 3.94 V/cell × 96 = 378.0 V (recommended daily ceiling) 100% → 4.15 V/cell × 96 = 398.4 V (matches existing udclim default) Tuneable here as constants if a particular pack needs a tighter range. - VER bump 1.19.R → 1.20.R. Combined with the pre-existing -S1 suffix the OI web UI shows "4=1.20.R-S1", visually distinct from upstream and from the previous Skudak build. Build ----- text=25288, links clean. The "RWX LOAD segment" linker warning is pre-existing on this template, unrelated. No new warnings from this change. Version string in the binary verified as "4=1.20.R-S1". Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
+3
-2
@@ -39,14 +39,14 @@
|
||||
*/
|
||||
|
||||
//Define a version string of your firmware here
|
||||
#define VER 1.19.R
|
||||
#define VER 1.20.R
|
||||
|
||||
/* Entries must be ordered as follows:
|
||||
1. Saveable parameters (id != 0)
|
||||
2. Temporary parameters (id = 0)
|
||||
3. Display values
|
||||
*/
|
||||
//Next param id (increase when adding new parameter!): 23
|
||||
//Next param id (increase when adding new parameter!): 24
|
||||
//Next value Id: 2051
|
||||
/* category name unit min max default id */
|
||||
#define PARAM_LIST \
|
||||
@@ -63,6 +63,7 @@
|
||||
PARAM_ENTRY(CAT_CHARGER, enablepol, POLARITIES,0, 1, 0, 18 ) \
|
||||
PARAM_ENTRY(CAT_CHARGER, idckp, "", 0, 10000, 1, 20 ) \
|
||||
PARAM_ENTRY(CAT_CHARGER, idcki, "", 0, 10000, 10, 21 ) \
|
||||
PARAM_ENTRY(CAT_CHARGER, vcuchglim, "%", 20, 100, 80, 23 ) \
|
||||
VALUE_ENTRY(state, STATES, 2043 ) \
|
||||
VALUE_ENTRY(uptime, "s", 2048 ) \
|
||||
VALUE_ENTRY(lasterr, errorListString, 2002 ) \
|
||||
|
||||
@@ -100,6 +100,13 @@ void ChargerCAN::MapMessages(CanMap* can)
|
||||
can->AddSend(Param::idc, 0x109, 24, 16, 1);
|
||||
can->AddSend(Param::opmode, 0x109, 40, 3, 5); //Set charging and connlock at once
|
||||
|
||||
/***** SKUDAK VCU command RX (0x212) — SKUDAK-516 user ChargeLimit *****/
|
||||
// Byte 0: ChargeLimit_pct (0-100). Bytes 1-7 reserved 0x00.
|
||||
// Param::Change(vcuchglim) translates % to udcspnt setpoint (see src/main.cpp).
|
||||
// VCU broadcasts every 200 ms once teslacharger detected; charger holds last
|
||||
// value if VCU goes silent.
|
||||
can->AddRecv(Param::vcuchglim, 0x212, 0, 8, 1);
|
||||
|
||||
/***** SKUDAK VCU telemetry (0x211) — SKUDAK-448 expanded charger telemetry *****/
|
||||
// Byte 0: state (0=Off, 1=WaitStart, 2=Enable, 3=Activate, 4=Run, 5=Stop)
|
||||
// Bytes 1-2: udc (V, gain=1)
|
||||
|
||||
@@ -114,6 +114,27 @@ void Param::Change(Param::PARAM_NUM paramNum)
|
||||
spnt = MIN(Param::Get(Param::idcspnt), Param::Get(Param::idclim));
|
||||
dcCurController.SetRef(spnt);
|
||||
break;
|
||||
case Param::vcuchglim:
|
||||
{
|
||||
// SKUDAK-516: VCU sends user-set ChargeLimit_pct on CAN 0x212. Translate
|
||||
// percentage to udcspnt (DC voltage setpoint) using a linear cell-voltage
|
||||
// ramp. 96-cell pack (Tesla LDU / VW MEB compatible):
|
||||
// pct=20 → 3.30 V/cell × 96 = 316.8 V (storage / deep-cycle floor)
|
||||
// pct=80 → 3.94 V/cell × 96 = 378.0 V (recommended daily ceiling)
|
||||
// pct=100 → 4.15 V/cell × 96 = 398.4 V (matches existing udclim default)
|
||||
// Endpoints chosen to be safe across Tesla/VW/Volt2 chemistries — adjust
|
||||
// here if a particular pack needs a tighter range. The VCU validates 20-100
|
||||
// before transmit so out-of-range values never arrive.
|
||||
int pct = Param::GetInt(Param::vcuchglim);
|
||||
if (pct < 20) pct = 20;
|
||||
if (pct > 100) pct = 100;
|
||||
const float CELL_LOW_V = 3.30f;
|
||||
const float CELL_HIGH_V = 4.15f;
|
||||
const float CELL_COUNT = 96.0f;
|
||||
float cell_target = CELL_LOW_V + (CELL_HIGH_V - CELL_LOW_V) * (pct - 20) / 80.0f;
|
||||
Param::SetFloat(Param::udcspnt, cell_target * CELL_COUNT);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
//Handle general parameter changes here. Add paramNum labels for handling specific parameters
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user