К содержимому

PID-калибровка

Автонастройка нагревателя в Marlin и Klipper: сопло и стол, команды, сохранение результата и разбор случаев, когда температура гуляет и после калибровки.

Что делает PID и что происходит без калибровки

Нагреватель умеет только две вещи: гореть и не гореть. Прошивка решает, какую долю времени держать его включённым, чтобы датчик показывал заданное число. PID — три коэффициента, по которым эта доля считается:Kp отвечает на текущее расхождение с уставкой,Ki добирает накопленную за время ошибку, Kdтормозит по скорости изменения и гасит перелёт.

Значения зависят от железа: мощности нагревателя, массы нагревательного блока, места и посадки термистора, того, дует ли на блок вентилятор. Заводские коэффициенты посчитаны под заводскую комплектацию — поменяв в ней что-то, ты меняешь и условия, для которых они выведены. Документация Klipper на этот счёт высказывается прямо: настройки PID, взятые из другой прошивки или из примеров конфигов, часто работают плохо.

Температура ходит вокруг уставкиНа графике в Mainsail или в интерфейсе слайсера видно пилу: 205 — 215 — 206 при заданных 210. Расплав то жиже, то гуще, и это видно на детали полосами разного блеска и разной ширины линии.
Перелёт на выходеПри нагреве с холодного сопло проскакивает уставку на десяток градусов и долго успокаивается. На первых слоях это подтёки и стрингинг там, где на установившейся температуре их не было. Документация Marlin называет борьбу с перелётом главным, ради чего PID настраивают: заметный перелёт — это уже вопрос безопасности, а не качества.
Провал при включении обдуваСлайсер включает обдув со второго слоя, вентилятор снимает тепло с блока, и температура падает ниже уставки на несколько градусов. Если коэффициенты снимались без обдува, прошивка добирает мощность медленно и провал держится минутами.
Прошивка останавливает печатьMarlin выдаёт Heating failed или Thermal Runaway, Klipper — Heater extruder not heating at expected rate. Это защита: температура ушла от уставки дальше и дольше, чем разрешено. PID — одна из причин срабатывания, но не единственная, см. разбор ниже.

Что и чем задаётся в каждой прошивке

Что нужноMarlinKlipper
Запустить автонастройку соплаM303 E0 C8 S210 U1PID_CALIBRATE HEATER=extruder TARGET=210
Запустить автонастройку столаM303 E-1 C8 S60 U1 — только в сборке с PIDTEMPBEDPID_CALIBRATE HEATER=heater_bed TARGET=60
Ввести коэффициенты рукамиM301 для сопла, M304 для стола. После прогона с U1 не нужныПишет сама прошивка, руками вводить нечего
Закрепить, чтобы пережило перезагрузкуM500 — запись в EEPROM платыSAVE_CONFIG — запись в printer.cfg с перезапуском
Посмотреть действующие значенияM503Блок #*# в конце printer.cfg — он перекрывает секции выше

Команд M301, M303, M304,M500 в Klipper нет: он не хранит настройки в памяти платы и поддерживает не любой G-code, а тот, что выдают слайсеры. На любую из них Klipper ответит, что команда неизвестна.

Когда PID надо калибровать заново

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

Сменил хотэндДругая масса блока, другая длина зоны расплава, другой радиатор. Вместе с PID перебирают температуру башней и поток: старые цифры к новому хотэнду не относятся.
Сменил нагревательКартридж на 50 Вт вместо 40 греет быстрее, и прежние коэффициенты дадут перелёт. Обратная замена — недобор мощности и вялый выход на уставку.
Сменил термистор или трогал его посадкуДатчик в другом месте блока показывает другую температуру той же зоны расплава, а плохо зажатый — с задержкой. И то и другое меняет то, на что реагирует регулятор.
Надел или снял силиконовый носокНосок закрывает блок от обдува и меняет теплоотдачу сильнее, чем кажется. Калибровать надо в той сборке, в которой печатаешь.
Сменил вентилятор обдува или воздуховодНовый воздуховод часто дует на блок, а не только на деталь. Это прямой отбор тепла у нагревателя.
Перешёл на другую рабочую температуруКоэффициенты снимаются вокруг одной точки. Набор, снятый на 205 °C для PLA, на 250 °C для ABS работает хуже. Что ставить, если материалов несколько, — в следующем разделе.
Появились ошибки нагрева или пила на графикеСначала калибровка, и только если она не помогла — разбор механических причин.

