Correct dimensional accuracy

Basic Information:

Printer Model:
Ender 3
MCU / Printerboard:
Mini SKR v1.2

Describe your issue:

I want to fix the dimensional accuracy of my printer. Right now, it’s not accurate at all. On Marlin you do this with esteps, but when i google for it i find rotational and every manual i find is about the extruder, not the x/y/z part. The manual given by klipper doesn’t make much sense to me as it assumes you take the given parts by the manufacturer and just go with it, not accounting for it being inaccurate. My calibration cube is off by roughly .4mm on all sides. That’s a lot. I want to fix that and I can’t find a good guide on how to do that.

Check Dimensional accuracy problem for a lengthy discussion on this subject.

1 Like

I’m trying to fix the standard issue of slight inaccuracy. With marlin you need to fix the steps/mm on every ender style printer due to inaccuracy. You calibrate XYZ just like you calibrate the extruder. After reading through the entire thread twice, it seems that the final solution there is “sorry you can’t fix that, don’t try to fix it, don’t touch it”, where this is a common thing to fix. Guess I need to start experimenting instead of following a guide.

This might be very well a shrinkage problem as, unlike the mentioned post, I don’t have this in a single axis, but in all axis. That’s why correcting this is so common.

First of all, don’t measure your printout, because that can shrink and ooze and bulge and whatnot. Instead measure your gantry/printhead directly.

E.g., like so:

  1. make sure your toolhead is at least 100 mm from the left
  2. add a clamp to the X-axis so that it touches the printhead
  3. from the UI move the printhead X -100 mm
  4. now you measure the distance between the clamp and the printhead

And similarly for Y and Z.
Now, if this still is off by a multiplier then ignore ReXT3D’s claim to “NEVER change X/Y, A/B, Z, etc. rotation_distance”, because that’s in fact exactly what you should do, because you have measured the very mechanical properties he’s talking about and they’re off.

Now, once that’s correct then whatever errors are turning up in your prints are because of filament-specific issues such as shrinking, so that should be handled in your slicer, using various compensation parameters, such as Cura’s “Walls → Horizontal Expansion”.

1 Like

What is the magnitude of the inaccuracy that you’re seeing?

The Ender 3 will have some X/Y inaccuracies due to how the belts are implemented (ie they’re not always parallel) and the inaccuracies are not linear and will change with the position of the gantry and print bed.

For example, when the gantry is in the center, you will get most accurate movement because the belt is closest to parallel and the angle the belt is off is even at both sides. When the gantry is at an extreme, the belt closest to the edge will be at a much larger angle than the other side and will move less than if the gantry is at the middle (it’s a cosine error - a movement of the hypotenuse, the belt itself, will move more than the adjacent side, the V-Slot rail with wheels).

I did some measuring and calculations once out of interest and you can get 0.3mm to 0.5mm errors (depending on the print bed size) in movement at the edges compared to the center of the bed where the errors will be on the order of a hundredth of a millimeter.

How do you propose to calibrate the movement considering that the errors are non-linear? I’m not sure what you mean by this being a “standard issue”.

Also note that the print itself will shrink, grow, warp for a variety of reasons (cooling, uneven cooling, humidity, phase of the moon, etc.) - what exactly are you looking for? I suggest that you read the link that @sineos suggested.

1 Like

While measuring the gantry / mechanics is certainly better than measuring a print, it is still not what you should do:

  • With a regular caliper you will hardly ever be able to accurately measure the actual mechanics
  • You’d at least would need an accurate dial gauge and here again not one with typical 10mm range but one with at least 150mm range
  • Even with such a dial gauge you need to go an extra mile to make sure that your measuring error, e.g. through angle deviation / not being 100% perpendicular etc, is not way greater than the deviation you are fighting.

And then again why you should not do it:
If you do it properly you will realize that your deviation typically is position and length dependent

  • Measuring between X=0 and X=100 will yield one result, between X=100 and X=200 yet another
  • Measuring between X=20 and X=40 or X=40 and X=60 will produce a 3rd and 4th result
  • Even repeating the same as above at Y=0 and Y=100 might come to different results

What is the reason?

  • Unless great care is taken you will have some sort of mechanical imperfections
  • Some of the imperfection are even non-linear, e.g. the first 100mm of an extrusion profile are straight, the second 100m are slightly twisted / skewed
  • Your frame is is not 100% perpendicular / parallel
  • Your belt paths are not 100% straight and parallel to each other
  • etc

The Ender 3 is a perfect example for this as it has a design flaw with respect to its belt paths (check above link)

But in any case, it is your printer:

  • go ahead and tune whatever you like
  • produce nice reddit show-offs with a perfect 20.0000000000mm calibration cube
  • (cry silently in your bed that your 150mm print is like a mile off)

Just do not, @marcus-in-3d, lead the people into believing that it will just easily work with such generic claims.


My solution to the Creality X belt routing geometry issue, in this case applied on my CR-10S Pro. It works like a charm, although it adds a bit of additional flex to the system as the belt tension is compressing up to three layers of the belt. But I have not seen any practical artifacts associated with it.

The “proper” solution would be a custom designed X trolley…

Yes, this is all true. And you are absolutely correct. However, if you have a consistent error, and you have whatever tools you have, then measuring the hardware (preferably, as you correctly pointed out, at multiple points, and then averaging between those) will be the optimal thing to do.

