Added fan support, but calculation still needs to be verified!
This commit is contained in:
@@ -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
|
if((fan_speed > 0.0) && (fan_speed <= 1.0)){
|
||||||
return (power * element->R_th);
|
|
||||||
|
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--){
|
for(int i = (inst->thermalElements_Counts-1); i >= 0; i--){
|
||||||
|
|
||||||
// Calculate temperature until we reach requested element!
|
// 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.
|
// 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;
|
return 0;
|
||||||
|
|
||||||
@@ -70,7 +91,6 @@ int cm_heatsinkEmul_init(cm_heatsinkEmul_t *inst, cm_heatsink_thermalElement_t *
|
|||||||
|
|
||||||
inst->power = power;
|
inst->power = power;
|
||||||
inst->ambientTemp = ambientTemp;
|
inst->ambientTemp = ambientTemp;
|
||||||
inst->C_th = C_th;
|
|
||||||
|
|
||||||
// Dynamic values
|
// Dynamic values
|
||||||
inst->fan_speed = 0;
|
inst->fan_speed = 0;
|
||||||
|
|||||||
@@ -18,6 +18,13 @@ typedef struct {
|
|||||||
};
|
};
|
||||||
float R_th_MaxFan; // In case you need to emulate a fan
|
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
|
// Dynamic
|
||||||
float temperature;
|
float temperature;
|
||||||
|
|
||||||
@@ -30,7 +37,6 @@ typedef struct {
|
|||||||
|
|
||||||
float power;
|
float power;
|
||||||
float ambientTemp;
|
float ambientTemp;
|
||||||
float C_th; // Thermal capacity
|
|
||||||
|
|
||||||
// Dynamic
|
// Dynamic
|
||||||
float prev_time;
|
float prev_time;
|
||||||
|
|||||||
Reference in New Issue
Block a user