Смена сопла того же диаметра и того же материала тепловые условия почти не меняет — ради неё PID не перекалибровывают. Переход с латуни на сталь или на сопло другой длины уже меняет: сталь хуже проводит тепло, а длинное сопло добавляет массы.

На какой температуре калибровать и что делать с обдувом

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

Ставь рабочую температуру, а не круглую210 для PLA, 240 для PETG, 250 для ABS. Абстрактные 200 «чтобы было» не подходят никому: калибровка честно найдёт коэффициенты для 200 °C. Значения по материалам — в таблице материалов.
Печатаешь несколькими материалами — бери верхнююДокументация Marlin советует калибровать на самой высокой температуре, которую собираешься использовать: перелёт наверху опаснее, чем внизу. Отдельного набора коэффициентов под каждый материал ни Marlin, ни Klipper не держат — набор один.
У самой калибровки есть потолок, и он ниже максимума хотэндаMarlin отклоняет цель выше HEATER_0_MAXTEMP минус 15 °C (HOTEND_OVERSHOOT) — прогон не начнётся, в консоль уйдёт PID Autotune failed! Temperature too high. При стоковых HEATER_0_MAXTEMP 275 потолок автотюна — 260 °C, и поликарбонат на 280 откалибровать не получится, пока предел не поднят в прошивке. У Klipper ограничения на цель нет, но автотюн намеренно перелетает уставку: если она стоит вплотную к max_temp секции, MCU уйдёт в shutdown посреди прогона. Ставь цель с запасом в те же 15 °C от предела.
Собери хотэнд как для печатиНосок надет, воздуховод на месте, крышка корпуса в том положении, в котором ты обычно печатаешь. Калибровка с разобранным обдувом описывает машину, которой у тебя нет.
Не запускай во время печатиАвтонастройка сама управляет нагревателем и намеренно гоняет температуру вокруг уставки. А в Klipper следом за прогоном идёт SAVE_CONFIG, который перезапускает управляющую программу и печать обрывает.
Стол калибруй пустымБез детали, без бумаги, без клея слоем. Магнитную или стеклянную поверхность оставь ту, с которой печатаешь — она входит в тепловую массу стола.
Будь рядом весь прогонАвтотюн — не щадящий режим: прошивка намеренно держит нагреватель на полной мощности и намеренно перелетает уставку, иначе ей нечего измерять. Прогон на восемь циклов занимает 10–25 минут; уйти из комнаты, поставить на ночь или запустить удалённо из другого места нельзя.

Про обдув: что известно и что нет

Вентилятор обдува снимает часть тепла с нагревательного блока, и мощность, нужная для удержания температуры, при работающем обдуве другая. Отсюда распространённый совет: включить обдув так же, как в печати, и уже потом запускать автонастройку — M106 S255 на полную,M106 S128 вполсилы, ничего для ABS и ASA, которые печатают почти без обдува.

В документации Marlin такого требования нет. СтраницаM303 вентилятор не упоминает вовсе, и раздел про PID в конфигурации тоже. Что там есть — отдельная опция сборкиPID_FAN_SCALING: она масштабирует мощность нагревателя по скорости обдува и тем сокращает провал температуры уже во время печати. В исходнике она помечена экспериментальной и описана как добавочныйчлен к мощности, а не множитель: коэффициент Kf подбирают так, чтобы добавка ровно покрывала то, что уносит вентилятор. В документации Klipper про обдув при PID_CALIBRATE тоже ничего не сказано.

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

Как откалибровать PID в Marlin

Команды набирают в консоли: терминал OctoPrint, Pronterface, вкладка с терминалом в интерфейсе принтера. Автонастройку запускаетM303.

M303 E0 C8 S210 U1
ПараметрЧто задаётПример
EКакой нагреватель: 0 — первое сопло, -1 — стол. По умолчанию 0E0
SТемпература, на которой снимаются коэффициенты. Ставь рабочуюS210
CСколько циклов пройти. По умолчанию 5; меньше трёх прошивка примет молча, но отработает триC8
UU1 — применить найденные коэффициенты сразу. Без него прошивка только напечатает ихU1

