E-steps calibration: set extruder steps in Marlin and Klipper

3D_printing_extruder_calibration-1754418414425

E-steps (extruder steps per millimeter) is the firmware value that tells the extruder motor how many steps to take to push exactly 1 mm of filament. To calibrate it, you mark the filament, command the printer to extrude a fixed length, measure how much actually went in, and scale the value by the difference: new E-steps = current E-steps × requested length ÷ actual length. In Marlin you set the result with M92 E… and store it with M500; in Klipper the same idea is expressed as rotation_distance in printer.cfg.

You only need to do this when the extruder hardware or firmware changes, or when every filament under-extrudes or over-extrudes by the same amount. It corrects the length of filament fed, not how a particular spool behaves; that is the job of slicer flow. This guide covers the Marlin and Klipper procedures, the commands, how to read a bad result and when to leave E-steps alone. Commands and formulas come from the Marlin and Klipper documentation linked at the end.

Affiliate · Featured hardware Snapmaker U1 5X More Speed. 5X Less Waste.

The consumer toolchanger 3D printer: the SnapSwap 4-toolhead system swaps heads in 5 seconds for true multi-color and multi-material printing, with smart calibration and auto filament loading.

  • 4 toolheads · 5 s swap
  • Up to 500 mm/s · 20,000 mm/s²
  • 270 mm cube build volume
  • Multi-color & multi-material
See the Snapmaker U1 →
Snapmaker U1

E-steps calibration in seven steps

  1. Heat the nozzle to your normal printing temperature and make sure filament flows freely.
  2. Read the current value: M503 or M92 in Marlin, rotation_distance in Klipper’s [extruder] section.
  3. Mark the filament a known distance above the extruder intake (120 mm for a 100 mm test, 70 mm for Klipper’s 50 mm test).
  4. Extrude the requested length slowly.
  5. Measure the mark again with calipers; the difference is the actual length.
  6. Calculate the new value and save it (M92 + M500, or printer.cfg + restart).
  7. Repeat the test once to confirm.

What sets the E-steps value, and when to recalibrate

The number bundles three pieces of hardware: the motor, the driver’s microstepping and the drive gear (plus any gear reduction). Klipper’s documentation gives the typical figures: 200 full steps per rotation for a 1.8° motor, 400 for a 0.9° motor, and usually 16 microsteps. It also gives the conversion between the two firmware conventions:

rotation_distance = full_steps_per_rotation × microsteps ÷ steps_per_mm

As an illustration of the arithmetic only: a 200-step motor at 16 microsteps with an E-steps value of 93 gives 3200 ÷ 93 ≈ 34.4 mm of filament per motor rotation. Klipper describes an extruder’s rotation_distance exactly that way, as the filament distance for one full motor rotation, and notes you can estimate it from the drive gear: diameter × 3.14. A geared extruder multiplies the steps, which is why its E-steps value is several times higher than a direct-drive gear on the motor shaft. Klipper handles that with a gear_ratio line and warns that some extruders are not what the label says: the BMG, sold as 3:1, actually uses 50:17 gearing.

Recalibrate after you change the extruder, drive gear, motor or gear ratio, after a firmware flash that loaded new defaults, or when under- or over-extrusion shows up with every filament. In Marlin, M502 resets steps-per-unit to DEFAULT_AXIS_STEPS_PER_UNIT from the firmware, so a reset or a fresh build can silently undo your value. A new nozzle size or a new filament does not change E-steps.

Marlin: extrude 100 mm and set M92

You need a way to send G-code: a USB terminal (Pronterface, OctoPrint, Repetier-Host) or a printer screen that accepts commands. Use digital calipers rather than a ruler, and a fine marker.

  1. Heat the hotend to the temperature you print this filament at. Do not bypass Marlin’s cold extrusion protection with M302; the safety check exists to prevent damage when the hotend is too cold, and a cold test gives a false reading anyway.
  2. Note the current value. Send M503 (or M92 with no parameters) and look for the E figure in the M92 line, for example E93.00.
  3. Mark the filament 120 mm above a fixed point, usually the top of the extruder intake. The extra 20 mm keeps the mark visible if the extruder feeds more than expected.
  4. Extrude 100 mm slowly: M83 (relative extrusion), G92 E0, then G1 E100 F100. F100 is 100 mm per minute, so the move takes about a minute. Don’t touch the filament while it runs.
  5. Measure from the same fixed point to the mark. Actual length = 120 − remaining. If 23 mm remain, 97 mm went in.
  6. Calculate: new E-steps = current × 100 ÷ actual. With 93 and 97 mm: 93 × 100 ÷ 97 = 95.88.
  7. Apply and save: M92 E95.88, then M500. Check with M503 that the new value is active.
  8. Verify with a fresh mark and another 100 mm. If it is still noticeably off, recalculate from the new value.
Digital calipers held against a strand of teal filament coming off a spool

When M500 does not stick

Marlin’s M500 only works when the firmware was compiled with EEPROM_SETTINGS enabled. Without it, the value you set with M92 disappears at the next power cycle. You have two options: put M92 E… in your slicer’s start G-code, or change the E figure in DEFAULT_AXIS_STEPS_PER_UNIT in Configuration.h and rebuild. Our guide to flashing Marlin covers the build, the upload and backing up EEPROM settings first. On printers with more than one extruder and DISTINCT_E_FACTORS enabled, M92 takes a T parameter to target each extruder; calibrate them one by one.

