The firmware waits for the steel frame beneath the heated bed to thermally stabilize before mesh bed leveling. The frame heats more slowly than the bed surface because heat must propagate from the bed PCB heater through metal spacers and an air gap to the frame. Without a sensor on the frame, the firmware estimates its temperature using a rate-limited follower model.
The estimation algorithm uses a step formula with no documented physical basis:
float step = (0.06f + (100.0f - temp_bed.celsius) * 0.0015f) * dt;
bed_frame_est_celsius += std::clamp(temp_bed.celsius - bed_frame_est_celsius, -step, +step);
The coefficients 0.06 and 0.0015 were introduced in BFW-5085 (May 2024) with no derivation from heat transfer theory and no measurement of the frame's thermal response. As temp_bed.celsius increases, step decreases — at 60 °C the step is 0.12 °C/s, at 100 °C it drops to 0.06 °C/s. The code comment states this reaches equilibrium "after about 150s for 60°C and about 10 minutes for 100°C."
The practical consequence is material-dependent:
| Material | Typical bed temp | Current wait |
|---|---|---|
| PLA | 55–60 °C | ~3 min |
| PETG | 70–80 °C | ~6–9 min |
| ABS / ASA | 100–110 °C | ~16–19 min |
| PC / PA | 100–115 °C | ~16–20 min |
Heat transfer through the spacers
Preliminary thermal imaging indicates that the dominant heat path from the bed PCB heater to the frame is conduction through the metal spacers between them, not radiation or convection through the air gap. The spacers are steel standoffs that bridge the gap and conduct heat directly into the frame.
Replacing the center and right-center metal spacers with thermally insulating equivalents yields a substantially faster frame stabilization response:


The mechanical implications — rigidity, vibration coupling, long-term durability — have not been evaluated. This is an experimental observation, not a recommended modification.
The step formula is backwards
Newton's law of cooling predicts that heat flow is proportional to the temperature difference between bed and frame. The larger the gap, the faster the frame should catch up. The firmware's step formula does the opposite: it slows down as the bed gets hotter, when the temperature gap is largest and heat transfer should be fastest.
This is why 100 °C takes disproportionately long. The step formula makes convergence inversely proportional to temperature:
A first-order exponential model is more physically sound: the frame temperature approaches the bed temperature proportionally to the remaining gap:
With τ = 100 s (a reasonable guess for a steel frame) and a 1.0 °C convergence threshold:
| Model | 60 °C | 100 °C |
|---|---|---|
| Current (linear, 0.5 °C) | ~203 s | ~952 s |
| Exponential τ=100 (1.0 °C) | ~323 s | ~366 s |
The exponential model eliminates the disproportionate slowdown at high temperatures. The exact time constant depends on the actual heat path — which the spacer experiment suggests is faster than an air-gap model would predict.
History and status
-
Pre-2024Original
BedPreheat: fixed timer of180 + (target − 60) × 144s — up to 19 min at 100 °C, regardless of frame state (source)
-
Nov 2023Issue #3534 opened: community requests a smarter, faster absorb heat. 20 ↑. Still open.
-
May 2024BFW-5085: timer replaced with rate-limited follower model. The step formula0.06 + (100 − Tbed) × 0.0015is introduced without documented physical basis.
-
Aug–Sep 2025#4754:abs()truncates float to int. Fixed in BFW-7600 (fabs()), but the step formula was not touched. Minimal wait-time impact (~8 s).
-
Oct 2025Issue #4917: absorb heat percentage loops infinitely when bed is off. Still open.
-
Jun 2026This article describes the structural problem with the step formula and preliminary spacer measurements. Prusa Research has not publicly responded. #3534 remains open.
References
- Prusa-Firmware-Buddy:
temperature.cpp— frame estimation algorithm - Prusa-Firmware-Buddy:
M190.cpp—wait_for_frame_heatup() - Original implementation commit — "Implement bed frame heatup approximation", Lukáš Hrázký, BFW-5085, May 2024
abs→fabsfix commit — BFW-7600, Sep 2025- Negative progress fix commit — BFW-7600, Sep 2025
- Old BedPreheat implementation — timer-based predecessor, deleted in BFW-5085
- GitHub issue: Make "Absorb Heat" smarter — enhancement request with 20 👍
- GitHub issue: "Absorbing heat" % wrong value — BFW-7600
- GitHub issue: Absorb heat percentage infinite loop — still open
- Newton's law of cooling — Wikipedia
- Marlin: M190 wait implementation
- Klipper: heater verification docs
Research Notes
The original step formula 0.06 + (100 − T_bed) × 0.0015 has no documented physical derivation. The coefficients appear arbitrary. Preliminary thermal imaging shows the dominant heat path is conduction through the metal spacers between the bed PCB and the frame, not through the air gap. Insulating the center and right-center spacers yields a substantially faster stabilization response. The mechanical implications of this modification have not been evaluated.
All convergence times come from simulation, not from timing a real printer. The underlying physical time constant (τ) is unmeasured. A single thermocouple measurement on the frame and a heatup log would pin it down.
Prusa Research has not publicly acknowledged the step formula as a bug. Only the abs/fabs truncation error was addressed (BFW-7600). The enhancement request for a smarter absorb heat algorithm remains open.