Skip to content

Pressure Advance Calibration: Why Corners Bulge and How to Fix It

Pressure advance explained: why corners bulge or starve, and the real calibration steps for Klipper, Marlin linear advance, OrcaSlicer and Bambu.

Technician measuring a plastic part with a digital caliper

What pressure advance actually compensates for

Plenty of troubleshooting advice stops at "run your firmware’s pressure advance calibration and apply the value." That one sentence hides a test print, two or three G-code commands, a caliper measurement and a decision about which corner to believe. Our own guide to stopping nozzle ooze leaves it there too, so this page is the missing half: the real procedure per firmware, and how to read what comes off the bed.

Start with why the setting exists. Under default firmware behavior the extruder is treated as one more linear axis. Marlin’s documentation on linear advance says it plainly: the extruder motor moves in linear proportion to the other motors, with the same acceleration profile and the same start and stop points. Molten plastic does not cooperate. The force needed to push filament through the nozzle depends partly on how fast it is being pushed, so when the toolhead accelerates, the filament between the drive gear and the melt zone compresses first, and only then does pressure rise enough to deliver the requested flow. Bambu Lab’s documentation reaches the same conclusion from fluid mechanics: pressure through an opening is proportional to flow rate, filament is not a rigid body, and its compression delays real flow behind commanded flow.

On a single fast line that gives you a starved beginning and a blob at the end, because the filament is still compressed when the extruder motor stops. Across a whole part it reads as corners that bleed outward, roughness on top solid infill wherever perimeters change direction, and in bad cases gaps where a perimeter starts. Pressure advance in Klipper and linear advance in Marlin both attack this the same way: push extra filament during acceleration, take it back during deceleration, so melt zone pressure tracks the toolhead instead of trailing it.

Not e-steps, and not average flow

E-steps, or rotation_distance in Klipper, decide how much filament leaves the nozzle. Pressure advance decides when it leaves. Two different problems with two different fixes, and the order between them is not a matter of taste: Klipper and Marlin both tell you to get extruder steps right before touching pressure. Tuning pressure advance on a printer whose e-steps are not calibrated is the wrong way round, because you end up correcting a volume error with a timing parameter, and the value you settle on becomes wrong the moment you fix the real fault. Klipper asks for nozzle temperature to be settled first as well, since temperature changes viscosity and therefore the pressure needed to extrude.

Pressure advance also does nothing for global over or under extrusion. Klipper’s documentation is explicit that a print with the feature enabled uses the same total amount of filament and takes the same amount of time as one without it. All it moves is where that filament lands: corners, speed changes, seams, and the first and last millimeters of every line.

One distinction worth making once. Input shaping smooths motion so frame resonance cancels itself out. Pressure advance smooths extrusion so nozzle pressure keeps up with that motion. Both are Klipper calibrations, both leave their fingerprints near corners, and neither substitutes for the other.

Reading a wrong value off the print

Too low, and pressure keeps climbing after the toolhead has already slowed. Klipper describes blobbing at the corners. Marlin’s documentation splits a single test line into phases and names both failures: a starved line where the fast section begins, then too much material where deceleration begins, which bleeds on into the slow section.

Too high inverts the picture. Klipper describes rounded corners and poor extrusion leading up to the corner. Marlin describes overshoot at the start of acceleration and starvation through deceleration. In OrcaSlicer’s calibration photographs the same fault reads as gaps opening at the corner, set against corner bulging when the value is too low. Seams deserve a look as well, since a seam is a stop and a restart in the same place.

The Klipper tuning tower

Klipper’s pressure advance document prints a tall hollow square and changes the setting as the print gets taller.

  1. Slice docs/prints/square_tower.stl at high speed (the documentation suggests 100 mm/s), zero infill, and a coarse layer height around 75 percent of nozzle diameter. Turn off dynamic acceleration control and scarf joint seams in the slicer.
  2. Before printing, send SET_VELOCITY_LIMIT SQUARE_CORNER_VELOCITY=1 ACCEL=500. This makes the nozzle travel slower through corners so extruder pressure shows itself clearly.
  3. Start the tower. Direct drive: TUNING_TOWER COMMAND=SET_PRESSURE_ADVANCE PARAMETER=ADVANCE START=0 FACTOR=.005. Long Bowden: the same command with FACTOR=.020.
  4. Print, then find the height with the best corners using digital calipers. Cancel the print early once corners are clearly getting worse, since nothing above that point is worth printing.
  5. Work out the value: pressure_advance = start + (measured height * factor). Klipper’s own example gives 0 + 12.90 * .020, or .258.
  6. Put pressure_advance in the [extruder] section of printer.cfg and send RESTART, which also clears the test acceleration and cornering limits.

Two details on that page save real time. Corners frequently differ from each other, usually because the slicer changes layers at one of them, so ignore that corner and judge the other three. And when two heights look equally good, take the lower one.

