3D printing
3D Printing Calibration Tools

3D Printing Calibration Tools

This guide is focused on using Prusa Slicer for 3D printing, but many of the files and concepts translate directly to other slicers.

As with any tool or information you find on the internet, proceed with care. At least during calibration, DO NOT leave your printer unattended. You are testing the envelop of your machine, treat that fact with the respect it warrants.

Speed / Feedrate

The goal of this section is to setup a single test print to determine your machine / filament pair speed and flow rate limits. To optimize this setup, we will need the following:

  1. A single object that can be printed in a way that provides meaningful data.
  2. A way to lock down the other variables we are not testing, so that we can interpret the results with meaning and without contamination from other settings
  3. A way to change the print speed dynamically as our independent variable

1. The Test Object:

The test object is a 38.1mm diameter by 100mm tall cylinder, with demarcations at 5mm increments of height.


We will use it to print a single walled spiral while increasing the print speed dynamically as the height increases.

2. Lock down other settings:

To attempt to isolate the speed/feedrate from all other variables, we will select the “Spiral Vase” option on the “Print Settings” tab under “Layers and perimeters” menu item. This wil lautomatically set infill to zero, perimeter to one and top layers to zero. There you should also note your layer height (0.2mm for this tutorial), you will want it later for our volume calculation

Next, head to “Print Settings”, “Advanced”. Set a known, fixed value for External perimeters. Since I was calibrating a 0.80 mm nozzle, I set mine to 1mm. You will want this to be fixed for calculating your flow rates.

Subsequently, select the “Speed” menu item. The only value that is important is the “External Perimeters” setting. Set the External Perimeter speed to 100 mm/sec. Yes, that is remarkably high, but we will be using feedrate override to control the speed at each layer. By setting this speed to 100 mm/sec, the percentage override we set will be equal to the resulting feedrate in mm/sec. Clever? I think so. I set everything else to zero for my test, but it really won’t matter as they are not used in spiral mode.

Finally, after some frustration, I discovered that “Filament Setting / cooling / Slow down if layer print time is below ____” was adjusting my speeds. I set that to zero as well for this test.

You should leave everything else as is.

3. Changing speed dynamically:

The easiest way I have found to change the printer’s speed on the fly is the speed override function of Marlin. Marlin (And many others) use the M220 command to dynamically set the speed override of a 3D printer. It follows a M220 S[Speed Override Percentage] format. We will use the following formula to set the feedrate override value for the different segments.

M220 S([Start Value]+([Value Change Per Segment]*int([layer height in mm]/[segment height in mm])

The int([layer height in mm]/[segment height in mm]) part takes the current layer height of the print job and the height of each segment of our test object and returns an integer value ranging from 0 to 9 (Our object has ten segments, each 5mm tall). We multiply that integer by the value change per segment (I recommend a value of 5%) which results in the sequence 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50 over the entire print. We then add that value to the initial start value (I recommend 10%), which results in a sequence that increases the print speed override value from 10% to 60% in 5% increments. With the 100mm/sec feedrate set above, the resulting feedrate will be from 10 mm/sec to 60 mm/sec.

The above numbers are what I use to calibrate PETG, for other filaments, you can change the initial value and the steps to get a broader/higher/lower range)

Navigate to “Printer Settings” and then Custom G-Code. Copy the formula into the “After Layer Change G-Code” section:

M220 S{10 + (5 * int(layer_z / 5))}

This manner of speed manipulation will not show up in g-code preview. The g-code preview will look like the object is printed at all one speed, it will not.

Print the Object and Interpret the results

Slice the test object and print it on your printer. Should take less than 20min.

The surface texture looks good up to a speed of 25mm/sec. After that my printer started developing ridges. Eventually the extruder started failing at 55 mm/sec. This was PETG as was about as I expected for a 0.8mm nozzle.

To find the equivalent volumetric speed, you can take the Speed * extrusion width * layer height = Volumetric Speed. Doing this for the above setup resulted in the following table of values:

From this table, I now know that for good looking exterior perimeters, I should follow the formula:

Speed * ExtrusionWidth * LayerHeight <= 25 mm^3/sec

I also know that my extruder, with this filament and temperature combination has a hard limit of:

Speed * ExtrusionWidth * LayerHeight <= 50 mm^3/sec

As long as I follow the two equations above, I should be close to balancing my exterior appears and internal structures while maximizing my acceptable printing speeds.

After performing this calibration technique I have discovered that backing the perimeter speeds down by 10% and the max speed by 20% produces more reliable results.