Руководство · Средний · 30 min

Возврат в начало по концевикам и системы координат

Станок с разомкнутым контуром не знает положения. Возврат в начало находит его за три этапа, задаёт мягкие пределы и отделяет ноль станка от рабочего нуля.

Задача, которую решает возврат в начало

Ось с шаговым двигателем, работающая в разомкнутом контуре, идеально помнит всё, что ей приказали делать, и совершенно не знает, где находится. Включите питание — внутренний счётчик положения покажет ноль не потому, что каретка находится в нуле, а потому, что целое число инициализируется нулём.

Хуже того, счётчик может быть неверным даже во время работы машины. Потеря шагов происходит незаметно: драйвер продолжает считать импульсы, прошивка продолжает верить им, и каретка теперь постоянно смещена на некоторое число полных шагов, кратное четырём. Ничто в контуре управления никогда этого не заметит, потому что контура обратной связи нет.

Возврат в начало решает обе задачи. Это единственный момент работы станка, когда положение определяется по физическим ориентирам, а не накапливается счётом, и от него зависит вся последующая работа.

Трёхэтапный поиск

Двигайтесь к выключателю, останавливайтесь при срабатывании и называйте это нулём. Это работает и повторяется примерно с точностью до половины миллиметра, что бесполезно. Каждый настоящий станок выполняет три прохода:

Положение оси в миллиметрах в зависимости от времени в секундах показывает цикл возврата в начало. Первая фаза, быстрый поиск, перемещается с 46 миллиметров вниз до линии срабатывания выключателя на 2.4 миллиметра. Вторая фаза отходит до 7 миллиметров. Третья фаза медленно приближается, и выключатель снова срабатывает на 2.55 миллиметра, где график останавливается. Пунктирная красная линия отмечает срабатывание выключателя, сплошная линия на нуле — ноль станка G53, а пунктирная линия на 18 миллиметрах — выбранный рабочий ноль G54.
Быстро, отойти, медленно. Первый проход должен только найти выключатель; второе приближение задаёт число, и оно медленное именно для повторяемости точки срабатывания. Скачать SVG
  1. Быстрый поиск. Двигайтесь к выключателю со скоростью, выбранной по нетерпению, а не по точности. Этот проход нужен только для приближения, и он может пройти всю длину оси.
  2. Отход. Отступите на несколько миллиметров, пока контакты выключателя не разомкнутся. Это делает третий проход возможным и одновременно доказывает, что выключатель действительно выключатель, а не залипший вход.
  3. Медленный повторный поиск. Снова приближайтесь с малой долей первой скорости и записывайте точку срабатывания. Именно это является измерением.

Причина важности медленного прохода — механическая. Рычажный микропереключатель срабатывает после перемещения своего штока на определённое расстояние, но каретка продолжает двигаться, пока прошивка реагирует и ось замедляется. При 50 mm/s и задержке обнаружения 2 ms каретка проходит 0.1 mm за точкой срабатывания, прежде чем кто-либо узнает о ней. При 2 mm/s она проходит 0.004 mm. Медленное приближение превращает собственную повторяемость выключателя — несколько микрон на хорошем микропереключателе — в повторяемость станка, вместо того чтобы дать ей определяться расстоянием торможения.

Обычные параметры выглядят так:

Параметр Типичное значение Зачем
Скорость быстрого поиска 30–50 mm/s Достаточно быстро, чтобы не раздражать
Расстояние отхода 3–5 mm Достаточно для полного отпускания выключателя
Скорость медленного поиска 1–3 mm/s Расстояние торможения становится пренебрежимо малым
Отход после возврата в начало 1–5 mm Выключатель остаётся отпущенным и может также служить пределом

Подключение концевого выключателя

Сам выключатель — тот же рычажный микропереключатель, который робот использует как бампер, и правило подключения такое же:

const int X_MIN_PIN = 9;

void setup() {
  pinMode(X_MIN_PIN, INPUT_PULLUP);   // NO to ground, pin pulled up
}

bool endstopTriggered() {
  return digitalRead(X_MIN_PIN) == LOW;
}

Подключите COM к земле, а NO к выводу, включив внутреннюю подтяжку. Тогда обрыв провода считывается как «не сработало», что для выключателя возврата в начало является безопасным отказом: станок не находит начало и останавливается, а не решает, что уже находится там.

Это противоположно правилу аварийной остановки, где нужен нормально замкнутый контакт, чтобы обрыв провода остановил станок. У выключателя возврата в начало и аварийной остановки противоположные безопасные состояния, и подключать их одинаково — настоящая ошибка, а не стилистическая неточность.

Две детали вызывают большинство проблем с концевыми выключателями:

  • Устраните дребезг. Одно нажатие даёт примерно девять переходов за 4.7 ms. Во время возврата в начало вы опрашиваете в плотном цикле, поэтому нужен первый фронт, а всё после него следует игнорировать несколько миллисекунд. Никогда не подключайте прерывание, которое считает фронты.
  • Проводите провод концевого выключателя вдали от проводов двигателя. Длинный неэкранированный провод, идущий параллельно кабелю шагового двигателя с широтно-импульсной модуляцией, собирает именно тот шум, который выглядит как замыкание выключателя. Если возврат в начало работает при выключенных двигателях и отказывает при их работе, причина здесь.

Система координат станка и рабочие координаты

После возврата в начало станок точно знает только одно: где находится концевой выключатель. Эта точка вместе с фиксированным смещением задаёт ноль станка — в G-коде систему координат G53. Это свойство системы координат. Он не перемещается и остаётся одинаковым после каждого цикла возврата в начало.

