2 шаговый ЧПУ неточный

Я строю простой станок с ЧПУ, который просто пишет письма. Он использует 2 степпера для оси x и y.

Вот как это работает

  1. генерируйте буквы в c# и преобразуйте их в список строк
  2. отправить в arduino mov_xy line.x line.y как строка для каждой строки
  3. на arduino преобразуйте в int, умножьте на шаги на мм и запустите с помощью speedy stepper

В конечном итоге это приводит к проблемам точности. Если он пишет "ZWX", буква "X" будет немного в стороне.

Вещи, которые я пробовал:

  • скорость передачи данных 500000 бод
  • накопить остаток от плавающего числа шагов
  • различные USB-кабели
  • различные станки с ЧПУ

Это ошибка последовательной связи?

Нужно ли мне внедрять CRC?

Сможет ли УНО справиться с этим?

Делает ли SERIAL_8E1 проверку четности автоматически или мне нужно что-то сделать?

Я прошел через все это много раз. Чего мне здесь не хватает?

Это изображение генерируется непосредственно из буквенных строк в c#, поэтому я сомневаюсь, что проблема находится на стороне c#.

, 👍1

Обсуждение

уменьшите сложность проблемы ... вместо ZWX попробуйте выгравировать три простых квадрата, @jsotola

Вместо того, чтобы фактически управлять двигателями, вы могли бы рассчитать их положение. Это исключило бы неточность в двигателях. Отправляйте фигуры, которые вернутся в исходную точку. Сложите все шаги (фактические шаги, после преобразования из числа float), как ваш код ЧПУ поступил бы с двигателями. Затем отобразите конечную позицию, полученную в результате ваших вычислений. Это показало бы точность части расчета, и вы можете видеть, в чем проблема., @chrisl


1 ответ


1

Я забыл позаботиться о негативных шагах в накоплении остатка. Это решило дело.

// x accum
float resX = mmX * (float)X_STEPS_PER_MM;
float lresX = (long)resX;
_x_acum += resX - lresX;
    
long extraStepsX = 0;
while(_x_acum > 1.0f){
     _x_acum -= 1.0f;
     ++extraStepsX;
}
    
while(_x_acum < -1.0f){
     _x_acum += 1.0f;
    --extraStepsX;
}
// move stepper for lresX + extraSteps
,