CommandWhat it does
M503 or M92Reports the current steps per unit for all axes
M83 / G92 E0Relative extrusion / reset the extruder position to zero
G1 E100 F100Extrude 100 mm at 100 mm/min
M92 E<value>Sets extruder steps/mm (lost on reboot unless saved)
M500Saves settings to EEPROM (needs EEPROM_SETTINGS)
M501 / M502Reload settings from EEPROM / reset to firmware defaults

Klipper: calibrate rotation_distance

Klipper has no E-steps setting and no EEPROM. The extruder is configured by rotation_distance (plus gear_ratio if it is geared), and Klipper’s own measure-and-trim procedure uses a 50 mm test:

  1. Prepare: filament loaded, hotend heated to an appropriate temperature, printer ready to extrude.
  2. Mark the filament about 70 mm from the extruder intake and measure that distance precisely with calipers.
  3. Extrude: G91, then G1 E50 F60. It takes about 50 seconds. Klipper stresses the slow rate: a faster one builds pressure in the extruder and skews the result.
  4. Measure the new distance to the mark. Actual extrude distance = initial − subsequent.
  5. Calculate: new rotation_distance = previous × actual ÷ requested, rounded to three decimals.
  6. Save the value under [extruder] in printer.cfg and restart. If the actual distance was off by more than about 2 mm, Klipper suggests running the test a second time.

Note that the Klipper formula runs the other way round from Marlin’s. Rotation distance is millimeters per rotation, so an extruder that fed too little needs a smaller number, while Marlin’s steps per millimeter needs a larger one. Example: previous 33.500, 48 mm fed out of 50 requested gives 33.500 × 48 ÷ 50 = 32.160. For a quick trial you can use SET_EXTRUDER_ROTATION_DISTANCE, but Klipper’s G-code reference states that changed settings are not retained on a Klipper reset, so the final value belongs in the config file. If you are moving a Marlin machine over, the conversion formula above turns your old E-steps into a starting rotation_distance.

Troubleshooting the extrusion test

What happensLikely causeFix
Extruder clicks, skips or grinds during the testFeed rate too high, hotend too cold, partial clog or too much idler tensionSlow down (F60–F100), check the temperature, clear the nozzle, then retest
Two runs give different resultsImprecise mark, ruler instead of calipers, measuring from a different pointUse calipers from one fixed reference point; average two or three runs
Result very different after an extruder swapNew drive gear or gear ratioExpected: recalibrate from the new default; in Klipper check gear_ratio
Value gone after power-off (Marlin)No M500, or firmware without EEPROM_SETTINGSSave with M500, or set it in start G-code or Configuration.h
Value back to default after a firmware updateNew build loaded DEFAULT_AXIS_STEPS_PER_UNITRe-enter and save it, or change the default in the build
Klipper value “went down” although it under-extrudedrotation_distance is mm per rotation, the inverse of steps/mmCorrect behavior; no action needed
Test is accurate but prints still look starvedNot an E-steps problem: clog, temperature, speed or flowCheck the nozzle, then calibrate slicer flow

Clicking that persists at slow speed with a clear nozzle points to the extruder itself; our guide to extruder grinding and clicking goes through tension, gears and motor current. If filament barely moves when hot, fix the clogged nozzle before you calibrate anything.

E-steps vs flow: which one to adjust

Change E-steps only when the measured filament length is wrong, which means the error is the same for every spool and every slicer profile. If the 100 mm test is accurate and one filament still looks thin or bulgy, leave the firmware alone and adjust the slicer’s flow ratio or extrusion multiplier for that filament profile. Always in that order: E-steps first, then flow rate calibration. Using flow to hide a wrong E-steps value works for one spool and breaks the next.

Common E-steps mistakes and next steps

  • Extruding too fast. A quick move builds back pressure and reads short, so you end up over-correcting. Stay at the slow feed rates above.
  • Calibrating around a clog. A partly blocked nozzle makes a correct value look too low. Clean it first; a cold pull is the quickest check.
  • Measuring from different points. Pick one fixed edge on the extruder body and use it for both measurements.
  • Forgetting to save. M92 alone and SET_EXTRUDER_ROTATION_DISTANCE both vanish on restart.
  • Using E-steps as a per-filament setting. It describes the hardware; per-spool differences belong in slicer flow.
  • Stopping here. Once E-steps are right, the usual order is flow, then pressure advance for corner blobs. If you have not settled the nozzle temperature for a material yet, a temperature tower comes before both.

Frequently asked questions

Do I need to recalibrate E-steps when I switch from PLA to PETG?

No. E-steps describes the extruder’s motor, microstepping and drive gear, so it does not change with the material. Heat the nozzle to a normal printing temperature for whatever filament is loaded when you run the test, and handle differences between materials with the slicer’s flow setting in each filament profile.

Why does my new E-steps value come out higher than the old one?

Because the extruder fed less filament than requested. The formula is current × requested ÷ actual, so a short result, for example 97 mm instead of 100 mm, gives a higher number: 93 becomes 95.88. In Klipper the same situation gives a lower rotation_distance, because that value is millimeters per motor rotation.

Can I calibrate E-steps from the printer’s screen without a computer?

Often, yes. Many Marlin screens let you move the extruder by a set length and edit steps/mm under the motion settings, and some accept typed G-code. You still need to save the value, either with the menu’s store or save settings item (the name varies by printer) or with M500. Klipper printers are configured through printer.cfg in the web interface, such as Mainsail or Fluidd.

Does changing the nozzle size mean recalibrating E-steps?

No. A different nozzle changes how much plastic leaves the tip, not how many millimeters of filament the drive gear pushes. After a nozzle change, check slicer flow and pressure advance instead. Recalibrate E-steps only when the extruder motor, drive gear or gearing changes.

Sources