Почти никогда это не та точка, от которой нужно отсчитывать размеры заготовки. Поэтому станки хранят второе подвижное начало: рабочую систему координат G54–G59, определённую как смещение относительно нуля станка.

Координаты станка (G53) Рабочие координаты (G54…)
Начало Задаётся концевиками и системой координат Там, где вы его установите
Кто задаёт Возврат в начало Вы, для каждой операции
Сохраняется после перезапуска Да, после повторного возврата в начало Да, хранится в контроллере
Используется для Мягких пределов, смены инструмента, парковочных положений Каждой строки реальной операции
Меняется при новом зажиме Нет Да — в этом и смысл

Разделение начинает окупаться, как только одна и та же операция выполняется дважды. G-код говорит «нарисовать квадрат 50 mm, начиная с X0 Y0». Прикрепите бумагу в удобном месте, переместитесь к её углу, задайте нуль рабочих координат и запустите. Переместите бумагу, снова задайте ноль и запустите тот же файл. Программа не изменилась; изменилось смещение.

Ноль станка — то, что знает система отсчёта. Рабочий ноль — то, что использует операция. Разделение позволяет перемещать деталь без редактирования файла.

Мягкие пределы

Зная начало координат станка, прошивка может отклонить перемещения, которые вывели бы каретку за рабочий объём, до того как она туда доберётся. Это мягкие пределы, и они строго лучше аппаратных, потому что останавливают станок по плановому торможению, а не столкновением.

; GRBL
$20=1        ; soft limits on
$130=200.0   ; X max travel, mm
$131=200.0   ; Y
$132=60.0    ; Z

Станок с включёнными мягкими пределами, но без цикла возврата в начало, не знает границ рабочего объёма и потому не может обеспечить мягкие пределы. Большинство прошивок отказываются работать до возврата в начало, и сообщение об ошибке здесь не раздражает — это срабатывает блокировка.

Аппаратные концевые выключатели на дальнем конце каждой оси — отдельный, более грубый резерв на случай неверных мягких пределов. Многие небольшие станки обходятся без них и полагаются только на мягкие пределы; это разумный компромисс, если на станке ничто не может причинить вам вред.

Конечный автомат

Процедура возврата в начало естественным образом является небольшим конечным автоматом, и его запись в таком виде делает обработку тайм-аутов явной:

enum HomeState { IDLE, SEEK_FAST, BACK_OFF, SEEK_SLOW, HOMED, FAILED };
HomeState state = IDLE;
long stateStartedAt = 0;

void homingStep() {
  switch (state) {
    case SEEK_FAST:
      if (endstopTriggered()) { stopNow(); enter(BACK_OFF); }
      // an axis that never finds its switch must give up, not grind
      else if (travelled() > AXIS_LENGTH_MM + 10) enter(FAILED);
      break;

    case BACK_OFF:
      if (!endstopTriggered() && travelled() >= BACKOFF_MM) enter(SEEK_SLOW);
      break;

    case SEEK_SLOW:
      if (endstopTriggered()) {
        stopNow();
        machinePosition = HOME_OFFSET_MM;   // the one real measurement
        enter(HOMED);
      } else if (travelled() > BACKOFF_MM * 2) enter(FAILED);
      break;
  }
}

Ветви FAILED стоит скопировать. У оси, которая ищет выключатель, но не срабатывает, выключатель может быть отключён, каретка — заклинить, а ось может терять каждый заданный ей шаг. Во всех трёх случаях правильный ответ — остановиться и сообщить об этом. Процедура возврата в начало без тайм-аута будет продолжать двигать каретку вдоль рамы ровно столько, сколько вы ей позволите.

Когда всё идёт не так

Симптом Причина Исправление
Каждый возврат в начало даёт немного другое положение Нет медленного второго прохода или он слишком быстрый Добавьте повторный поиск; снизьте скорость до 1–3 mm/s
Станок едет не туду и врезается Направление возврата в начало или направление двигателя инвертировано Измените настройку направления или поменяйте местами одну пару обмоток
«Концевой выключатель сработал» до начала движения Выключатель подключён нормально замкнутым или залип Проверьте NO и NC; убедитесь, что после отпускания вывод читается высоким
На холодном месте работает, при включённых двигателях отказывает Провод концевого выключателя ловит шум драйвера Проложите его вдали от кабелей двигателя; добавьте 100 nF на землю
Возврат в начало проходит, но каждое перемещение смещено Неверны HOME_OFFSET или отход Измерьте расстояние от выключателя до нужного нуля
После включения питания станок отказывается двигаться Включены мягкие пределы, но возврат в начало не выполнен Выполните возврат в начало — это блокировка, а не неисправность
Повторяемость хорошая, но деталь находится не там Неверно рабочее смещение, а не возврат в начало Задайте G54 заново там, где находится заготовка
Ось Z входит в стол Направление Z инвертировано или не задано смещение щупа Проверьте направление, прежде чем доверять какому-либо смещению

Место в системе

Возврат в начало позволяет станку с разомкнутым контуром восстановить то единственное, что он структурно не может измерить. Важно понимать, что это даёт, а что нет: возврат в начало делает положение станка правильным в начале операции — и больше ничего. Если ось теряет шаги в середине операции из-за неверного ограничения тока или профиля ускорения, возврат в начало между запусками лишь каждый раз сбрасывает ошибку в ноль, но никогда её не исправляет.

Признак прост: станок, который точно выполняет возврат в начало, но заканчивает операцию не в том месте, имеет проблему перемещения, а не возврата в начало.

Исследуйте граф

Входит в эти сборки

Проекты и учебные пути, в которые входит это руководство.

Дополнительные материалы

Источники