Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit a1321ac

Browse files
committedMar 5, 2022
Improved handling of errors in steady state plus advanced options to configure this
1 parent f5bcb96 commit a1321ac

File tree

2 files changed

+11
-8
lines changed

2 files changed

+11
-8
lines changed
 

‎Marlin/Configuration.h

+4
Original file line numberDiff line numberDiff line change
@@ -641,6 +641,10 @@
641641
#endif
642642

643643
#define FILAMENT_HEAT_CAPACITY_PERMM 5.6e-3f // 0.0056 J/K/mm for 1.75mm PLA (0.0149 J/K/mm for 2.85mm PLA). Most filaments are similar.
644+
645+
// Advanced options
646+
#define MPC_STEADYSTATE 0.5 // temperature change rate in K/s below which steady state model correction logic kicks in
647+
#define MPC_SMOOTHING 0.5 // larger values smooth the temperature readings more but introduce latency
644648
#endif // MPCTEMP
645649

646650
//===========================================================================

‎Marlin/src/module/temperature.cpp

+7-8
Original file line numberDiff line numberDiff line change
@@ -1214,22 +1214,21 @@ void Temperature::min_temp_error(const heater_id_t heater_id) {
12141214
}
12151215

12161216
// update the modeled temperatures
1217-
float tempdelta = temp_hotend[ee].soft_pwm_amount * (HEATER_POWER / 127 * MPC_dT / heatblock_heat_capacity);
1218-
tempdelta += (temp_hotend[ee].modeled_ambient_temp - temp_hotend[ee].modeled_block_temp) * ambient_xfer_coeff * (MPC_dT / heatblock_heat_capacity);
1219-
temp_hotend[ee].modeled_block_temp += tempdelta;
1220-
const bool steadystate = fabs(tempdelta) < (0.2 * MPC_dT);
1217+
float blocktempdelta = temp_hotend[ee].soft_pwm_amount * (HEATER_POWER / 127 * MPC_dT / heatblock_heat_capacity);
1218+
blocktempdelta += (temp_hotend[ee].modeled_ambient_temp - temp_hotend[ee].modeled_block_temp) * ambient_xfer_coeff * (MPC_dT / heatblock_heat_capacity);
1219+
temp_hotend[ee].modeled_block_temp += blocktempdelta;
12211220

1222-
tempdelta = (temp_hotend[ee].modeled_block_temp - temp_hotend[ee].modeled_sensor_temp) * (sensor_xfer_coeff * MPC_dT / sensor_heat_capacity);
1223-
temp_hotend[ee].modeled_sensor_temp += tempdelta;
1221+
const float sensortempdelta = (temp_hotend[ee].modeled_block_temp - temp_hotend[ee].modeled_sensor_temp) * (sensor_xfer_coeff * MPC_dT / sensor_heat_capacity);
1222+
temp_hotend[ee].modeled_sensor_temp += sensortempdelta;
12241223

12251224
// Any delta between temp_hotend[ee].modeled_sensor_temp and temp_hotend[ee].celsius is either model
12261225
// error diverging slowly or (fast) noise. Slowly correct towards this temperature and noise will average out.
1227-
const float delta_to_apply = (temp_hotend[ee].celsius - temp_hotend[ee].modeled_sensor_temp) / 10.0;
1226+
const float delta_to_apply = (temp_hotend[ee].celsius - temp_hotend[ee].modeled_sensor_temp) * (MPC_SMOOTHING * MPC_dT);
12281227
temp_hotend[ee].modeled_block_temp += delta_to_apply;
12291228
temp_hotend[ee].modeled_sensor_temp += delta_to_apply;
12301229

12311230
// only correct ambient when close to steady state otherwise it can diverge wildly due to modelling errors
1232-
if (steadystate)
1231+
if (fabs(blocktempdelta + delta_to_apply) < (MPC_STEADYSTATE * MPC_dT))
12331232
temp_hotend[ee].modeled_ambient_temp += delta_to_apply;
12341233

12351234
float power = 0.0;

0 commit comments

Comments
 (0)
Please sign in to comment.