<p>I've had this problem recurringly after marking this solved before, so I'm writing a new answer to revisit it.</p>
<p>Based on the magnitude of the error being absolute rather than relative, and not being direction-dependent (i.e. not backlash), it can't be caused by the motion system. I further ruled out inward warping of the material by running tests with 100% infill. When, even at 100% infill, the diameter (thus volume of material) was too low, the only remaining explanation was underextrusion.</p>
<p>Measuring the theoretical rotation distance of my extruder hob (now a different extruder from the original Ender 3 one), accounting for approximate tooth depth along with a precise hob diameter measurement, I got a value 15% lower than my configured value (E-steps 15% higher). I was already aware there was a discrepency here, just not the magnitude, and had purposefully kept it lower because of concerns that the full value would lead to parts that don't fit, due to imperfections in the walls, and especially that it might make the undersized holes problem worse.</p>
<p>In reality, it's done the opposite. The best explanation I can come up with for fixing holes is that, for extrusion widths narrower than the nozzle (which a 15% under-extruded 0.4 mm line is, since it's only about 0.34 mm), the line does not stay centered well, but gets dragged with the direction of curvature. I think I still have some problems with holes being slightly undersized, but they're at least no worse, and seem slightly better.</p>
<p>As for positive cylinders, at 5 mm, printed diameter is nearly perfect, only under by about 40-50 µm, which is very acceptable and better than being over. Getting this result does depend on having a 100% solid part, though; as soon as infill comes into play, the cylinder is undersized again. Setting Cura's &quot;Minimum Infill Area&quot; high enough, or using enough walls to ensure the cylinder will be solid, can ensure 100% fill without printing the whole part at 100% infill.</p>
<p>So, I think I can conclusively say the main likely cause for this problem is underextrusion due to inaccurate E-steps.</p>

CC BY-SA 4.0
2022-02-24T21:21:03.800Z
2022-02-26T20:01:01.360Z
2022-02-26T20:01:01.360Z
R.. GitHub STOP HELPING ICE
<p>You should not look at the relative dimensional differences, you should be looking at the absolute differences. Multiplying the undersized dimensions in percentage with the cylinder diameter gives you a value of 0.4 &nbsp;mm for each cylinder give or take a few hundreds. So, basically your printer works very consistent it is just suffering from a systematic offset.</p>

<p>Basically, the printing process needs to
adjust the X-Y dimensions to compensate for plastic flow effects. An option or setting in Ultimaker Cura to counteract this is called <code>Horizontal﻿ ﻿Expansio﻿n</code>. Slic3r and Simplify3d have similar settings. In Slic3r it is called <code>XY size compensation</code>. </p>

