Чому 3D-принтер псує саме кути?
На повороті голівка гальмує, а розплав у соплі — ні: тиск у ньому падає повільніше, ніж змінюється швидкість. Тому з зовнішнього боку кута лягає зайвий горбик, а за кілька міліметрів після нього стінка тоншає. Klipper і Marlin виправляють це доданком, пропорційним до швидкості, а не до пройденого шляху.

Поставте 3D-принтер друкувати порожнистий квадрат на високій швидкості й подивіться на кут при бічному світлі. Із зовнішнього боку повороту лежить маленький піднятий валик пластику — наче сопло там на мить зупинилося. Пройдіть очима вздовж стінки три-чотири міліметри далі: лінія стає тонкою, вужчою за решту периметра, іноді з помітним просвітом до шару під нею. На верхній суцільній поверхні те саме проступає як шорсткість там, де змінюється напрямок.
Очевидне пояснення — пластику виходить забагато, отже, треба зменшити множник подачі або додати ретракт. Документація Marlin відкидає це одним реченням: підкрутити подачу й ретракт справді допомагає, але тоді нові лінії починатимуться з недоливом.
Але друга половина симптому суперечить самій ідеї переливу. Принтер, який переливає скрізь, не морив би стінку голодом через чотири міліметри після кута. А на весь шар пластику виходить рівно стільки, скільки треба.
Чому розплав відстає від команди
Прошивка командує екструдером у міліметрах прутка й вважає, що ці міліметри лягають на стіл за тим самим розкладом, що й рух голівки. Marlin описує вихідну поведінку прямо: вісь екструдера рахують так само, як лінійні осі принтера, — з тим самим профілем прискорення й тими самими точками старту та зупинки. Але екструдер не лінійна система, і найпомітніший наслідок цього — зайвий матеріал наприкінці кожного прямолінійного руху.
Два фізичні закони, через які припущення розсипається, названо в документі кінематики Klipper: тиск росте, коли пруток заганяють в екструдер, — як у законі Гука; а потрібний для видавлювання тиск визначається переважно витратою через отвір сопла — як у законі Пуазейля.
Вільна довжина прутка між подавальною шестернею та зоною плавлення стискається, як пружина, а отвір сопла випускає розплав із витратою, яку задає сила, з якою ця пружина тисне зараз. У нотатках розробника Marlin порівняння вже нема: довжина — це пружина, K — її жорсткість.
Подавальна шестерня насправді задає стиснення, а не об'єм. Marlin пояснює це через силу: щоб проштовхнути пруток крізь отвір сопла, потрібна сила, яка залежить у тому числі від швидкості подачі, і що швидший друк, то сильніше треба стиснути пруток, перш ніж тиск у соплі зросте настільки, щоб матеріал пішов. Отже, кожна швидкість друку має власне рівноважне стиснення, а змінити швидкість означає спершу змінити цей запас — провернувши мотор екструдера на величину, якої в нарізаному g-code немає взагалі.
Калібрувальну лінію в документації Marlin розібрано на шість фаз, і дві з них — це дві половини дефекту. На початку швидкої ділянки тиск у соплі наростає повільніше, ніж розганяється голівка: матеріалу виходить замало, і лінія голодує. На початку гальмування тиск падає повільніше, ніж сповільнюється голівка: матеріалу виходить забагато. Не менше важить ще одна фаза — та, де голівка вже закінчила сповільнюватися, а тиск у соплі досі не збігається із заданою подачею, і лінію далі переливає.
Поправка рахується від швидкості, а не від пройденого шляху
Обидві прошивки лікують це однаково. Припущення Marlin записано в коментарі над самою функцією у Configuration_adv.h: advance = k * (delta velocity). Klipper оформлює свою версію як зсув командної позиції екструдера: pa_position = nominal_position + pressure_advance_coefficient * nominal_velocity.
У жодному доданку немає шляху.
Додатковий пруток залежить від того, як швидко екструдер крутиться цієї миті. Тому вздовж прямої стінки на сталій швидкості зсув сталий і не робить нічого помітного, а на куті — там, де швидкість змінюється найрізкіше за весь шар, — він робить усе. Знак поправки з кожного боку Klipper називає прямо: під час прискорення система заганяє в екструдер додатковий пруток, і що більша потрібна витрата, то більше його треба загнати; під час гальмування цей надлишок втягують назад, і швидкість екструдера стає від'ємною.
Одне й те саме число у двох прошивках
Marlin і Klipper міряють поправку різними коефіцієнтами, тож їхні числа не переносяться одне в одне. Дивитися варто не на самі краї діапазонів, а на відношення між ними.
| Marlin, LIN_ADVANCE v1.5 | Klipper, pressure advance | |
|---|---|---|
| Одиниця коефіцієнта | міліметри стиснення прутка на кожен 1 мм/с швидкості видавлювання | власна система коефіцієнтів, одиниці не названо |
| Робочий діапазон | 0,1–2,0 | 0,050–1,000 |
| Від краю до краю | 20 разів | 20 разів |
Розмах збігається: 2,0 ÷ 0,1 = 20, і 1,000 ÷ 0,050 = 20 так само. Два документи писали незалежно, і ця двадцятка в обох — не розкид чиїхось вимірювань.
Удвадцятеро різниться довжина прутка, якому є де стискатися.
Цю довжину процедура налаштування Klipper оцінює прямо, кроком калібрувальної вежі. На прямому приводі вона крокує коефіцієнт по 0,005 на кожен міліметр висоти; на довгому боуден-тракті — по 0,020, тобто вчетверо ширший діапазон на тій самій вежі, бо саме там очікують відповідь. Marlin каже те саме словами: боуденовим системам поправка потрібна найбільше, бо в них найбільше проблем зі зміною швидкості.