Есть ещё D — он только включает и выключает отладочный вывод PID и требует своей опции в сборке. Для калибровки не нужен.

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

bias: 89 d: 89 min: 208.75 max: 211.60
 Ku: 22.98 Tu: 32.29
 Classic PID
 Kp: 13.79 Ki: 0.85 Kd: 55.66

Это ещё не результат, а промежуточный замер: Ku иTu — амплитуда и период колебаний на этом цикле, строка ниже называет правило пересчёта (Classic PID у сопла,No overshoot у стола), а под ним — коэффициенты по этому правилу. С каждым циклом числа уточняются. Финальный блок выглядит иначе:

PID Autotune finished! Put the last Kp, Ki and Kd constants from below into Configuration.h
#define DEFAULT_Kp 13.79
#define DEFAULT_Ki 0.85
#define DEFAULT_Kd 55.66

Строки Kp: в конце вывода нет — в итоговом блоке коэффициенты названы так, как называются в Configuration.h, и искать надо #define DEFAULT_Kp. У стола этоDEFAULT_bedKp, DEFAULT_bedKi,DEFAULT_bedKd. Числа здесь — с чужой машины, для примера.

Прогон был с U1, значит коэффициенты уже стоят в оперативной памяти и вводить их руками не нужно. Осталось закрепить их в памяти платы:

M500
Без M500 результат живёт до выключенияПараметр U1 и команда M301 меняют значения только в оперативной памяти. M500 сохраняет настройки в EEPROM платы, и после перезагрузки они остаются.
Когда M301 действительно нуженКогда числа вводишь сам: прогон шёл без U1, или ты возвращаешь коэффициенты из старой записи, или подбираешь их руками. Тогда M301 P13.79 I0.85 D55.66 и следом M500; без параметра E команда относится к первому соплу. После прогона с U1 набирать её повторно нечего — в память уйдут те же числа.
Как выглядит сорвавшийся прогонPID Autotune failed! Temperature too high — перелёт больше 30 °C от уставки либо цель выше потолка автотюна. PID Autotune failed! timeout — за 20 минут не набрался очередной цикл. Плюс обычные Heating failed и Thermal Runaway: защита во время автотюна работает так же, как в печати, и обрывает прогон.
M303 гасит все нагреватели на стартеВключая стол — даже когда калибруешь сопло. Холодный стол после прогона это штатное поведение, а не сбой: перед печатью его греют заново.
M503 показывает действующее, а не сохранённоеКоманда печатает настройки, которыми прошивка пользуется прямо сейчас, — совпадают они с содержимым EEPROM или нет, по её выводу не видно. Чтобы проверить именно записанное, загрузи сохранённое командой M501 и посмотри M503 уже после неё.
Если M500 не работаетЗначит в сборке прошивки выключено сохранение настроек — опция EEPROM_SETTINGS. Тогда коэффициенты придётся вписать в Configuration.h и перепрошить плату. Пока прошивка не пересобрана, набирать M301 нужно после каждого включения принтера.
Стол записывается другой командойАвтонастройка запускается тем же M303 с E-1, а коэффициенты стола принимает M304 — у неё только P, I и D, без индекса нагревателя. Работает это лишь в сборке, где включён PID стола, — см. раздел ниже.
Число циклов имеет предел полезностиПять стоят по умолчанию, восемь дают устойчивый результат, двадцать не улучшат ничего и растянут прогон на полчаса. C1 и C2 прошивка не отвергает и об ошибке не сообщает: условие выхода в коде требует минимум трёх циклов, поэтому три она и отработает — только тихо.
Температуру задавай явноБез S Marlin возьмёт температуру из первого профиля преднагрева — не ту, на которой ты печатаешь. Параметр стоит писать всегда.

Как откалибровать PID в Klipper

В Klipper настройки хранятся не в памяти платы, а в текстовом файлеprinter.cfg. Поэтому команд M301 иM500 здесь нет вовсе: результат вписывает в конфиг сама прошивка. Команду набирают в консоли Mainsail или Fluidd.