CC BY-SA 4.0
2019-04-02T22:32:10.467Z
Unfortunately, the effect happens in the opposite direction with the opposite curvature: holes are too small. Adjusting `xy_offset` with a positive value will make that even worse. It seems likely that fixing this might require enhancing the slicer to take local curvature into effect when applying an offset.
R.. GitHub STOP HELPING ICE
CC BY-SA 4.0
2019-04-02T22:37:20.110Z
@R..R Filament could well be dragged before it sets explaining the smaller radius
0scar
CC BY-SA 4.0
2019-04-02T22:46:04.613Z
Yeah, my thought is that something like that is happening to make the error happen in the direction of the curvature - either dragging or some sort of surface-tension like force in the material.
R.. GitHub STOP HELPING ICE
CC BY-SA 4.0
2019-04-03T00:42:01.550Z
you can set a *negative* size compensation
Trish
CC BY-SA 4.0
2019-04-03T04:01:42.000Z
@Trish: Right, but that will make the problem described here worse. There's some small constant negative compensation needed for die swell, plus what seems to be a curvature-dependent compensation that would be large and positive for inward curvature and unknown (since I haven't yet measured) magnitude negative for outward curvature.
R.. GitHub STOP HELPING ICE
CC BY-SA 4.0
2019-04-02T22:28:02.797Z
2019-04-02T22:28:02.797Z
0scar
<p>The increase of the <em>relative error</em> is not an anomaly, it is a direct result of what is the actual error: There is a systematic, <strong>absolute error</strong>, which is almost the same for all the cylinders and all the cubes. +0.2 mm or +0.4 mm on progressively smaller items gets a progressively bigger relative error. But the source of the absolute error is what you need to compensate for.</p>
<h2>Fighting bulging for 0.2 mm accuracy</h2>
<p>As you figured out that 110% extrusion did halve the absolute error of the cylindrical test, in conjunction with layer deformation, I suggest to try this:</p>
<ul>
<li>Extrusion/Flow Multiplier 100 %</li>
<li>Linewidth 0.44 to 0.45 mm</li>
</ul>
<p>This fights the die swell but also spaces the walls and roofing lines, allowing them to take the extra material. 0.2 mm accuracy is pretty good for a start, you get into the specs of many parts with that, but we want more!</p>
<p>For a slight increase, measure your filament in a couple of spots and do the average, then use that as filament diameter.</p>
<h2>Increasing Accuracy further</h2>
<p>If you want to <a href="https://all3dp.com/2/3d-printer-tolerance-test-and-improve-your-3d-printer-s-tolerances/" rel="nofollow noreferrer">go further</a>, proper calibration of the <a href="https://all3dp.com/2/how-to-calibrate-a-3d-printer-simply-explained/" rel="nofollow noreferrer">motion system</a> and the <a href="https://all3dp.com/2/extruder-calibration-6-easy-steps-2/" rel="nofollow noreferrer">extruder</a> are the next steps.</p>
<h3>Short Calibration Rundown</h3>
<p>The rundown is extruder first, then possibly the axis.</p>
<ul>
<li>Connect your printer to the PC with an interface such as Pronterface or Repetier Host.</li>
<li>Place a mark 150 mm from the intake of the printer</li>
<li>Extrude 100 mm via <code>G1 E100 F100</code></li>
<li>Measure from the intake to the mark.</li>
<li>Get the current steps per mm via <code>M503</code> - it is the E-entry that follows <code>M92</code></li>
<li>Calculate <span class="math-container">$\frac {\text{current steps per mm }\times 100}{150 - \text {remaining length}}=\text {new steps per mm}$</span></li>
<li>Set the new steps per mm via <code>M92 E###.#</code> and save with <code>M500</code>, verify with <code>M503</code>.</li>
</ul>
<p>The process for the XYZ axis is pretty much the same, but you don't need to mark filament. Instead, print a known size cube, best with a side length that is a multiple of 10 mm.</p>
<ul>
<li>Calculate <span class="math-container">$\frac {\text{current steps per mm }\times \text{ designed length}}{\text {actual length}}=\text {new steps per mm}$</span></li>
</ul>

CC BY-SA 4.0
2019-04-04T01:09:24.787Z
Thanks for the detailed information on calibration. I'm pretty sure no X/Y/Z steps-per-mm calibration is needed, or the absolute error would vary proportional with cube size, rather than being constant with respect to it. Extruder error seems possible though.
R.. GitHub STOP HELPING ICE
CC BY-SA 4.0
2019-04-04T01:09:39.057Z
When you wrote "Extrusion/Flow Multiplier 100 %" under the first heading, did you mean 110%?
R.. GitHub STOP HELPING ICE
CC BY-SA 4.0
2019-04-04T01:36:35.487Z
No, I meant 100% & 0.44 mm
Trish
CC BY-SA 4.0
2019-04-04T03:43:55.647Z
Ah, so increasing the line width tells Cura to increase the extrusion to fill that width, but also causes it to space paths according to the new width (rather than just extruding more material along the same paths like increasing the flow % would do)? That sounds interesting. I'll try it.
R.. GitHub STOP HELPING ICE
CC BY-SA 4.0
2022-02-28T08:13:21.713Z
steps/mm for XYZ should not be measured but rather calculated based on belt pitch and pulley diameter. Nothing in the printer allows for variable steps/mm. If you calibrate it you will worsen it for any part which is not the calibration part.
FarO
CC BY-SA 4.0
2019-04-03T00:41:17.060Z
2019-04-03T06:35:50.287Z
2020-06-18T08:29:41.667Z
Trish
<p>This problem seems to have mostly gone away - at least any remaining error is within a margin explainable by my cheap/low-quality digital caliper. Since asking the question, I've made a lot of changes that could contribute, but the biggest factor was probably the loose X-axis timing belt and <a href="https://3dprinting.stackexchange.com/a/10137/11157">misaligned X-axis</a>.</p>

