Что ж, с обновлением используемого вами API я вижу это так. Вы получили желаемую скорость v [mm/s]
и дельты dx,dy [mm]
для перемещения и пошаговые размеры mx,my [mm/step]
затем:
Итак, мы знаем, что:
a=atan2(dy,dx);
vx=abs(v*cos(a)/mx);
vy=abs(v*sin(a)/my);
, где vx,vy [step/s]
- отдельные скорости двигателя, а [step/s]
- это частота в [Hz]
. Это просто пифагорейский треугольник, в котором отношения скоростей [mm/s]
между осями x, y и общей скоростью v
совпадают с длинами треугольников, поэтому sin,cos
применяется к ним таким же образом. Я только что добавил преобразование [mm/s] -> [step/s] = [Hz]
. У меня также abs
результат, поскольку у вас дельты уже есть знаки ... По той же причине вы также можете использовать atan
вместо atan2
a=atan(dy/dx);
но не забывайте обрабатывать крайние случаи, когда dx
близок к zero
!!!
В случае, если размеры вашего шага инвертированы [step/mm]
, вы просто умножаете вместо деления на них.
Также, если у вас нет гониометрии или вы не хотите ее использовать, вы можете использовать для этого сходство треугольников:
l = sqrt( dx^2 + dy^2 )
sin(a) = dy/l
cos(a) = dx/l
так:
vx=abs((v*dx)/(l*mx));
vy=abs((v*dy)/(l*my));
, который вычисляется также на целых числах и должен также быть более быстрым и более точным для вычисления ... Опять остерегайтесь деления на ноль (точка вместо линии), просто установите скорость в таком случае (l==0
) равной нулю для обоих осях.