V2 uses a completely new motion engine that has nothing in common with V1. That is one of the 2 biggest changes (modular system is the second). So different behaviour will come from this. I have to think about the why. It is done in MotionLevel2 where you have
FOR_ALL_AXES(i) {
if (actM1->axisUsed & axisBits[i]) {
pos[i] = actM1->start[i] + sFactor * actM1->unitDir[i];
} else {
pos[i] = actM1->start[i];
}
}
that gives the next planned target position in global coordinates. Then
fast8_t nextMotorIdx = 1 - lastMotorIdx;
int32_t* np = lastMotorPos[nextMotorIdx];
int32_t* lp = lastMotorPos[lastMotorIdx];
PrinterType::transform(pos, np);
Gets last integer position and updates next integer position. Looking into it I see in PrinterTypeCoreXYZ.cpp
void PrinterType::transform(float pos[NUM_AXES], int32_t motor[NUM_AXES]) {
float px = lroundf(pos[X_AXIS] * Motion1::resolution[X_AXIS]);
float py = lroundf(pos[Y_AXIS] * Motion1::resolution[Y_AXIS]);
float pz = lroundf(pos[Z_AXIS] * Motion1::resolution[Z_AXIS]);
motor[X_AXIS] = COREXYZ_X_X * px + COREXYZ_X_Y * py + COREXYZ_X_Z * pz;
motor[Y_AXIS] = COREXYZ_Y_X * px + COREXYZ_Y_Y * py + COREXYZ_Y_Z * pz;
motor[Z_AXIS] = COREXYZ_Z_X * px + COREXYZ_Z_Y * py + COREXYZ_Z_Z * pz;
for (fast8_t i = E_AXIS; i < NUM_AXES; i++) {
motor[i] = lroundf(pos[i] * Motion1::resolution[i]);
}
}
could be the problem. First rounding to steps and then interpolate might be the wrong order. Can you replace it with
void PrinterType::transform(float pos[NUM_AXES], int32_t motor[NUM_AXES]) {
motor[X_AXIS] = lroundl((COREXYZ_X_X * pos[X_AXIS] + COREXYZ_X_Y * pos[Y_AXIS] + COREXYZ_X_Z * pos[Z_AXIS]) * Motion1::resolution[X_AXIS]);
motor[Y_AXIS] = lroundl((COREXYZ_Y_X * pos[X_AXIS] + COREXYZ_Y_Y * pos[Y_AXIS] + COREXYZ_Y_Z * pos[Z_AXIS]) * Motion1::resolution[Y_AXIS]);
motor[Z_AXIS] = lroundl((COREXYZ_Z_X * pos[X_AXIS] + COREXYZ_Z_Y * pos[Y_AXIS] + COREXYZ_Z_Z * pos[Z_AXIS]) * Motion1::resolution[Z_AXIS]);
for (fast8_t i = E_AXIS; i < NUM_AXES; i++) {
motor[i] = lroundl(pos[i] * Motion1::resolution[i]);
}
}
this postpones integer conversion to last time. I think this is the more correct approach.