Вложение:
reference.png [ 8.47 КиБ | Просмотров: 6868 ]
Код:
#ifndef COREXY
// default non-h-bot planning
block->steps_x = labs(target[X_AXIS]-position[X_AXIS]);
block->steps_y = labs(target[Y_AXIS]-position[Y_AXIS]);
#else
// corexy planning
// these equations follow the form of the dA and dB equations on http://www.corexy.com/theory.html
block->steps_x = labs((target[X_AXIS]-position[X_AXIS]) + (target[Y_AXIS]-position[Y_AXIS]));
block->steps_y = labs((target[X_AXIS]-position[X_AXIS]) - (target[Y_AXIS]-position[Y_AXIS]));
#endif
target[X_AXIS]-position[X_AXIS] это дельта X
target[Y_AXIS]-position[Y_AXIS]) это дельта Y
block->steps_x это дельта A, т.е. количество шагов, которое должен крутнуть мотор X
block->steps_y это дельта B, т.е. количество шагов, которое должен крутнуть мотор Y
В target и position записывается произведение перемещения (в мм) на количество шагов на мм.
target - текущее положение
position - куда надо переместиться.
labs - модуль числа, как я понял (какая-то библиотечная функция)
Дальше решаем уравнение
A = |xt*x - xp*x + yt*y - yp*y|
B = |xt*x - xp*x - yt*y + yp*y|
xt и yt текущее положение, пусть 0
px и py куда переместить, пусть xp=1 yp=0, перемещение по X на 1 мм
A = |xt*x - xp*x + yt*y - yp*y| = |0 - 1*x + 0 - 0| = x
B = |xt*x - xp*x - yt*y + yp*y| = |0 - 1*x - 0 + 0| = x
Должно быть |A| = |B| при перемещении по x или y. Так и есть.
Можно подставить любое перемещение в том числе диагональное (x+1, y+1). Для этого B должно быть равно 0. Это возможно только при x = y
Итого имеем, чтобы крутнуть по X на 1 мм, нужно крутнуть двигатель X и Y на x шагов. Этот x шагов и указывать в DEFAULT_AXIS_STEPS_PER_UNIT
Т.е. никакого отличия от стандартной схемы быть не должно. Проверяйте расчёты. Для оси X и Y должно быть одинаковое число шагов на мм. Иначе движение по диагонале будет неверным