After all, the error might not be because of weird Al-extrusion imperfections or POM-wheel eccentricities or whatnot, but it could be because your belt or your belt gear is slightly too thick or thin, and thus cause a systematic error, and this should be compensated for exactly in the steps configuration.

But yes, you should first figure out if your error is indeed systematic, by measuring at multiple points. If you get that X 0-20 is off one way and X 20-40 is off the other way, or if Y 0-150 is off by one value at one point, but later it’s off by a completely different value, then the error is indeed in something more or less unpredictable, so changing your steps config might not be helpful at all.

And yes, of course X and Y are handled independently on a bedslinger.

I didn’t say it’s easy. But it will likely be more accurate than calibrating based on a printed part, using the same measuring instrument. (That is, after verifying that it’s systematic, as per above.)

E.g., when I do this on my bedslinger (which is the type of printer this was about) the printed part is off by 0.2 mm at 150 mm (measuring 149.80 mm), but when I measure the toolhead or bed directly with the very same caliper it’s off by no more than 0.02 mm. So I can conclude that my hardware steps are defined more or less correctly, and the error in the printed part comes from other problems.

Now, at 100 mm my printed part is off by about 0.07 (measuring 99.93), at 50 mm it’s also off by about 0.07 but the other way (measuring 50.07), and at 5 mm it’s off by 0.18 (measuring 5.18 mm). Now, this tells me that this particular filament, printed with these settings, needs a shrinkage compensation (i.e., a size multiplier, m=1.00263 ((150-5)/(149.8-5.18))), and some negative horizontal compensation (i.e., an expansion constant, e=-0.097 ((5-5.18*m)/2).
And we can verify how well these numbers fit the measured values:
99.93*m + 2*e = 99.999
50.07*m + 2*e = 50.008
(and the 149.8 and 5.18 will of course match perfectly, because m and e were derived from these measurements).

However, all these measurements were taken after I had corrected my rotation distance/esteps. In the beginning they were off by a factor of 2, so when I moved X 20 mm it actually moved 40 mm. Instead of using a scale multiplier of 0.5 (or 0.5013 after printout calibration) I really, really needed to correct the rotation distance/esteps first of all. And if I change some gears or switch to a much thicker belt I will have to re-calibrate the rotation distance/esteps.

Wow! Really? How could anyone be so bad at hardware design that they would do something that stupid? This is way past chabuduo. Surely that was corrected in the very first hardware revision upgrade and can’t possibly be in any currently sold models. I’m just… I can’t even… :exploding_head:

It’s an engineering trade off - the Ender 3 approach (and I doubt it was the first) was for economy and accepting that these errors wouldn’t be noticed or affect the user’s satisfaction with the printer.

Surely that was corrected in the very first hardware revision upgrade and can’t possibly be in any currently sold models.

The basic design (with this issue) is still there and in many printers like it:

Again, what do you expect in terms of accuracy? 0.3mm to 0.5mm at 100mm is a 30ppm error - not too shabby when you look at it this way.

The Ender 3 and the various clones/copies are great basic printers that meet most user’s needs. If you need better accuracy than that, then you need to look elsewhere and, in all honesty, it won’t be in any kind of plastic. I’ve been around plastics for products for 40+ years and you’re not going to get accuracy below 10 microns, no matter what you do and getting to 10 microns is very, very expensive and requires very experienced engineering talent.

1 Like

I can agree with a lot of what you have written, @marcus-in-3d
Just for sake of clarity:

Hardware influences

  • rotation_distance is determined by the mechanical components, i.e.
    • Pitch of the belt (not thickness)
    • Teeth count / diameter of the pulleys
    • Pitch / Start / Lead of a lead-screw
    • Step angle of the stepper motor
  • These values are immutable and given that the components have a half way decent quality should not lead to any systematic errors and are calculated by pure math → There is in consequence, nothing to really tune
  • “Mutable influences” like skew, lack of perpendicularity / parallelism, run-out etc are often non-linear and will cause length and position dependent errors → Equally nothing to tune because getting it right in one spot, will throw it off in another
  • Personal note: I have a (expensive) 150mm dial gauge. I have taken my printer to the company I work and put it on a coordinate measuring machine (depressing experience btw) in an attempt to average out these influences → Meanwhile I have given up on it

Extrusion influences

  • There is an abundance of influences that are tied to material and the extrusion system
    • Material shrinkage
    • Temperature
    • Extrusion factor
    • Line sequence, e.g. which type of line (inner walls, outer walls, infill etc) you print in which order
  • These are systematic influences and can be (should be!) tuned / dial in
1 Like

Yes, you’re right. (I’ve been dealing with teethless belts lately, much like the Y belt on printers like the CR-30, and there the belt thickness matters, but yes, not in a bedslinger.)

IMO that’s very shabby. Truly.
Even my cheap Artillery Genius has its X belt only 0.1-0.2 mm further away at the print head than at the ends. This results in way, way, way less than half a mm error at 100 mm.

Is it, tho? Why not design it in such a way that the end wheels can be adjusted so that the belt is parallel? Or at the very least, if you can’t make the parts precisely enough to make the belt very close to parallel then at least you can make them loose enough so that they can be adjusted before tightening everything down.

I absolutely believe you! In fact, I wouldn’t expect accuracy below 20 μm. But 500 μm, as you wrote above, would be way too bad. At least for me.