How many turns should you adjust a bed leveling screw?
Divide the screw’s height difference from the reference screw by the thread pitch. M3 screws move 0.5 mm per turn, M4 0.7 mm and M5 0.8 mm. A corner 0.1 mm low on M3 needs 0.2 turn, which firmware prints as 12 minutes: a clock-face minute is 1/60 of a turn.
turns = (z_reference − z_screw) / pitch
minutes = fraction of a turn × 60
z is the bed’s height at the screw, the number a probe or a mesh reports: bigger means the bed is higher. A positive result means the corner is low and needs raising. Klipper’s SCREWS_TILT_CALCULATE and Marlin’s G35 both run this formula and report no adjustment when the difference is under 0.001 mm.
| Thread | Bed travel per turn | Per clock-minute | 6 minutes |
|---|---|---|---|
| M3 | 0.5 mm | 0.0083 mm | 0.050 mm |
| M4 | 0.7 mm | 0.0117 mm | 0.070 mm |
| M5 | 0.8 mm | 0.0133 mm | 0.080 mm |
| M6 | 1.0 mm | 0.0167 mm | 0.100 mm |
These are the ISO metric coarse pitches, the values in both firmwares’ code. Klipper’s docs call the bed leveled “normally when all adjustments are below 6 minutes”.
Worked example: Marlin’s docs
The calculator’s defaults are the example in Marlin’s bed tramming docs. Front-right is 0.1 mm lower than front-left, back-right 0.25 mm higher and back-left 0.6 mm lower. The screws are M3, and clockwise raises the bed:
- Front right: 0.1 / 0.5 = 0.20 turn = 12 minutes, clockwise (CW) to raise it.
- Back right: −0.25 / 0.5 = −0.50 turn = 30 minutes, counter-clockwise (CCW) to lower it.
- Back left: 0.6 / 0.5 = 1.20 turns = 1 turn and 12 minutes, clockwise to raise it.
Marlin prints Turn Front-Right CW by 0 turns and 12 minutes, Turn Back-Right CCW by 0 turns and 30 minutes and Turn Back-Left CW by 1 turns and 12 minutes. Klipper writes the same adjustments as CW 00:12, CCW 00:30 and CW 01:12.
How do you use screws_tilt_calculate?
Add a [screws_tilt_adjust] section listing each screw’s position and the screw thread, home with G28, then run SCREWS_TILT_CALCULATE. Klipper probes over each screw and prints an adjustment such as CW 01:15: one full turn and 15 minutes clockwise. Turn the screws, run it again, and stop when every screw reads under 6 minutes.
[screws_tilt_adjust]
screw1: 30, 30
screw1_name: front left screw
screw2: 200, 30
screw2_name: front right screw
screw3: 200, 200
screw3_name: rear right screw
screw4: 30, 200
screw4_name: rear left screw
screw_thread: CW-M3
- The coordinates are a nozzle position: Klipper’s reference calls each one “a position to command the nozzle to so that the probe is directly above the bed screw”. To get it, subtract your probe’s X and Y offsets from the screw’s position.
- screw1 is the reference. The docs: “the system assumes that screw1 is at the correct height.”
- screw_thread accepts CW-M3, CCW-M3, CW-M4, CCW-M4, CW-M5 and CCW-M5. The code also takes CW-M6 and CCW-M6. CW-M3 is the default.
- Home first. The G-code reference: “You MUST always do a G28 before using this command.”
- Reading the output. The first line explains it: “01:20 means 1 full turn and 20 minutes, CW=clockwise, CCW=counter-clockwise”. The reference screw shows
(base)and no adjustment. - DIRECTION=CW or CCW. If you can only turn the screws one way, Klipper picks the highest or the lowest screw as the reference so that every screw turns that way. The calculator’s “Reference screw” menu does the same.
- MAX_DEVIATION.
SCREWS_TILT_CALCULATE MAX_DEVIATION=0.1stops with an error when any screw is more than 0.1 mm from the reference. Use it in a start macro to catch a bed that has drifted.
After leveling, run a new bed mesh: the saved one still holds the tilt you just removed.
Klipper needs at least three screws: its code refuses fewer, although the docs say two.
SCREWS_TILT_CALCULATE vs screws_tilt_adjust
They’re the same feature: [screws_tilt_adjust] is the config section, and SCREWS_TILT_CALCULATE is the command it adds. The other Klipper tool, BED_SCREWS_ADJUST from a [bed_screws] section, is for printers without a probe. It parks the nozzle at Z = 0 over each screw so you can do a paper test, and it doesn’t print turns.
A macro that homes first
Since the command needs homing every time, a two-line macro saves a step:
[gcode_macro LEVEL_SCREWS]
gcode:
G28
SCREWS_TILT_CALCULATE
Does clockwise raise or lower the bed?
It depends on the printer, so check before you trust a CW or CCW. Marlin’s docs say the direction “is not a property of the screw”: the same right-hand thread raises the bed one way with a knob under the bed and the other way with the screw head on top. Bambu’s A1 is an example of the second kind. Its wiki says tightening the leveling screws clockwise “will increase the distance between the heatbed and the nozzle”.
Marlin’s test settles it: “turn one knob a quarter turn clockwise and see whether that corner comes up toward the nozzle.” If it does, your thread is CW (Klipper CW-M3, Marlin 30). If it goes down, it’s CCW.
Klipper’s definition is the same: with a CW thread, “a clockwise rotation of the knob decreases the gap between the nozzle and the bed.” Set the calculator’s “Turning a knob clockwise” to match.
Marlin’s G35 tramming assistant
Marlin’s version needs ASSISTED_TRAMMING in Configuration_adv.h, with the probe points in TRAMMING_POINT_XY and the thread in TRAMMING_SCREW_THREAD:
| Code | Thread |
|---|---|
| 30 / 31 | M3, clockwise / counter-clockwise |
| 40 / 41 | M4, clockwise / counter-clockwise |
| 50 / 51 | M5, clockwise / counter-clockwise |
Run it with G35. G35 S40 overrides the thread setting for one run (M4 clockwise in the docs’ example). Point 1 is always the reference. Marlin has no M6 setting and no DIRECTION option. Send G28 before you print, because G35 leaves Z unhomed.
Marlin drops the leftover fraction of a minute, while Klipper rounds to the nearest minute, so the two can differ by one minute on the same bed. The calculator rounds like Klipper.
Leveling without a probe
Without a probe, use a feeler gauge. Park the nozzle at the same height over each screw and measure the gap under its tip. A gap is the opposite of a probe reading: a bigger gap means a lower corner. Pick “Gap under the nozzle” and the calculator flips the sign.
The paper test gives a feel, not a number. Klipper’s docs put printer paper at about 0.100 mm. Marlin’s LCD Bed Tramming menu parks the nozzle at each corner for the test, and Klipper’s BED_SCREWS_ADJUST over each screw. Only with a gauge or a probe can you calculate the turns.
Bed leveling screw sizes on common printers
Where the maker publishes the thread:
| Printer | Thread | Source |
|---|---|---|
| Creality Ender-3 (original) | M4 | Creality’s drawing of the hand-twisted leveling nut |
| QIDI Q1 Pro | CW-M4 | QIDI’s shipped printer.cfg, three screws |
| Bambu Lab A1 | Not stated; clockwise lowers the bed | Bambu wiki, manual bed tramming |
Klipper’s repository also holds example configs written by users for other printers: CW-M4 for the Ender-3 V2 Neo and Ender-5 S1, CW-M3 for the CR-10 Smart Pro and CR-10S Pro V2, and CW-M5 for the Artillery Sidewinder X2. Creality’s shipped configs for the K1 series and the Ender-3 V3 KE have no screw section: those printers level with pressure sensors and a mesh.
If you don’t know your thread, measure the screw’s diameter: about 3 mm is M3, 4 mm M4, 5 mm M5. Or give one knob a full turn and measure how far the corner moves.
Published · Figures last checked
Sources
- Klipper documentation, Manual level: adjusting bed leveling screws using the bed probe (accessed 2026-10-19)
- Klipper documentation, Manual level: adjusting bed leveling screws (BED_SCREWS_ADJUST) (accessed 2026-10-19)
- Klipper documentation, Configuration reference: screws_tilt_adjust (accessed 2026-10-19)
- Klipper documentation, G-Codes: SCREWS_TILT_CALCULATE (accessed 2026-10-19)
- Klipper source, klippy/extras/screws_tilt_adjust.py (accessed 2026-10-19)
- Klipper source, klippy/extras/manual_probe.py (what the probed Z means) (accessed 2026-10-19)
- Klipper documentation, Bed level: the paper test (accessed 2026-10-19)
- Marlin Firmware documentation, Bed tramming (accessed 2026-10-19)
- Marlin Firmware documentation, G35 Tramming Assistant (accessed 2026-10-19)
- Marlin source, src/gcode/bedlevel/G35.cpp (accessed 2026-10-19)
- Marlin source, Configuration_adv.h (ASSISTED_TRAMMING, TRAMMING_SCREW_THREAD) (accessed 2026-10-19)
- Engineering ToolBox, ISO metric coarse threads (accessed 2026-10-19)
- Creality Ender-3 mechanical files, hand twisted nut drawing (M4) (accessed 2026-10-19)
- QIDI Q1 Pro printer.cfg (screws_tilt_adjust) (accessed 2026-10-19)
- Klipper example printer configs (accessed 2026-10-19)
- Bambu Lab Wiki, A1 manual bed tramming (accessed 2026-10-19)