Klipper calls 0.050 to 1.000 the typical span, with the top end mostly Bowden machines, and adds a useful escape hatch: if nothing improves up to 1.000, pressure advance is not what is wrong with that printer and should be left disabled.

Linear advance in Marlin

Marlin’s version is a K factor, in millimeters of filament compression per 1 mm/s of extrusion speed. You set it with M900: M900 K0.18 sets it, M900 on its own reports it, and M900 K0 disables linear advance. K can also be compiled in through LIN_ADVANCE_K in Configuration_adv.h, but Marlin recommends leaving that at 0 and putting M900 Kxx at the end of the slicer’s start G-code, so changing material is an edit instead of a reflash.

The test is a pattern rather than a tower. Marlin hosts a K factor pattern generator that prints one line per K value, each line made of 20 mm at a slow speed, 40 mm fast, then 20 mm slow again, with K stepping up line by line. The best K is the line where the transitions between the two speeds are fluid and barely visible. Marlin’s page suggests scanning roughly 0.1 to 2.0 for the current implementation, and notes that Bowden setups land higher in that span than direct drive.

Two warnings from that same page. Slicer features that already meddle with nozzle pressure, including coast at end, extra restart length after retract, wipe while retracting and combing, work against linear advance and should be switched off. And a high K can make Marlin reduce print acceleration for a segment, because the pressure correction would otherwise exceed the configured extruder jerk limit. Bowden machines hit that first, since they need the higher K values to begin with.

Running the test from a slicer

OrcaSlicer builds three tests in, each with a direct-drive and a Bowden variant, and its wiki is honest about the trade-offs. The tower method takes longer but does not depend on first layer quality, and raises the value one step per millimeter of height, so the arithmetic matches Klipper’s: start value plus step times measured height. The line method is quick and easy to read, but its accuracy rests on a good first layer, which is why the wiki suggests running it with bed mesh leveling on. The pattern method comes from Andrew Ellis’ generator, itself derived from the Marlin pattern, and can batch several tests onto one plate.

Two settings catch people here. On Marlin printers, OrcaSlicer warns that linear advance has to be enabled in firmware first, and many stock builds ship with it off. On Bambu Lab machines, leave the flow calibration option unticked during the test, or the printer overwrites the thing you are trying to measure. Whichever method you use, the number belongs in the filament profile.

What Bambu Lab calls flow dynamics calibration

This one is documented rather than guessed. Bambu Lab’s wiki page on Flow Dynamics Calibration says the feature is "similar to the ‘Pressure advance’ in Klipper or the ‘Linear advance’ in Marlin, with some non-linear effect compensation added," and the number it reports is a K factor. Automatic mode measures and hands back a value with no judgment call from you; on the A1, Bambu’s FAQ says the hotend senses the ripple of extrusion force while purging at the wiper. Manual mode prints numbered lines and you pick the best one. Either way the result is stored in the printer, per filament.

Bambu also publishes when a stored value goes stale: a new filament brand or model, a worn or replaced nozzle, damp filament, or a change to print temperature or maximum volumetric speed. The same page lists what makes an automatic result unreliable, including damp filament, transparent filament and a build plate that has lost its tack, and states that the measurement carries about 10 percent jitter between runs.

The value belongs to the filament and the nozzle

Klipper is blunt here: pressure advance depends on the extruder, the nozzle and the filament, and spools from different manufacturers or with different pigments can need noticeably different values. Marlin’s list adds print temperature, Bowden length and nozzle geometry. In practice that means one calibration per material per nozzle, stored with the filament, and a fresh run after a nozzle swap. It also puts pressure advance after e-steps and flow in any sensible calibration order, never before them.

Where the numbers stop being trustworthy

Nobody publishes a reliable starting value, and the three number scales are not interchangeable. Klipper’s typical span, Marlin’s suggested test range and the K factors Bambu reports in its own examples sit in different places, and none of the official documentation offers per-material figures of the "PLA is 0.04, PETG is 0.06" kind. Anyone quoting one is quoting their own machine. Run the test.

The value is not even a single number in principle. OrcaSlicer’s wiki reports that the optimal setting drops as flow rate, layer height and acceleration rise, so any one value is a compromise across the features in a print. That is what adaptive pressure advance exists for: you calibrate at several speed and acceleration combinations and the slicer fits a model. The wiki notes it has been tested on Klipper machines and is untested on Marlin and Bambu Lab printers, and that it buys nothing if you print at one layer height and one speed.

Two last cautions. Klipper warns that a high value, over roughly 0.200, combined with high acceleration can make the extruder skip, because it has to push and retract filament fast enough to keep up and may not have the torque. And on printers running vendor firmware that is neither Klipper nor Marlin nor Bambu’s, what a menu item labeled calibration actually adjusts is often not documented publicly, so read your own manual rather than assuming it does what this page describes.

Your next print can be better

Describe the symptom. Start with the most likely fix.

The troubleshooting hub narrows the library by print stage, material and the action you are comfortable taking.