<p>Slicer options may also have been involved. For example, Cura's Ender 3 profile attempts to set limits on acceleration speeds, but does so in a way that requires the GUI to compute derived accelerations; if you're using the command line CuraEngine (which I am), all the derived settings are left at the very high defaults.</p>

CC BY-SA 4.0
2019-06-08T20:02:38.760Z
2019-06-08T20:02:38.760Z
R.. GitHub STOP HELPING ICE
<p>I'm having a problem where the relative dimensional error of cylinders is rapidly increasing as the absolute size decreases. Printing a calibration stack of cylinders of diameters 8, 7, 6, 5, 4, and 3 mm, they come out undersized by 5%, 5.3%, 7%, 8%, 10%, and 13%, respectively, as measured by a digital caliper. Cubes exhibit a less severe version of the same pattern: 2.5%, 3%, 5%, 4%, 5%, 7%. The cylinders are generated with OpenSCAD using <code>$fn=180</code>, i.e. they're actually extrusions of 180-gons, so the error should not be caused by poor chord approximation; indeed, measuring projections of the model, or reading the gcode and accounting for nozzle width, everything looks right.</p>

<p>Printer is Ender 3, using PLA at 210. Slicing with CuraEngine.</p>

<p>Could this be caused by underextrusion or print speed issues - or some effect where the material pulls itself together under tight curvature? What techniques might be able to compensate for it, short of fudging the model?</p>

<p>Some additional information: As noted by Trish in the comments, the consistency of the absolute error, which is 0.4 for cylinders and 0.2 for cubes, is likely important. I've also subsequently tested with 110% extrusion rate and the errors for the cylinders dropped to consistently 0.2 mm (still a significant increasing relative error), but the skin layers at the top of the 3 mm cylinder bulged, suggesting the increased extrusion is wrong - an excessive total volume of material.</p>

CC BY-SA 4.0
2019-04-02T22:03:19.210Z
what are the *absolute* errors?
Trish
CC BY-SA 4.0
2019-04-02T22:18:29.820Z
@Trish: The percent errors were just 1.0-measured_size/ideal_size. The absolute errors were all very close to 0.4 mm for the cylinders, 0.2mm for the cubes.
R.. GitHub STOP HELPING ICE
CC BY-SA 4.0
2019-04-02T22:20:16.647Z
That is important info, R.. Becasue the *absolute* error never changes.
Trish
CC BY-SA 4.0
2019-04-02T22:22:51.317Z
@Trish: Indeed, I overlooked that it was near-constant, but I don't have any good explanation/model for why a constant error in dimensions would happen. It could likely be compensated by Cura's `xy_offset` setting, but that's going to be wrong because it will give holes an extreme error in the opposite direction (holes are *also* smaller than they should be).
R.. GitHub STOP HELPING ICE
<print-quality><calibration><creality-ender-3>
Progressively worse relative size error at smaller absolute sizes
R.. GitHub STOP HELPING ICE
# Progressively worse relative size error at smaller absolute sizes

(Asked by: username_0 on 2019-04-02)

I'm having a problem where the relative dimensional error of cylinders is rapidly increasing as the absolute size decreases. Printing a calibration stack of cylinders of diameters 8, 7, 6, 5, 4, and 3 mm, they come out undersized by 5%, 5.3%, 7%, 8%, 10%, and 13%, respectively, as measured by a digital caliper. Cubes exhibit a less severe version of the same pattern: 2.5%, 3%, 5%, 4%, 5%, 7%. The cylinders are generated with OpenSCAD using `$fn=180`, i.e. they're actually extrusions of 180-gons, so the error should not be caused by poor chord approximation; indeed, measuring projections of the model, or reading the gcode and accounting for nozzle width, everything looks right.

Printer is Ender 3, using PLA at 210. Slicing with CuraEngine.

