Was mir zunächst mal aufgefallen ist, dass Du nur mit dpSteps() arbeitest. Das ist etwas fehlerträchtig - zumindest können dir da die MobaTools ncht helfen, immer exakt zu positionieren. Wenn Du deine Zielposition pos bestimmt hast, kannst Du doch den MobaTools einfach sagen, er soll dorthin fahren writeSteps( lengthToStepsLong(pos) )
Das hin-und herrechnen zwischen float und long macht es nicht genauer. Berechne deine Zielposition immer in float, und zum Positionieren einmal in steps umrechnen und an myStepper.writeSteps() übergeben. Die notwendigen Schritte um von der aktuellen Positon zur Zielposition zu kommen berechnen die MobaTools.
Warum beim Freifahren/Zurückfahren nicht die Ausgangsposition erreicht wird, kann ich so nicht erkennen. Wenn sich die MobaTools schon bei so kleinen Schrittzahlen verzählen würden, wäre das sicher schon aufgefallen.
P.S. Das hier:
const int stepsUmdrehung = 1600; //Anzahl Schritte pro Umdrehung
...
const float motorSpeed = 1200;
...
myStepper.setSpeed(motorSpeed); / / = 120 U/Min
führt zu Stepraten, die die MobaTools auf einem AVR standardmäßig nicht erreichen können, und auf 2500 Steps/Sec begrenzt werden. Wenn Du wirklich die 3200Steps/sec benötigst, musst Du in MobaTools.h etwas 'tunen'.
P.P.S. Du liebst die blockierende Programmierung. Bei so einer Maschine halte ich das für keine gute Idee. Da sollte das System jederzeit auf Sensorsignale reagieren können.