Arc Fitting на 8-битном Marlin: тест на ATmega1284P

Arc Fitting, или использование команд G2/G3 для описания дуг, нередко считают спорным выбором для старых 8-битных контроллеров. Логика такого предположения проста: вместо готового набора линейных перемещений G1 микроконтроллер должен самостоятельно вычислять аппроксимацию дуги. На слабом AVR это якобы может привести к снижению производительности.
Чтобы проверить, насколько обосновано такое опасение, был проведён эксперимент на ATmega1284P с тактовой частотой 16 МГц и Marlin 2.1.x. Конфигурация специально представляла собой неблагоприятный сценарий: в прошивке были включены S-curve, Linear Advance, Junction Deviation и ZV Input Shaping. Последняя функция позволяет примерно в полтора раза увеличить скорость печати без заметной потери качества, но одновременно добавляет вычислительную нагрузку.
Сравнение одинакового числа перемещений
В первом тесте сравнивались G1 и G2/G3 при печати окружности диаметром 40 мм. Анализ работы Marlin показал, что дуги внутри прошивки аппроксимируются сегментами длиной около 1,75 мм. Поэтому тестовый G-code подготовили так, чтобы оба варианта приводили примерно к одинаковому числу фактически выполненных блоков планировщика — 432.
Результат оказался не в пользу заранее нарезанных линейных перемещений. Вариант с G1 занял 9,328 секунды, тогда как G2 выполнил ту же окружность за 7,648 секунды. Таким образом, при одинаковом количестве итоговых блоков G1 оказался примерно на 22% медленнее.
Что происходит при более мелком разбиении
Затем линейные перемещения дополнительно дробили: длина сегментов последовательно уменьшалась с 5 до 1, 0,5, 0,2 и 0,1 мм. На отрезках размером 0,5–0,1 мм дуговые команды выполняли окружность примерно в 2,2–6,8 раза быстрее, чем внешний набор G1. При этом движение оставалось плавным.
У линейного варианта, напротив, появились заметные замирания и ударные нагрузки, связанные с постоянным разгоном и торможением перемещаемых масс стола и печатающей головки. Иными словами, большое число коротких G1 создавало дополнительную нагрузку не только на вычислительную часть прошивки, но и на планировщик движения.
Проверка передачи через UART
При передаче команд по UART со скоростью 250 000 бод разница стала ещё заметнее. Набор из 7542 команд G1 выполнялся 70,029 секунды, тогда как шесть команд G2 потребовали 7,656 секунды. Выигрыш дугового представления приблизился к десятикратному.
Большой поток G1 дополнительно перегружал канал обмена и обработку данных. Процессор не всегда успевал вовремя забирать поступающие байты из UART, из-за чего возникали ошибки контрольных сумм и требовалась повторная передача команд. Это приводило к паузам и ударам при движении. Снижение скорости обмена помогало уменьшить число сбоев, но увеличивало общее время печати. Вариант с G2 описывал окружность компактным набором команд и выполнялся плавно за один проход.
Почему G2/G3 оказались быстрее
Главный вывод эксперимента связан с различием между командами G-code и блоками планировщика: это не одно и то же. Marlin действительно должен самостоятельно сегментировать G2 и G3, однако компактная дуговая команда одновременно сокращает число операций чтения G-code, разбора ASCII, диспетчеризации команд и обмена подтверждениями по UART.
Поэтому результаты нельзя трактовать как доказательство того, что вычисление дуги само по себе дешевле обработки G1. Эксперимент показывает суммарную производительность всей цепочки — от получения команды и её разбора до интерполяции дуги, планировщика и шагового генератора. В проверенной конфигурации преимущества сокращённого потока команд перевесили затраты на вычисление дуги. Это означает, что Arc Fitting не обязательно является проблемой для 8-битного Marlin и на практике способен заметно ускорить печать даже на ATmega1284P с частотой 16 МГц.