PID_CALIBRATE HEATER=extruder TARGET=210

HEATER — имя нагревателя, то же, что имя секции конфига.TARGET — температура в градусах. Оба параметра обязательные.

HEATER=Какой нагреватель
extruderПервый (на односопловой машине — единственный) хотэнд
extruder1Второй хотэнд; дальше extruder2, extruder3 и так далее
heater_bedСтол
имя из [heater_generic]Любой дополнительный нагреватель: камера, сушилка

Klipper выйдет на температуру, прогонит нагреватель через неё несколько раз и напечатает результат в консоль:

PID parameters: pid_Kp=22.865 pid_Ki=1.292 pid_Kd=101.178
The SAVE_CONFIG command will update the printer config file
with these parameters and restart the printer.

Числа снова чужие — свои будут другими.

Коэффициенты посчитаны, но ещё не сохранены. Записывает их отдельная команда:

SAVE_CONFIG

Она перезаписывает printer.cfg и перезапускает Klipper — это её штатное поведение, а не сбой. Коэффициенты при этом попадают нев секцию [extruder], которую ты писал руками, а в автосохранённый блок в самом конце файла:

#*# <---------------------- SAVE_CONFIG ---------------------->
#*# DO NOT EDIT THIS BLOCK OR BELOW. The contents are auto-generated.
#*#
#*# [extruder]
#*# control = pid
#*# pid_kp = 22.865
#*# pid_ki = 1.292
#*# pid_kd = 101.178

Открыв printer.cfg после калибровки, листай в конец. То, что стоит в этом блоке, перекрывает написанное выше по файлу: если старыеpid_Kp остались в [extruder], работать всё равно будут новые. Править блок руками не нужно — прошивка перезаписывает его целиком при каждом SAVE_CONFIG.

SAVE_CONFIG перезапускает KlipperПечать при этом обрывается. Не запускай ни калибровку, ни сохранение, пока принтер печатает.
Без SAVE_CONFIG результат пропадётПрогон посчитал коэффициенты и держит их до перезапуска. Не сохранил — вернутся прежние значения из конфига, а работа пропадёт.
Стол — тот же вызов с другим именемPID_CALIBRATE HEATER=heater_bed TARGET=60, дальше так же SAVE_CONFIG. Температуру задавай рабочую: 60 для PLA, 100 для ABS.
Секция на watermark калибровке не мешаетЕсли у нагревателя сейчас стоит control: watermark, запускать PID_CALIBRATE всё равно можно. Прогон отрабатывает как обычно, а сохранение записывает в автоблок не только коэффициенты, но и строку control = pid — то есть само переводит нагреватель на PID. Отдельно править секцию перед калибровкой не нужно.
Имя нагревателя должно совпадать с секциейНа чужое имя Klipper ответит, что такой нагреватель ему неизвестен. Сверяй по printer.cfg: у сопла это extruder, без нуля на конце.
WRITE_FILE=1 сохраняет замерыТретий, необязательный параметр. С ним Klipper положит в /tmp/heattest.txt ход прогона: сначала строки pwm: — что регулятор подавал на нагреватель, потом температурные отсчёты. Нужен, когда калибровка не сходится и надо посмотреть, как именно вела себя температура.
Файл замеров забирай сразу/tmp на Raspberry Pi чистится при перезагрузке, а следующий прогон с WRITE_FILE=1 перезапишет файл поверх. Скопируй его к себе тем же вечером — повторять прогон только ради графика долго.

Нужен ли столу PID или хватает bang-bang

Стол часто управляется не PID, а простым двухпозиционным регулятором: нагрев включён, пока температура ниже порога, и выключен, пока выше. Такой режим называют bang-bang, в Klipper он записывается какcontrol: watermark.

[heater_bed]
control: watermark
max_delta: 2.0

max_delta здесь — половина ширины коридора: нагреватель выключается, когда температура поднялась выше уставки на это значение, и включается снова, когда опустилась ниже на столько же. По умолчанию 2 °C.

