From aaeb82d1998c85d3b13382ca8511399f6aca276a Mon Sep 17 00:00:00 2001 From: Christian Lind Vie Madsen Date: Tue, 14 Oct 2025 14:25:20 +0200 Subject: [PATCH] Added fan support, but calculation still needs to be verified! --- cm_heatsink_emulator.c | 32 ++++++++++++++++++++++++++------ cm_heatsink_emulator.h | 8 +++++++- 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/cm_heatsink_emulator.c b/cm_heatsink_emulator.c index c66f183..aca4f8c 100644 --- a/cm_heatsink_emulator.c +++ b/cm_heatsink_emulator.c @@ -18,10 +18,30 @@ static int isStructOk(cm_heatsinkEmul_t *inst){ } -static float deltaTempElement(cm_heatsink_thermalElement_t *element, float temperature, float power){ +static float deltaTempElement(cm_heatsink_thermalElement_t *element, float temperature, float power, float fan_speed){ - // Kelvin = Watt * K/W - return (power * element->R_th); + if((fan_speed > 0.0) && (fan_speed <= 1.0)){ + + float dtemp = element->R_th_MaxFan - element->R_th_MinFan; + return power * (element->R_th_MinFan + (dtemp * fan_speed)); + + }else{ + // Kelvin = Watt * K/W + return (power * element->R_th); + } + +} + +static float updateCthFromFan(cm_heatsink_thermalElement_t *element, float fan_speed){ + + if((fan_speed > 0.0) && (fan_speed <= 1.0)){ + + float dc = element->C_th_MaxFan - element->C_th_MinFan; + return (element->C_th_MinFan + (dc * fan_speed)); + + }else{ + return element->C_th; + } } @@ -34,11 +54,12 @@ int cm_heatsinkEmul_iterate(cm_heatsinkEmul_t *inst, float dtime){ for(int i = (inst->thermalElements_Counts-1); i >= 0; i--){ // Calculate temperature until we reach requested element! - dtemp += deltaTempElement(&inst->thermalElements[i], dtemp, inst->power); + dtemp += deltaTempElement(&inst->thermalElements[i], dtemp, inst->power, inst->fan_speed); + float C_th = updateCthFromFan(&inst->thermalElements[i], inst->fan_speed); // Do so the temperature has the responsetime as the heatsink. - inst->thermalElements[i].temperature = inst->thermalElements[i].temperature + (1.0 / inst->C_th) * (dtemp - inst->thermalElements[i].temperature) * dtime; + inst->thermalElements[i].temperature = inst->thermalElements[i].temperature + (1.0 / C_th) * (dtemp - inst->thermalElements[i].temperature) * dtime; } return 0; @@ -70,7 +91,6 @@ int cm_heatsinkEmul_init(cm_heatsinkEmul_t *inst, cm_heatsink_thermalElement_t * inst->power = power; inst->ambientTemp = ambientTemp; - inst->C_th = C_th; // Dynamic values inst->fan_speed = 0; diff --git a/cm_heatsink_emulator.h b/cm_heatsink_emulator.h index 7ae0b1b..538303d 100644 --- a/cm_heatsink_emulator.h +++ b/cm_heatsink_emulator.h @@ -18,6 +18,13 @@ typedef struct { }; float R_th_MaxFan; // In case you need to emulate a fan + union{ + float C_th; + float C_th_MinFan; + }; + float C_th_MaxFan; + + // Dynamic float temperature; @@ -30,7 +37,6 @@ typedef struct { float power; float ambientTemp; - float C_th; // Thermal capacity // Dynamic float prev_time;