Could this be caused by underextrusion or print speed issues - or some effect where the material pulls itself together under tight curvature? What techniques might be able to compensate for it, short of fudging the model?

Some additional information: As noted by Trish in the comments, the consistency of the absolute error, which is 0.4 for cylinders and 0.2 for cubes, is likely important. I've also subsequently tested with 110% extrusion rate and the errors for the cylinders dropped to consistently 0.2 mm (still a significant increasing relative error), but the skin layers at the top of the 3 mm cylinder bulged, suggesting the increased extrusion is wrong - an excessive total volume of material.

**Tags:** print-quality, calibration, creality-ender-3
> **Comments:**
> **username_1**: what are the *absolute* errors?  
> **username_0**: @Trish: The percent errors were just 1.0-measured_size/ideal_size. The absolute errors were all very close to 0.4 mm for the cylinders, 0.2mm for the cubes.  
> **username_1**: That is important info, R.. Becasue the *absolute* error never changes.  
> **username_0**: @Trish: Indeed, I overlooked that it was near-constant, but I don't have any good explanation/model for why a constant error in dimensions would happen. It could likely be compensated by Cura's `xy_offset` setting, but that's going to be wrong because it will give holes an extreme error in the opposite direction (holes are *also* smaller than they should be).  

---

## 4 answers

### Answer by username_0 on 2022-02-24. Score: 1 | Accepted answer

I've had this problem recurringly after marking this solved before, so I'm writing a new answer to revisit it.

Based on the magnitude of the error being absolute rather than relative, and not being direction-dependent (i.e. not backlash), it can't be caused by the motion system. I further ruled out inward warping of the material by running tests with 100% infill. When, even at 100% infill, the diameter (thus volume of material) was too low, the only remaining explanation was underextrusion.

Measuring the theoretical rotation distance of my extruder hob (now a different extruder from the original Ender 3 one), accounting for approximate tooth depth along with a precise hob diameter measurement, I got a value 15% lower than my configured value (E-steps 15% higher). I was already aware there was a discrepency here, just not the magnitude, and had purposefully kept it lower because of concerns that the full value would lead to parts that don't fit, due to imperfections in the walls, and especially that it might make the undersized holes problem worse.

In reality, it's done the opposite. The best explanation I can come up with for fixing holes is that, for extrusion widths narrower than the nozzle (which a 15% under-extruded 0.4 mm line is, since it's only about 0.34 mm), the line does not stay centered well, but gets dragged with the direction of curvature. I think I still have some problems with holes being slightly undersized, but they're at least no worse, and seem slightly better.

As for positive cylinders, at 5 mm, printed diameter is nearly perfect, only under by about 40-50 µm, which is very acceptable and better than being over. Getting this result does depend on having a 100% solid part, though; as soon as infill comes into play, the cylinder is undersized again. Setting Cura's "Minimum Infill Area" high enough, or using enough walls to ensure the cylinder will be solid, can ensure 100% fill without printing the whole part at 100% infill.

So, I think I can conclusively say the main likely cause for this problem is underextrusion due to inaccurate E-steps.


---

### Answer by username_2 on 2019-04-02. Score: 4

You should not look at the relative dimensional differences, you should be looking at the absolute differences. Multiplying the undersized dimensions in percentage with the cylinder diameter gives you a value of 0.4  mm for each cylinder give or take a few hundreds. So, basically your printer works very consistent it is just suffering from a systematic offset.

Basically, the printing process needs to
adjust the X-Y dimensions to compensate for plastic flow effects. An option or setting in Ultimaker Cura to counteract this is called `Horizontal﻿ ﻿Expansio﻿n`. Slic3r and Simplify3d have similar settings. In Slic3r it is called `XY size compensation`.

> **Comments:**
> **username_0**: Unfortunately, the effect happens in the opposite direction with the opposite curvature: holes are too small. Adjusting `xy_offset` with a positive value will make that even worse. It seems likely that fixing this might require enhancing the slicer to take local curvature into effect when applying an offset.  
> **username_2**: @R..R Filament could well be dragged before it sets explaining the smaller radius  
> **username_0**: Yeah, my thought is that something like that is happening to make the error happen in the direction of the curvature - either dragging or some sort of surface-tension like force in the material.  
> **username_1**: you can set a *negative* size compensation  
> **username_0**: @Trish: Right, but that will make the problem described here worse. There's some small constant negative compensation needed for die swell, plus what seems to be a curvature-dependent compensation that would be large and positive for inward curvature and unknown (since I haven't yet measured) magnitude negative for outward curvature.  