В Marlin PID стола по умолчанию выключенЗа него отвечает опция PIDTEMPBED в Configuration.h, и в стоковой конфигурации она закомментирована — стол работает по bang-bang, а M303 E-1 и M304 требуют как раз её. Включена она или нет, видно по M503: строки с PID стола на такой сборке просто не будет.
Bang-bang в Marlin проверяет температуру редкоРаз в пять секунд — это BED_CHECK_INTERVAL из Configuration_adv.h. Гистерезис появляется только с отдельной опцией BED_LIMIT_SWITCHING, а она лежит в Configuration.h, рядом с PIDTEMPBED. Включишь её — нагрев выключается выше уставки на BED_HYSTERESIS и включается ниже неё на столько же, по умолчанию на 2 °C; сам BED_HYSTERESIS задаётся снова в Configuration_adv.h. Файла два, и это не опечатка.
Klipper советует столу PID, но не всякомуДокументация рекомендует PID, если стол управляется по ШИМ, и предупреждает про случай, когда не стоит: под PID нагреватель может включаться и выключаться до десяти раз в секунду, а для стола, запитанного через механическое реле, это не подходит. Щелчки с периодом в десятки секунд — признак bang-bang, и перевод такого стола на PID реле не продлит.
Столу колебания мешают меньше, чем соплуМасса стола несопоставимо больше массы нагревательного блока, и остывает он медленно: коридор в пару градусов набирается за минуты, а не за секунды. На адгезию первого слоя такое колебание не влияет — значения температур по поверхностям в разделе про адгезию.
Где PID столу нужен точноБольшой стол с мощным нагревателем и тонкой пластиной успевает перелетать уставку. Второй случай — камера или сушилка на [heater_generic]: там важна ровная температура, а не средняя.

Что делать, если PID не сходится или температура гуляет и после него

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

Термистор болтается в блокеДатчик, не зажатый винтом или прижимной пластиной, показывает температуру воздуха рядом с блоком, а не самого блока, и с задержкой. Регулятор реагирует поздно и всегда перелетает. Проверить — вытащить и посадить обратно с прижимом; на блоках под датчик-таблетку добавить каплю теплопроводной пасты.
Провод термистора надломленПоказания дёргаются рывками на десятки градусов, часто при движении каретки. Проверяется просто: набирай M105 и шевели провод у выхода из блока и у разъёма платы. Скачок при шевелении — обрыв в жиле или в разъёме, PID тут ни при чём.
В конфиге не тот тип термистораПоказания при этом ровные, но систематически врут — на десяток-другой градусов. Заметно по расплаву: пластик течёт как на другой температуре. Тип задаётся в прошивке (TEMP_SENSOR_0 в Marlin, sensor_type в секции [extruder] у Klipper) и должен совпадать с тем, что физически стоит.
Обдув дует прямо на блокСамая частая причина провалов при работающем вентиляторе. Смотреть надо на воздуховод: часть готовых воздуховодов задувает не только уложенную линию, но и грани блока. Лечится силиконовым носком — он же выравнивает температуру по блоку.
Нагревателю не хватает мощностиКартридж на 30–40 Вт с крупным блоком вроде Volcano при обдуве на полную не удержит температуру на высоком расходе: PID будет держать мощность на пределе и всё равно недобирать. Признак — температура уходит вниз ровно, вслед за ростом скорости, а не колеблется. Решение здесь не в коэффициентах, а в нагревателе помощнее; сколько расхода вообще тянет хотэнд — калькулятор объёмного расхода.
Сквозняк и открытый корпусФорточка напротив принтера даёт провалы, совпадающие с порывами, а не с командами обдува. Для ABS и ASA это же и причина расслоения — см. дефекты печати.
Просадка питанияСтол и хотэнд, запитанные от блока на пределе, тянут друг друга: при включении стола соплу достаётся меньше. Видно как совпадение провалов на сопле с циклами нагрева стола.
Колебание с периодом слояЕсли пила на графике совпадает по времени со слоями, это не PID, а обдув: слайсер меняет его на границах слоёв и участков. Управление обдувом разобрано в справочнике G-code.
Ошибки нагрева отключать нельзяThermal Runaway в Marlin и Heater not heating at expected rate в Klipper — защита от пожара: она ловит случай, когда нагреватель греет, а датчик этого не видит, потому что выпал из блока. Правильная реакция — найти причину, а не поднимать пороги в конфиге.

Дальше