Перебір має власний почерк, і це не більший наплив. Завеликий K, попереджає Marlin, перевертає картину: тепер матеріалу вихлюпує на початку розгону, а у фазі гальмування лінія голодує. Ту саму хибу на своїй вежі описує й Klipper: шари вище за ідеальне налаштування дають округлені кути й погану подачу на підході до кута. Кут, який поплив і округлився, просить не більшої поправки, а меншої.
Як зняти своє число з вежі
У Klipper калібрування починається з двох команд. Перша існує для того, щоб дефект став видимим, — SET_VELOCITY_LIMIT SQUARE_CORNER_VELOCITY=1 ACCEL=500, і документація пояснює навіщо: так сопло проходить кути повільніше, і вплив тиску в екструдері стає помітнішим. Далі йде TUNING_TOWER COMMAND=SET_PRESSURE_ADVANCE PARAMETER=ADVANCE START=0 FACTOR=.005 на прямому приводі й .020 на боудені, а друкується порожнистий квадрат docs/prints/square_tower.stl — приблизно на 100 mm/s, без заливки, з висотою шару близько 75 % діаметра сопла.
Знайдіть висоту з найчистішими кутами. Зміряйте її штангенциркулем і прочитайте відповідь просто з вежі: pressure_advance = <start> + <measured_height> * <factor>. Розібраний приклад у самому документі — 0 + 12.90 * .020, що дає .258.
Тест Marlin лежить у площині, а не стоїть вежею. Його візерунок друкує по одній лінії на кожне значення-кандидат, і кожна лінія — це 20 мм повільно, потім 40 мм швидко, потім знову 20 мм повільно; отже, перехід трапляється на ній двічі, і оцінюють саме перехід, а не лінію. Обране значення йде в стартовий g-code як M900 Kxx. Перед будь-яким із двох тестів є нудна обов'язкова частина: сторінка Klipper вимагає спершу налаштувати rotation_distance екструдера й температуру сопла, бо обидві величини зсувають відповідь.
Klipper попереджає, що поправка прив'язана і до екструдера, і до сопла, і до конкретного прутка: філамент інших виробників або навіть інших кольорів нерідко вимагає помітно інших значень. Відкрийте профілі слайсера й подивіться, чи не стоїть одне число на всі ваші котушки. Якщо стоїть, кути на більшості з них виправляються величиною, каліброваною на чужому пластику.

