I wanted to measure how much backlash my CNC has. For today, I’m measuring the backlash in the Z axis, because it’s the easiest, and also because it came fully assembled and there wasn’t much of an opportunity for me to mis-assemble it and screw things up.

As with my previous post on measurements, I’m measuring using a Mitutoyo 543-302b digital dial indicator. Mitutoyo claims that it’s good for 3 microns (0.003 mm) of repeatability, and I was able to match or exceed that during previous tests. I’m using Mitutoyo’s USB cable to pull measurements directly from the indicator into the computer.

My Z axis is a Beaver HDZ. It’s being driven by a Leadshine CS-M22331-L closed-loop stepper motor which has around 2.5 microns of encoder resolution and (as currently configured) a 6 micron pulse size. That is, the smallest unit that my CNC controller can tell the stepper to move right now is about 6 microns, but the underlying hardware tracks and adjusts its motion a bit more accurately than that.

I told the CNC to move its Z axis up and down a tiny amount (0.2mm), broken into 0.003mm (3 micron) steps. After each step, I recorded the height that the CNC was supposed to be at, as well as the height indicated by the dial indicator. Once it reached 0.2mm, I reversed direction and dropped back down to the start point. Then I repeated this 2 more times.

Here’s a graph that shows intended vs actual height over all 3 iterations. The X axis is simply time, indicated by the step number.

Intended vs Measured Position.

Looking at the underlying data, it’s clear that the stepper has roughly a 6 micron step size. Each step in my test gcode is 3 microns, and it consistently moves every other step. Interestingly, Grbl seems to report back its actual location factoring in stepper resolution, because the Z location logged also moves by 6 microns every other step, not by 3 each step.

The slope between the two lines on the graph isn’t exactly the same, and that’s okay–the dial indicator wasn’t perfectly aligned, so there’s a bit of cosine error over time. I’m really more interested in the shape of the graph, and especially the shape of the difference between the two lines.

Here’s the difference between the two lines, normalized to be centered on 0:

Normalized difference between intended and measured location.

Notice the step in the delta every time it changes direction. That’s backlash. It looks like there’s around 13 microns of backlash in my Z axis, or 0.0005”.

Out of curiosity, I re-ran this test again, but switched my Z stepper from 800 steps per rotation (4 microsteps) to 3200 steps per rotation (16 microsteps). I adjusted my CNC controller to match, so that all features still had the correct size.

The first thing that I noticed is that it went from moving 6 microns every other step to roughly 3 microns every step. This is visible in the location graph; it’s less pixelized:

Locations, with 4x the stepper resolution.

The backlash graph is also a bit less pixelized, which lets me measure the backlash more accurately. I get about 15 microns here:

Differences, with 4x the stepper resolution.

Other than the backlash, though, increasing the microstepping from 4 to 16 actually does seem to give more accurate movement, at least until backlash gets in the way. I’ve seen people claim that it doesn’t actually provide any extra resolution, but that’s clearly not the case with my hardware.

Next up: testing the X and Y axes.