---

### Answer by username_1 on 2019-04-03. Score: 3

The increase of the *relative error* is not an anomaly, it is a direct result of what is the actual error: There is a systematic, **absolute error**, which is almost the same for all the cylinders and all the cubes. +0.2 mm or +0.4 mm on progressively smaller items gets a progressively bigger relative error. But the source of the absolute error is what you need to compensate for.

## Fighting bulging for 0.2 mm accuracy

As you figured out that 110% extrusion did halve the absolute error of the cylindrical test, in conjunction with layer deformation, I suggest to try this:

* Extrusion/Flow Multiplier 100 %
* Linewidth 0.44 to 0.45 mm

This fights the die swell but also spaces the walls and roofing lines, allowing them to take the extra material. 0.2 mm accuracy is pretty good for a start, you get into the specs of many parts with that, but we want more!

For a slight increase, measure your filament in a couple of spots and do the average, then use that as filament diameter.

## Increasing Accuracy further

If you want to [go further](https://all3dp.com/2/3d-printer-tolerance-test-and-improve-your-3d-printer-s-tolerances/), proper calibration of the [motion system](https://all3dp.com/2/how-to-calibrate-a-3d-printer-simply-explained/) and the [extruder](https://all3dp.com/2/extruder-calibration-6-easy-steps-2/) are the next steps.

### Short Calibration Rundown

The rundown is extruder first, then possibly the axis.

* Connect your printer to the PC with an interface such as Pronterface or Repetier Host.
* Place a mark 150 mm from the intake of the printer
* Extrude 100 mm via `G1 E100 F100`
* Measure from the intake to the mark.
* Get the current steps per mm via `M503` - it is the E-entry that follows `M92`
* Calculate $\frac {\text{current steps per mm }\times 100}{150 - \text {remaining length}}=\text {new steps per mm}$
* Set the new steps per mm via `M92 E###.#` and save with `M500`, verify with `M503`.

The process for the XYZ axis is pretty much the same, but you don't need to mark filament. Instead, print a known size cube, best with a side length that is a multiple of 10 mm.

* Calculate $\frac {\text{current steps per mm }\times \text{ designed length}}{\text {actual length}}=\text {new steps per mm}$

> **Comments:**
> **username_0**: Thanks for the detailed information on calibration. I'm pretty sure no X/Y/Z steps-per-mm calibration is needed, or the absolute error would vary proportional with cube size, rather than being constant with respect to it. Extruder error seems possible though.  
> **username_0**: When you wrote "Extrusion/Flow Multiplier 100 %" under the first heading, did you mean 110%?  
> **username_1**: No, I meant 100% & 0.44 mm  
> **username_0**: Ah, so increasing the line width tells Cura to increase the extrusion to fill that width, but also causes it to space paths according to the new width (rather than just extruding more material along the same paths like increasing the flow % would do)? That sounds interesting. I'll try it.  
> **username_3**: steps/mm for XYZ should not be measured but rather calculated based on belt pitch and pulley diameter. Nothing in the printer allows for variable steps/mm. If you calibrate it you will worsen it for any part which is not the calibration part.  

---

### Answer by username_0 on 2019-06-08. Score: 0

This problem seems to have mostly gone away - at least any remaining error is within a margin explainable by my cheap/low-quality digital caliper. Since asking the question, I've made a lot of changes that could contribute, but the biggest factor was probably the loose X-axis timing belt and [misaligned X-axis](https://3dprinting.stackexchange.com/a/10137/11157).

Slicer options may also have been involved. For example, Cura's Ender 3 profile attempts to set limits on acceleration speeds, but does so in a way that requires the GUI to compute derived accelerations; if you're using the command line CuraEngine (which I am), all the derived settings are left at the very high defaults.


---