Чого поправка не вміє
Pressure advance пересуває пластик у часі, а не голівку в просторі. Klipper прямо каже, що система не змінює ні розкладу, ні траєкторії голівки, — тож кут, який округлила межа прискорення, залишиться округлим. І модель лінійна лише за швидкістю: нотатки Marlin визнають, що рухи зі змінною шириною лінії не оброблено, адже на заповненні щілини, яка звужується у вістря, швидкість екструдера, а з нею й потрібний тиск, стають дедалі меншими. Там, де змінюється ширина, а не швидкість, поправка дорівнює нулю, а дефект — ні.
Джерела, за якими написано статтю
- Документація Klipper, Pressure Advance — процедура калібрування, кроки калібрувальної вежі, типовий діапазон коефіцієнта. Дослівно: «This command makes the nozzle travel slower through corners to emphasize the effects of extruder pressure»; «the pressure advance system causes additional filament to be pushed into the extruder during acceleration. The higher the desired filament flow rate, the more filament must be pushed in during acceleration to account for pressure. During head deceleration the extra filament is retracted (the extruder will have a negative velocity)»; «Typical pressure advance values are between 0.050 and 1.000 (the high end usually only with bowden extruders)»; «layers above the ideal setting can lead to rounded corners and poor extrusion leading up to the corner»; «The pressure advance value is dependent on the extruder, the nozzle, and the filament. It is common for filament from different manufactures or with different pigments to require significantly different pressure advance values»; «does not change the timing or path of the toolhead»
Klipper documentation, Pressure advance — https://www.klipper3d.org/Pressure_Advance.html - Документація Klipper, Kinematics — модель тиску і формула pa_position. Дослівно: «Pressure increases when filament is pushed into the extruder (as in Hooke's law) and the pressure necessary to extrude is dominated by the flow rate through the nozzle orifice (as in Poiseuille's law)»
Klipper documentation, Kinematics — https://www.klipper3d.org/Kinematics.html - Документація Marlin, Linear Advance — шість фаз калібрувальної лінії, одиниця та діапазон K. Дослівно: «Tuning flow and retraction can help, but this may lead to under-extrusion when starting new lines»; «Under default conditions, extruder axis movement is treated in the same way as the XYZ linear axes. The extruder motor moves in linear proportion to all the other motors, maintaining exactly the same acceleration profile and start/stop points. But an extruder is not a linear system, so this approach leads, most obviously, to extra material being extruded at the end of each linear movement»; «The force required to push the filament through the nozzle aperture depends, in part, on the speed at which the material is being pushed into the nozzle. If the material is pushed faster (=printing fast), the filament needs to be compressed more before the pressure inside the nozzle is high enough to start extruding the material»; «The pressure build up in the nozzle (= amount of extruded material) is lagging behind the acceleration of the print-head. This results in too little material and a starved line»; «The pressure decrease in the nozzle is lagging behind the deceleration of the print-head. This results in too much material being extruded»; «Still the pressure in the nozzle is not in sync with the intended extrusion amount and the line is suffering from over-extrusion»; «A too high K-Factor essentially reverses the above picture. The extruded amount will overshoot at the start of an acceleration and starve in the deceleration phase»; «Bowden systems need a pressure advance feature the most as they usually have the most problems with speed changes»; «mm of filament compression needed per 1mm/s extrusion speed», «around 0.1-2.0»; «the extruder speed and therefore needed pressure gets smaller and smaller»
Marlin documentation, Linear Advance — https://marlinfw.org/docs/features/lin_advance.html