PID-калибровка
Автонастройка нагревателя в Marlin и Klipper: сопло и стол, команды, сохранение результата и разбор случаев, когда температура гуляет и после калибровки.
- Зачем нужен PID
- Когда калибровать
- Температура и обдув
- Marlin: M303
- Klipper: PID_CALIBRATE
- Стол: PID или bang-bang
- Если не сходится
Что делает PID и что происходит без калибровки
Нагреватель умеет только две вещи: гореть и не гореть. Прошивка решает, какую долю времени держать его включённым, чтобы датчик показывал заданное число. PID — три коэффициента, по которым эта доля считается:Kp отвечает на текущее расхождение с уставкой,Ki добирает накопленную за время ошибку, Kdтормозит по скорости изменения и гасит перелёт.
Значения зависят от железа: мощности нагревателя, массы нагревательного блока, места и посадки термистора, того, дует ли на блок вентилятор. Заводские коэффициенты посчитаны под заводскую комплектацию — поменяв в ней что-то, ты меняешь и условия, для которых они выведены. Документация Klipper на этот счёт высказывается прямо: настройки PID, взятые из другой прошивки или из примеров конфигов, часто работают плохо.
Heating failed или Thermal Runaway, Klipper — Heater extruder not heating at expected rate. Это защита: температура ушла от уставки дальше и дольше, чем разрешено. PID — одна из причин срабатывания, но не единственная, см. разбор ниже.Что и чем задаётся в каждой прошивке
| Что нужно | Marlin | Klipper |
|---|---|---|
| Запустить автонастройку сопла | M303 E0 C8 S210 U1 | PID_CALIBRATE HEATER=extruder TARGET=210 |
| Запустить автонастройку стола | M303 E-1 C8 S60 U1 — только в сборке с PIDTEMPBED | PID_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 не перекалибровывают. Переход с латуни на сталь или на сопло другой длины уже меняет: сталь хуже проводит тепло, а длинное сопло добавляет массы.
На какой температуре калибровать и что делать с обдувом
Автонастройка выводит коэффициенты для одной рабочей точки: прошивка несколько раз проводит нагреватель через заданную температуру и смотрит, с какой амплитудой и с каким периодом система колеблется. Чем дальше реальная печать от этой точки, тем хуже подходят полученные числа.
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 от предела.SAVE_CONFIG, который перезапускает управляющую программу и печать обрывает.Про обдув: что известно и что нет
Вентилятор обдува снимает часть тепла с нагревательного блока, и мощность, нужная для удержания температуры, при работающем обдуве другая. Отсюда распространённый совет: включить обдув так же, как в печати, и уже потом запускать автонастройку — 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 — стол. По умолчанию 0 | E0 |
| S | Температура, на которой снимаются коэффициенты. Ставь рабочую | S210 |
| C | Сколько циклов пройти. По умолчанию 5; меньше трёх прошивка примет молча, но отработает три | C8 |
| U | U1 — применить найденные коэффициенты сразу. Без него прошивка только напечатает их | 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, значит коэффициенты уже стоят в оперативной памяти и вводить их руками не нужно. Осталось закрепить их в памяти платы:
M500U1 и команда M301 меняют значения только в оперативной памяти. M500 сохраняет настройки в EEPROM платы, и после перезагрузки они остаются.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: защита во время автотюна работает так же, как в печати, и обрывает прогон.M501 и посмотри M503 уже после неё.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=210HEATER — имя нагревателя, то же, что имя секции конфига.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.
PID_CALIBRATE HEATER=heater_bed TARGET=60, дальше так же SAVE_CONFIG. Температуру задавай рабочую: 60 для PLA, 100 для ABS.control: watermark, запускать PID_CALIBRATE всё равно можно. Прогон отрабатывает как обычно, а сохранение записывает в автоблок не только коэффициенты, но и строку control = pid — то есть само переводит нагреватель на PID. Отдельно править секцию перед калибровкой не нужно.printer.cfg: у сопла это extruder, без нуля на конце./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.0max_delta здесь — половина ширины коридора: нагреватель выключается, когда температура поднялась выше уставки на это значение, и включается снова, когда опустилась ниже на столько же. По умолчанию 2 °C.
PIDTEMPBED в Configuration.h, и в стоковой конфигурации она закомментирована — стол работает по bang-bang, а M303 E-1 и M304 требуют как раз её. Включена она или нет, видно по M503: строки с PID стола на такой сборке просто не будет.BED_CHECK_INTERVAL из Configuration_adv.h. Гистерезис появляется только с отдельной опцией BED_LIMIT_SWITCHING, а она лежит в Configuration.h, рядом с PIDTEMPBED. Включишь её — нагрев выключается выше уставки на BED_HYSTERESIS и включается ниже неё на столько же, по умолчанию на 2 °C; сам BED_HYSTERESIS задаётся снова в Configuration_adv.h. Файла два, и это не опечатка.[heater_generic]: там важна ровная температура, а не средняя.Что делать, если PID не сходится или температура гуляет и после него
Автонастройка описывает систему, которую ей дали. Если система шумит сама по себе, коэффициенты будут выведены из шума, и результат окажется не лучше исходного. Проверять в таком порядке.
M105 и шевели провод у выхода из блока и у разъёма платы. Скачок при шевелении — обрыв в жиле или в разъёме, PID тут ни при чём.TEMP_SENSOR_0 в Marlin, sensor_type в секции [extruder] у Klipper) и должен совпадать с тем, что физически стоит.Thermal Runaway в Marlin и Heater not heating at expected rate в Klipper — защита от пожара: она ловит случай, когда нагреватель греет, а датчик этого не видит, потому что выпал из блока. Правильная реакция — найти причину, а не поднимать пороги в конфиге.