Recently, I have been experiencing a lot of layer shifts on my 3D prints. So I am writing this post more to document what was done to solve the layer shift issue.
Just some background. The printer in question is an Ender-3, running a Titan Aero direct drive. It uses the
MRR ESPE board with TMC2130 drivers on X and Y axes. The firmware used is Marlin bugfix-2.0.x.
I started to get layer shifts toward the end of last year when I started to test out Marlin bugfix-2.0.x integrated with ESP3DLib. So my first suspect was the newer versions of Marlin.
It turns out Marlin now enables junction deviation by default, while my slicer settings are more tuned for classic acceleration and jerk control. I was not very sure how junction deviation would affect my prints, but to be safe, I turned that off by enabling classic jerk control.
But that did not solve the layer shifts. So I thought, could it be the motor current that I set for X and Y axes? At 800mA for both X and Y (the default in Configuration_adv.h), my motors can get quite hot to the touch. So I lowered them to various values, and eventually settled on 600mA. (See explanation further below).
Yet that did not help much, although I seem to have limited layer shifts to the X axis only. So I checked my belts, and realized the X motor belt was a bit loose. So I tried my best to tighten it, and managed to get a decent print.
Time to add those belt tensioners to the X and Y axes, or at least the X axis.
More about motor current. On A4988 stepper drivers, the Vref allows setting of max current. This should be below the rated current of the motor, and a good recommendation is 80% of the rated current. However, on TMC2130, it seems the motor current setting is for setting RMS current. Which is peak current divided by 1.41. So if the max current is 1.0A, and you want to run at 80%, which means a peak current of 0.8A, the RMS current should be 0.567A.
On the Ender-3, after quite a bit of Googling around, it seems to suggest that the motors I have for X and Y are only rated for 0.9A! A setting of 800mA on the default firmware settings would give a peak current of 1.128A, which was probably why my motors were running hot. I ended up setting it at 600mA, which gives a peak current of 846mA. That is below the rated 900mA, but still more than the 80%. However, I thought I needed that extra juice because of the heavy bed on Y axis, and the heavier X gantry due to the direct drive setup. For those interested, my X and Y motors have "BJ42D15-26V02" on them, and should correspond to Creality3D's 42-34 stepper motors.
BTW, on Chinese A4988 drivers, the Rsense value is usually 0.1 ohm instead of the 0.05 ohm on original Watterott drivers. A quite and easy way to determine Vref for Chinese A4988 drivers is to multiply the peak current by 0.8. So if you want a peak current of 0.8A, you should set Vref to 0.64V.
Be sure to check your Rsense value; a Vref of 0.64V will give a peak current of 1.6V if the Rsense value is 0.05 ohms!