Pid gcode: Автотюнинг PID для Marlin
Klipper How-To | FlyingBear Wiki
- Управляющий компьютер Raspberry Pi
- Прошивка Raspberry Pi
- Прошивка платы принтера
- Подключение к Raspberry Pi
- Подключение к Управляющей плате
- Конфигурация Klipper
- Команды и Макросы Klipper
- Дополнения и модификации
Klipper поддерживает большинство, но не все стандартные команды G-code, к которым мы привыкли во время пользования Marlin. В то время, как команды Marlin записываются букво-численным кодом, например, M118
или M104 S240
, сам Klipper использует человекочитаемый формат команд, например, та же команда M104 S240
будет иметь вид SET_HEATER_TEMPERATURE HEATER=extruder TARGET=240
. Klipper примет оба варианта. Документация по командам
Киллер-фича Klipper — это макросы — последовательности команд G-code, которые можно запускать одной командой. Например, все команды, которые вы прописали в стартовый G-code слайсера, можно прописать в макрос и запускать одной командой START_PRINT
. В интернете существует огромное количество вариантов макросов для Klipper. Обязательно тщательно изучите последовательность команд в добавляемом макросе, чтобы избежать возможных проблем, связанных с несовместимостью параметров нашего принтера и принтера составителя макроса. Документация по макросам
Ниже представлены мои макросы, составленные по принципу «Я художник, я так вижу».
Соответственно, название макроса пишется в квадратных скобках в формате [gcode_macro НАЗВАНИЕ_МАКРОСА]
, затем указываются переменные, если нужно, а сами команды идут после gcode:
с обязательным отступом. Макросы чувствительны к форматированию, будьте внимательны.
В Fluidd можно выборочно добавить кнопки запуска макросов на специальную панель.
[gcode_macro START_PRINT] variable_retract: 5 gcode: {% set extruder_temp = params.EXTRUDER_TEMP|default(240)|float %} {% set bed_temp = params.BED_TEMP|default(70)|float %} {% set E = printer["gcode_macro START_PRINT"]. retract|float %} CLEAR_PAUSE M220 S100 # reset feedrate M221 S100 # reset flowrate SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET={bed_temp} # set bed t℃ TEMPERATURE_WAIT SENSOR=heater_bed MINIMUM={bed_temp * 0.75} # wait until bed is partially heated SET_HEATER_TEMPERATURE HEATER=extruder TARGET={extruder_temp} # set nozzle t℃ G90 # absolute positioning M82 # absolute extrusion mode TEMPERATURE_WAIT SENSOR=heater_bed MINIMUM={bed_temp} # wait until TEMPERATURE_WAIT SENSOR=extruder MINIMUM={extruder_temp} # wait until G28 # home G0 Z10 F1500 # raise Z G92 E0 # reset extruder G1 E{E} F1500 # prime G92 E0 # reset extruder
Макрос начала печати. Стартовый код для Super/PrusaSlicer’а:
START_PRINT EXTRUDER_TEMP=[first_layer_temperature] BED_TEMP=[first_layer_bed_temperature]
для Cura:
START_PRINT EXTRUDER_TEMP={material_print_temperature_layer_0} BED_TEMP={material_bed_temperature_layer_0}
Макрос задаёт целевую температуру прогрева стола, а по достижении неполного нагрева (75%) подключает нагрев сопла. Выставьте коэффициент таким, чтобы стол и сопло у вас достигали целевого нагрева примерно одновременно. Если у вас блок питания работает на пределе, то стоит убрать одновременный нагрев стола и сопла. Тогда замените bed_temp * 0.75
на bed_temp
или удалите эту строчку. Вместо команд Klipper можно использовать и M109/M104/M190/M140, но, по моим наблюдениям, команда M190
ждёт стабилизацию температуры на указанном уровне, что увеличивает время выполнения этого макроса.
Команда set
в теле макроса используется для инициализации переменной и присвоения значения params
которое было передано с командой на выполнение макроса. Здесь передаётся температура нагрева. Если передать только команду START_PRINT
без параметров, то будут использованы указанные в макросе значения по умолчанию. Здесь — 240 ℃ для экструдера и 70 ℃ для стола.
variable_retract
здесь используется в качестве глобальной переменной, которая используется сразу во всех макросах, связанных с печатью для того, чтобы значение ретракта при окончании, отмене или паузе печати совпадало с подачей при начале или возобновлении печати. Значение выставьте удобное для вас. Вызов переменной происходит командой {% set E = printer["gcode_macro START_PRINT"].retract|float %}
Для нормализации подачи пластика в начале печати можно использовать юбку в слайсере. Или добавить в стартовый код слайсера после START_PRINT
макрос PRIME_LINE
, который будет описан позже.
[gcode_macro END_PRINT] gcode: {% set E = printer["gcode_macro START_PRINT"].retract|float %} TURN_OFF_HEATERS M107 # turn off fan G91 # relative positioning G1 E-{E} F1500 # retract G0 X5 Y5 Z0. 2 F5000 # wipe G0 Z2 F1500 # raise Z G90 # absolute positioning PARK M84 # turn off all motors BEEP P=200 S=250
Из макросов можно запускать другие макросы! Здесь запускается макрос PARK
, он описан ниже.
[gcode_macro PARK] gcode: {% set x_park = params.X|default(0)|float %} {% set y_park = params.Y|default(-4)|float %} {% set z_park = params.Z|default(10)|float + printer.toolhead.position.z|float %} {% set x_max = printer.toolhead.axis_maximum.x|float %} {% set y_max = printer.toolhead.axis_maximum.y|float %} {% set z_max = printer.toolhead.axis_maximum.z|float %} {% if x_park > x_max %} {% set x_park = x_max %} {% endif %} {% if y_park > y_max %} {% set y_park = y_max %} {% endif %} {% if z_park > z_max %} {% set z_park = z_max %} {% endif %} SAVE_GCODE_STATE NAME=PARK_STATE G90 # absolute positioning G1 Z{z_park} F1500 G1 X{x_park} Y{y_park} F5000 RESTORE_GCODE_STATE name=PARK_STATE
В макросах можно использовать шаблонизатор Jinja. Полезно для вычислений и условных конструкций «если — то». Здесь в параметрах координаты парковки по X и Y указываются абсолютно, а координата по Z — отностительно. Эти параметры можно передавать при вызове макроса. Например, у меня в макросе END_PRINT
парковка происходит у задней стенки с опусканием стола: PARK X=127 Y=200 Z=50
. При этом по трём осям происходит проверка и корректировка координат, чтобы они находились в пределах лимитов, Z-координата становится абсолютной.
[gcode_macro PAUSE] rename_existing: BASE_PAUSE gcode: {% set E = printer["gcode_macro START_PRINT"].retract|float %} SAVE_GCODE_STATE NAME=PAUSE_STATE BASE_PAUSE G91 G1 E-{E} F1500 # retract G90 PARK
А ещё есть встроенные макросы, такие как PAUSE
. А если такой макрос вас чем-то не устраивает, его можно изменить или дополнить. Здесь сначала переименовывается встроенный макрос командой rename_existing
, а затем используется в коде под новым именем BASE_PAUSE
.
Ещё здесь используется команда на запоминание режима позиционирования принтера SAVE_GCODE_STATE
. Внутри действия этой команды, такие команды как M82
, M83
, G90
, G91
, G92
могут применяться как вам угодно, т.к. режим позиционирования вернётся к сохранённому после команды RESTORE_GCODE_STATE
. Ссылка
Обязательный для Fluidd макрос. Кнопка вызова добавляется в блок информации о текущей печати.
[gcode_macro RESUME] rename_existing: BASE_RESUME gcode: {% set E = printer["gcode_macro START_PRINT"].retract|float %} G91 G1 E{E} F1500 # unretract G90 RESTORE_GCODE_STATE NAME=PAUSE_STATE MOVE=1 BASE_RESUME
Антагонист макроса PAUSE
. Тоже обязательный для Fluidd.
[gcode_macro CANCEL_PRINT] rename_existing: BASE_CANCEL_PRINT gcode: {% set E = printer["gcode_macro START_PRINT"]. retract|float %} TURN_OFF_HEATERS M107 # turn off fan G91 G1 E-{E} F1500 # retract G90 CLEAR_PAUSE SDCARD_RESET_FILE BASE_CANCEL_PRINT PARK
Последний обязательный для Fluidd макрос.
[gcode_macro BEEP] gcode: {% set frequency = params.S|default(1000)|float %} {% set duration = params.P|default(100)|float %} SET_PIN PIN=BEEPER_pin VALUE={frequency} G4 P{duration} SET_PIN PIN=BEEPER_pin VALUE=0
Принтер пищит по команде BEEP
, то же самое, что M300
. За частоту отвечает параметр S
, по умолчанию 1kHz. За длительность — P
, по умолчанию 10ms.
Обратите внимание, что пин пищалки находится на штатном экране принтеров FBG4S и FBG5. Если вы меняли экран, то пин пищалки у вас может быть другим или вообще отсутствовать (например в экране MKS TFT35). Лучше заранее проверьте в консоли команду BEEP
и, в случае ошибки, удалите её из всех макросов.
[gcode_macro FILAMENT_CHANGE] gcode: SAVE_GCODE_STATE NAME=FILAMENT_CHANGE_STATE {% set timer = params.T|default(300)|float %} {% set unload = params.U|default(100)|float %} {% set load = params.L|default(100)|float %} {% if printer.pause_resume.is_paused %} M118 Already paused {% else %} {% if printer.toolhead.homed_axes != "xyz" %} M118 Homing G28 # home if not homed {% else %} M118 Pausing print PAUSE {% endif %} {% endif %} M118 Changing filament SET_IDLE_TIMEOUT TIMEOUT=7200 FILAMENT_UNLOAD U={unload} COUNTDOWN TIME={timer} MSG="Change filament! Time left: " FILAMENT_LOAD L={load} RESTORE_GCODE_STATE NAME=FILAMENT_CHANGE_STATE {% if printer.pause_resume.is_paused %} M118 Resuming print RESUME {% endif %}
Составной макрос смены филамента. Ставит на паузу PAUSE
, вызывает макрос FILAMENT_UNLOAD
для выгрузки филамента, подаёт звуковой сигнал BEEP
, COUNTDOWN
ждёт 5 минут, пока вы заправите новый филамент в фидер, снова подаёт звуковой сигнал и FILAMENT_LOAD
загружает филамент, RESUME
запустит печать дальше, если макрос был вызван в процессе печати, например из G-code.
[gcode_macro FILAMENT_LOAD] gcode: {% set load = params.L|default(100)|float * 0.5 %} {% set extruder_temp = params.T|default(240)|float %} SAVE_GCODE_STATE NAME=FILAMENT_LOAD_STATE LOW_TEMP_CHECK T={extruder_temp} M118 Loading filament M83 # relative extrusion G1 E{load} F1500 # extrude fast G4 P1000 # wait 1 second G1 E{load} F200 # extrude slow BEEP RESTORE_GCODE_STATE NAME=FILAMENT_LOAD_STATE
[gcode_macro FILAMENT_UNLOAD] gcode: {% set unload = params. U|default(100)|float %} {% set extruder_temp = params.T|default(180)|float %} SAVE_GCODE_STATE NAME=FILAMENT_UNLOAD_STATE LOW_TEMP_CHECK T={extruder_temp} M118 Unloading filament M83 # relative extrusion G1 E2 F200 # extrude a little G1 E-10 F200 # retract a little G1 E-{unload} F1500 # retract a lot BEEP RESTORE_GCODE_STATE NAME=FILAMENT_UNLOAD_STATE
Оба вызывают LOW_TEMP_CHECK
для проверки температуры сопла.
[gcode_macro LOW_TEMP_CHECK] gcode: {% set extruder_temp = params.T|default(240)|float %} {% if printer.extruder.target > extruder_temp %} # if there is a setpoint for extruder {% set extruder_temp = printer.extruder. target %} {% endif %} {% if printer.extruder.temperature < extruder_temp %} # heat to the target M118 Heating to {extruder_temp} SET_HEATER_TEMPERATURE HEATER=extruder TARGET={extruder_temp} TEMPERATURE_WAIT SENSOR=extruder MINIMUM={extruder_temp} {% endif %}
Если сопло холодное и нагрев не включен, то он запустится с указанным параметром по умолчанию: 180℃ для выгрузки и 240℃ для загрузки.
[gcode_macro COUNTDOWN] gcode: {% set timer = params.TIME|default(10)|int %} {% set message = params.MSG|default("Time: ") %} # countdown {% if timer > 60 %} {% for s in range(timer, 60, -10) %} M118 {message} {s}s G4 P10000 # dwell 10 seconds {% endfor %} {% set timer = 60 %} {% endif %} {% if timer > 10 %} {% for s in range(timer, 10, -5) %} M118 {message} {s}s G4 P5000 # dwell 5 seconds {% endfor %} {% set timer = 10 %} {% endif %} {% if timer > 0 %} {% for s in range(timer, 0, -1) %} M118 {message} {s}s G4 P1000 # dwell 1 second {% endfor %} {% endif %} BEEP
Совместимость с командами Marlin G-code. Преобразования команд, таких как M204, M900, M600 и так далее, у которых нет реализации в Klipper, либо реализованы в его человекочитаемом формате. Часть из них важна для лёгкой передачи настроек из слайстеров, как M204. Часть не важна и показаны скорее для полноты картины.
[gcode_macro M76] # Marlin Compatibility gcode: PAUSE [gcode_macro M601] # Prusa Compatibility gcode: PAUSE [gcode_macro G27] # Marlin Compatibility gcode: PARK [gcode_macro M125] # Marlin Compatibility gcode: PARK [gcode_macro M300] # Marlin Compatibility gcode: BEEP [gcode_macro M600] # Marlin Compatibility gcode: FILAMENT_CHANGE [gcode_macro M701] # Marlin Compatibility gcode: FILAMENT_LOAD [gcode_macro M702] # Marlin Compatibility gcode: FILAMENT_UNLOAD [gcode_macro M92] gcode: {% set extruder_steps = params. E|default(0.0025)|float %} SET_EXTRUDER_STEP_DISTANCE DISTANCE={extruder_steps} [gcode_macro M500] gcode: SAVE_CONFIG
Марлин принимает команду M204
, но либо в виде M204 S<value>
, либо M204 P<value> T<value>
, где указаны оба параметра. Cura прописывает ускорение в G-code в виде M204 S<value>
, так что с ней проблем нет, а вот Prusa(Super)Slicer — в виде M204 P<value>
, без T<value>
, что вызывает ошибку. Исправляем, теперь Klipper принимает любые комбинации этих параметров:
[gcode_macro M204] rename_existing: M204.1 gcode: {% set factor = params.F|default(0.5)|float %} {% if 'S' in params %} SET_VELOCITY_LIMIT ACCEL={S} ACCEL_TO_DECEL={ S|float * factor } {% else %} {% if 'P' in params %} {% if 'T' in params %} {% if P|int < T|int %} SET_VELOCITY_LIMIT ACCEL={P} ACCEL_TO_DECEL={ P|float * factor } {% else %} SET_VELOCITY_LIMIT ACCEL={T} ACCEL_TO_DECEL={ T|float * factor } {% endif %} {% else %} SET_VELOCITY_LIMIT ACCEL={P} ACCEL_TO_DECEL={ P|float * factor } {% endif %} {% elif 'T' in params %} SET_VELOCITY_LIMIT ACCEL={T} ACCEL_TO_DECEL={ T|float * factor } {% endif %} {% endif %}
Использование этого макроса не совсем корректно, так как SQUARE_CORNER_VELOCITY
в Klipper не является прямым аналогом ни JD, ни Jerk, и значения будут совсем другими. Но для передачи настроек из слайсера в Klipper сойдёт, если вы выставите корректные значения в слайсере. Хотя, по большому счёту их вполне можно один раз откалибровать, больше не трогать и запретить слайсеру менять значения.
[gcode_macro M205] gcode: {% if 'J' in params %} SET_VELOCITY_LIMIT SQUARE_CORNER_VELOCITY={J} {% elif 'X' in params %} SET_VELOCITY_LIMIT SQUARE_CORNER_VELOCITY={X} {% elif 'Y' in params %} SET_VELOCITY_LIMIT SQUARE_CORNER_VELOCITY={Y} {% endif %}
Управление прошивочным откатом.
[gcode_macro M207] gcode: {% set length = params.S|default(0.5)|float %} {% set speed = params.F|default(25)|float %} SET_RETRACTION RETRACT_LENGTH={length} RETRACT_SPEED={speed}
Ещё один костыль для такого слайсера, как Cura. В случае Prusa(Super)Slicer можно прописать SET_PRESSURE_ADVANCE ADVANCE=<value>
в стартовом G-code филамента, что очень удобно.
[gcode_macro M900] gcode: {% if 'K' in params %} SET_PRESSURE_ADVANCE ADVANCE={ params. K|float } {% endif %}
Макрос ну для совсем специфической совместимости, например с отдельными G-code файлами с набором команд для настройки PID. Лучше делать это руками, командой PID_CALIBRATE
[gcode_macro M303] gcode: {% if 'E' in params %} {% set heater = params.E|default(0)|int %} {% set temp = params.T|default(0)|float %} {% if heater == 0 %} # extruder {% if temp >= printer.configfile.settings.extruder.min_extrude_temp|float %} {% if temp <= printer.configfile.settings.extruder.max_temp|float %} PID_CALIBRATE HEATER=extruder TARGET={T} {% endif %} {% endif %} {% elif heater == -1 %} # bed {% if temp <= printer.configfile.settings.heater_bed.max_temp|float %} PID_CALIBRATE HEATER=heater_bed TARGET={T} {% endif %} {% endif %} {% endif %}
Команда M486
в слайсере присваивает ярлыки моделям для того, чтоб плагинам Октопринт было легче отменить печать отдельных моделей, не прерывая печать остальных. В Klipper такой функциональности нет и команда M486
постоянно показывает ошибку в терминале. Для удаления этой ошибки можно использовать «пустой» макрос:
[gcode_macro M486] gcode: # Do nothing
В качестве бонуса моя версия макроса для нормализации потока и убирания вытекшего в простое пластика. В сети полно примеров попроще, но этот макрос является универсальным, так как учитывает диаметр сопла и скорость печати первого слоя в слайсере, что критично для флексов. Для этого производит упрощённый подсчёт объёма выдавленного пластика V = lwh, где l — длина линии, w — ширина (равна диаметру сопла), h — высота (равна примерно 3/4 ширины сопла, кратна 0.04). Рисует линию вдоль края стола по оси X по умолчанию, или, если указать параметр Y
, то вдоль оси Y соответственно. Для вызова добавляем в стартовый код принтера в слайсере
- PrusaSliser:
PRIME_LINE F={first_layer_speed}
- Cura:
PRIME_LINE F={speed_print_layer_0}
Является заменой юбки. Основное преимущество — легче удалять.
[gcode_macro PRIME_LINE] gcode: {% set feedrate = params.F|default(10)|float * 60 %} {% set length = 100.0 %} {% set width = printer.configfile.settings.extruder.nozzle_diameter|float %} {% set height = ( (width / 0.04)|int - (width / 0.04 / 4)|int )|float * 0.04 %} {% set extrude = length * width * height / 1.6 %} SAVE_GCODE_STATE NAME=PRIME_LINE_STATE SET_IDLE_TIMEOUT TIMEOUT=7200 {% if 'Y' in params %} {% set x_start = 1.0 %} {% set y_start = (printer.toolhead.axis_maximum.y|float - 100) / 2 %} G0 X{x_start} Y{y_start} F5000 # move to start position G0 Z{height} F1500 G91 # relative positioning G1 Y100 E{extrude} F{feedrate} # draw the 1st line G0 X{width} F5000 # move to the next line G1 Y-100 E{extrude} F{feedrate} # draw the 2nd line {% else %} {% set x_start = (printer. toolhead.axis_maximum.x|float - 100) / 2 %} {% set y_start = 1.0 %} G0 X{x_start} Y{y_start} F5000 # move to start position G0 Z{height} F1500 G91 # relative positioning G1 E4 F{feedrate} # prime G1 X100 E{extrude} F{feedrate} # draw the 1st line G0 Y{width} F5000 # move to the next line G1 X-100 E{extrude} F{feedrate} # draw the 2nd line {% endif %} RESTORE_GCODE_STATE NAME=PRIME_LINE_STATE
- Дополнения и модификации
Калибровка PID сопла в одно касание
Fockus
Администратор
#1
#1
Калибровку PID можно выполнить просто запустив на печать файл содержащий весь необходимый код. Новые значения PID будут сохранены в энергонезависимую память и применены автоматически. Перезагрузка не требуется.
В первую очередь предупреждение: код содержащийся в файле — не универсален. Он написан для владельцев принтера FlyingBear Ghost и будет работать на всех ревизиях принтера.
Для владельцев остальных принтеров: калибруется только экструдер E0. Учтите это, если у вас два экструдера и измените код . Само собой в прошивке должна быть включена возможность записи в EEPROM.
Как это работает:
Что бы файл не потерялся среди других предлагаю в корневой папке SD карты создать папку «Utilities» и поместить туда файл Autotune_PID_E0.gcode (Ссылка на файл).
Для уверенности с экрана заходим в «Инструменты» и нажимаем в правом нижнем углу на плашку с версией Marlin. Выбираем строку PID сопла и фотографируем текущие значения. Сверим потом с новыми и убедимся, что все прошло успешно.
При запуске файла сначала выполняется парковка, после этого стол опускается на 15 мм и хотэнд перемещается на 25 мм по оси X. Это сделано для того, чтобы дать возможность воздуху охлаждения хотэнда циркулировать достаточно свободно.
Выполняются команды:
C#:
G28 G1 Z15.0 F1500 G1 X25.0 F1500
После этого начинается процесс калибровки PID. При этом на экране принтера можно наблюдать за изменениями температуры хотэнда. Калибровка занимает около 5 минут. После завершения принтер сообщит об успешной печати файла.
Выполняются команды:
C#:
M303 E0 S200 C8 U M500 M503
Как проверить, что значения PID обновились: на экране проходим весь путь «Инструменты»-«Marlin»-PID сопла и сравниваем с фотографией прошлых значений. После перезагрузки принтера можно снова проконтролировать, что значения сохранились.
Таким же образом можно калибровать и PID стола, нужно лишь немного поправить файл. Не даю этот код здесь по простой причине: в стоковых принтерах стол греется как bang-bang и процесс калибровки для стола не применим. Режим нагрева стола с PID включается в прошивке, и если вы с этим справились, то и поправить gcode в файле не составит труда.
Последнее редактирование:
По всем вопросам обращаться в ЛС
Симпатии:
Это понравилось alexgusev
Valentinych
Новичок
#2
#2
А как прочитать стоковые настройки PID у Ghost S4 с Mineboard V3. 0? В меню этой версии не отображаются показанные выше окна.
P.S. И вообще, хотелось бы понять, как изменять параметры EEPROM принтера, я не смог найти это ни здесь, ни в клипах Соркина. Можно ли это сделать из-под Куры, или нужно просто поправить код руками в файле robin_nano35_cfg.txt?
Хотя рекомендаций по таким изменениям очень много — от настройки PID-регулирования, до настройки подачи филамента. Измерил это значение у себя на S4, и оказалось, что при подаче команды «выдавить 300 мм» фактически подается только 286 мм. После этого рассчитал новый коэффициент, но куда запхать невпихуемое не знаю.
Последнее редактирование:
Valentinych
Новичок
#3
#3
Исправил коэффициент прямо в файле robin_nano35_cfg. txt, и перезалил прошивку. Контрольное измерение длины выхода филамента — 299 мм (в команде — 300). Пока остановлюсь на этом. А вот можно ли сделать то же самое с настройкой PID-регулятора?
Fockus
Администратор
#4
#4
Valentinych написал(а):
Исправил коэффициент прямо в файле robin_nano35_cfg.txt, и перезалил прошивку. Контрольное измерение длины выхода филамента — 299 мм (в команде — 300). Пока остановлюсь на этом. А вот можно ли сделать то же самое с настройкой PID-регулятора?
Нажмите для раскрытия. ..
Всё правильно сделали, но 299 не 300, лучше калибровать до конца. Что за пид регулятор? В призраке его нет
По всем вопросам обращаться в ЛС
Valentinych
Новичок
#5
#5
Fockus написал(а):
Что за пид регулятор? В призраке его нет
Нажмите для раскрытия…
Тогда это что:
Fockus написал(а):
Калибровку PID можно выполнить просто запустив на печать файл содержащий весь необходимый код. Новые значения PID будут сохранены в энергонезависимую память и применены автоматически. Перезагрузка не требуется.
… код содержащийся в файле — не универсален. Он написан для владельцев принтера FlyingBear Ghost и будет работать на всех ревизиях принтера.
Нажмите для раскрытия…
У меня S4, это разве не призрак?
Fockus
Администратор
#6
#6
Valentinych написал(а):
Тогда это что:
У меня S4, это разве не призрак?
Нажмите для раскрытия…
S4 это ревизия призрака, а пид регулятор это я не так понял, всё ок
По всем вопросам обращаться в ЛС
Valentinych
Новичок
#7
#7
Ну и как мне победить этот PID? Я же задал абсолютно однозначный вопрос: как и где посмотреть дефолтные установки стокового PID’а. Прошивка, установленная в моем принте, не показывает картинки, как показанные выше. Где еще можно увидеть предустановленные коэффициенты PID, чтобы оценить результаты калибровки?
Симпатии:
Это понравилось acomp
Fockus
Администратор
#8
#8
Valentinych написал(а):
Ну и как мне победить этот PID? Я же задал абсолютно однозначный вопрос: как и где посмотреть дефолтные установки стокового PID’а. Прошивка, установленная в моем принте, не показывает картинки, как показанные выше. Где еще можно увидеть предустановленные коэффициенты PID, чтобы оценить результаты калибровки?
Нажмите для раскрытия…
Нажмите в меню принтера на название прошивки и там будут ПИДы стола и сопла. После калибровки стол должен греться быстрее. Если был с завода был нормальным, то ничего не изменится
По всем вопросам обращаться в ЛС
Симпатии:
Это понравилось alexgusev
Valentinych
Новичок
#9
#9
Спасибо
Костя
3дэшник
#10
#10
Ссылка на файл не работает. У меня на 4S не такое меню в закладках инструменты. В нижнем правом углу, если зайти в показывает версию прошивки, и электронный адрес службы поддержки.
Fockus
Администратор
#11
#11
Костя написал(а):
Ссылка на файл не работает. У меня на 4S не такое меню в закладках инструменты. В нижнем правом углу, если зайти в показывает версию прошивки, и электронный адрес службы поддержки.
Нажмите для раскрытия…
Во вложении файл. Открой блокнот, измени температуру на нужную, закинь на флешку и запусти печать из этого файла. Когда Всё будет готово перезагрузи принтер
Autotune_PID.zip
229 байт
Просмотры: 51
По всем вопросам обращаться в ЛС
Костя
3дэшник
#12
#12
Fockus написал(а):
и запусти печать из этого файла
Нажмите для раскрытия…
А никакие провода вентилятора не нужно перекоммутировать? Пишут на этом
Пожалуйста Войдите или Зарегистрируйтесь для просмотра скрытого текста.
, что обдув отключается, и можно сжечь хотенд в 4S версии.
Костя
3дэшник
#13
#13
Моя ссылка на сайт в данный момент почему то не активна. Наверное какие то обновления делают.
Последнее редактирование:
Костя
3дэшник
#14
#14
Сделал калибровку сопла через программу Repetier-Host. В ней можно наблюдать за процессом, вводить команды вручную. А вот с калибровкой стола по таким командам:
M303 E1 C8 S55 U
M500
M503
Не проходит, вот что мне отображает.
Последнее редактирование:
Костя
3дэшник
#15
#15
Вычитал, что По умолчанию PID стола вообще отключен . Может из-за этого выдает ошибку. Как его включить, кто это делал?
Fockus
Администратор
#16
#16
Костя написал(а):
Вычитал, что По умолчанию PID стола вообще отключен . Может из-за этого выдает ошибку. Как его включить, кто это делал?
Нажмите для раскрытия…
Конечно нужно включить, я думал ты включил уже
По всем вопросам обращаться в ЛС
Костя
3дэшник
#17
#17
А какой командой его включить?
Fockus
Администратор
#18
#18
Костя написал(а):
А какой командой его включить?
Нажмите для раскрытия. ..
Надо в прошивку лезть. Забей на стол, калибровка стола особо ничего не даст. Если щас нагревается нормально, то лучше не трогай. А если хочешь быстрый нагрев стола, то нужно ставить грелку 220в
По всем вопросам обращаться в ЛС
Костя
3дэшник
#19
#19
Сейчас больше печатаю АБС, и подумываю, что нужно ставить грелку от 220. А когда PLA, то нормально, потребность отпадает.
Fockus
Администратор
#20
#20
Костя написал(а):
Сейчас больше печатаю АБС, и подумываю, что нужно ставить грелку от 220. А когда PLA, то нормально, потребность отпадает.
Нажмите для раскрытия…
Штатный стол греется минуты 3, не так и много же )
По всем вопросам обращаться в ЛС
Поделиться:
Vkontakte
Odnoklassniki
Mail.ru
Facebook
Telegram
Viber
Skype
Электронная почта
Ссылка
ПИД-регулирование (с кодом), проверка и планирование
к
Дэвид Коханбаш
на
22 сентября 2014 г.
Привет всем! ПИД-регуляторы
— это рабочая лошадка в мире систем управления. ПИД-контроллеры предназначены для того, чтобы принять некоторую ошибку в вашей системе и свести ее к нулю. Хотя существует множество других стратегий управления, ПИД-регулятор, вероятно, является наиболее распространенным (если вы не считаете управление человеком) за исключением простой установки уставки. Существует множество продвинутых стратегий управления, но в большинстве случаев они будут работать так же или хуже, чем PID, и будут намного сложнее. Когда другие методы работают лучше, это часто бывает лишь на небольшую величину. Единственным исключением является то, что если у вас есть модель устройства и условия его работы, вы можете создать контроллер с прямой связью (хорошо для аспирантов), который работает лучше. Однако во многих случаях использование реактивного управления с ПИД-регулятором является самым простым и быстрым способом реализации.
Когда мы говорим о ПИД-регулировании, вы должны помнить, что каждая буква представляет собой отдельный режим контроллера. P для пропорционального элемента, I для интегрального элемента, а D для производного элемента. У каждого элемента есть «термин», который умножается на эти элементы. Мы используем K как общее постоянное значение, поэтому постоянные члены (или коэффициенты усиления) равны K P , K I и K D соответственно. В зависимости от вашего приложения у вас могут быть или не быть все три термина. Во многих приложениях у вас будут только термины PD или PI.
Итак, основной вопрос: как преобразовать ошибку в системе, чтобы сформировать лучшую новую команду?
Нажмите на изображение, чтобы увидеть более четкую/большую версию уравнений.
Существует множество форм ПИД-регулятора. Но вот два, которые будут интересны большинству людей:
Примечание: e и e(t) являются условиями ошибки, они определяются как: e = требуемое_значение – фактическое_значение. Часто фактическое_значение исходит от какого-то датчика, который вы должны определить для текущего значения.
Первый в непрерывном времени:
Секунда в дискретном времени, что чаще используется в приложениях, управляемых компьютером:
А вот и псевдокод дискретной версии ПИД-регулятора:
error_prior = 0
Integer_Prior = 0
K P = Некоторое значение, которое необходимо получить (см. раздел настройки ниже)
K I = Некоторое значение, которое необходимо получить (см. раздел настройки ниже)
K D = Некоторое значение, которое необходимо получить (см. раздел настройки ниже)
смещение = 0 (см. ниже)while(1) {
ошибка = желаемое_значение – фактическое_значение
интеграл = априорный интеграл + ошибка * время_итерации
производная = (ошибка – априорная_ошибка) / время_итерации
вывод = K P *ошибка + K I *интеграл + K D *производная + смещение
error_prior = ошибка
интеграл_априор = интеграл
сон(время_итерации)
}
В то время как дискретный подход более полезен с точки зрения реализации. Когда дело доходит до понимания и настройки вашего контроллера, вам важно понять непрерывный подход.
Кроме того, хотя вы обычно не видите член смещения, добавленный к фильтру, я предпочитаю добавлять его на тот случай, если все остальное в сумме равно 0, а вам все еще нужно движение, я не буду иметь 0 в качестве вывода. Это не является строго необходимым, но хорошо иметь во многих случаях. Например, если колесо должно постоянно вращаться, а ПИД-регулятор просто поддерживает заданную скорость.
Условия
Итак, теперь, когда мы знаем форму этого контроллера, мы можем посмотреть, что делает каждый член.
Пропорциональный член (K
P )
Пропорциональный член — ваш основной член для контроля ошибки. это напрямую масштабирует вашу ошибку, поэтому при маленьком K P контроллер будет предпринимать небольшие попытки минимизировать ошибку, а при большом K P контроллер предпримет более крупную попытку. Если K P слишком мал, вы никогда не сведете к минимуму ошибку (если только вы не используете термины D и I) и не сможете реагировать на изменения, влияющие на вашу систему, а если K P слишком велик, у вас может быть нестабильный (т.е. странные колебания) фильтр, который сильно превышает желаемое значение.
Интегральный член (K
I )
Интегральный член позволяет контроллеру обрабатывать ошибки, которые накапливаются с течением времени. Это хорошо, когда вам нужно обрабатывать ошибки устойчивого состояния ошибок. Проблема в том, что если у вас большой K I , вы пытаетесь исправить ошибку с течением времени, поэтому она может помешать вашей реакции на текущие изменения. Этот термин часто является причиной нестабильности вашего ПИД-регулятора.
Производный термин (K
D )
Производный термин показывает, как ваша система ведет себя между временными интервалами. Это помогает демпфировать вашу систему для повышения стабильности. Многие контроллеры двигателей позволяют настроить только ПИ-регулятор. В некоторых случаях это может быть отрицательным.
Какие перестановки P, I и D мне нужны?
Во многих приложениях вы не будете использовать все 3 термина. Так почему бы просто не использовать всегда все 3 термина? Чем меньше терминов вы используете, тем легче понять и реализовать контроллер. Кроме того, как вы скоро увидите, некоторые режимы могут вызывать нестабильность (например, сильные вибрации) в элементах управления.
Почти каждый фильтр будет иметь термин P. Итак, давайте просто предположим, что K P находится в нашем фильтре. Теперь вопрос в том, хочу ли я добавить в свой фильтр только I, только D или и то, и другое.
Если вы хотите, вы можете иметь только термин P. Это самый простой тип контроллера для настройки, так как вы играете только с одним значением. Недостатком является то, что ваш контроллер не будет плавно исправлять внезапные и устойчивые ошибки.
Если вы добавите термин D, вы будете более восприимчивы к шуму и случайным значениям. Поэтому, если у вас есть очень зашумленные данные или случайные импульсы, которые измеряют ваши датчики, вы можете опустить термин D. Недостатком отказа от термина D является то, что вы не отвечаете на те случайные значения, которые могут быть законными, поэтому у вас будет более медленное время отклика. Примером этого является то, что если ваш двигатель ударяется о камень, потребуется больше времени для увеличения заданного значения, поскольку вы не смотрите на то, как ошибка меняется со временем. Однако, если вы работаете над роботизированной рукой, вам может понадобиться термин D, чтобы вы могли быстро реагировать на изменяющиеся силы.
Термин I становится сложным. Во многих случаях вам понадобится член I, чтобы вы могли исправить ошибку, которая медленно накапливается. Недостатком является то, что термин I медленно реагирует. Эта медлительность может привести к нестабильности вашего контроля.
Как настроить фильтр?
Настройка фильтра может быть затруднена, поскольку устройству (например, двигателю) может потребоваться реагировать на различные условия. Например, если вы настраиваете двигатель без нагрузки, он может работать неоптимально с нагрузкой; и если вы измените нагрузку, вам может понадобиться другой набор значений для оптимального контроля. Так часто вы пытаетесь найти набор параметров, который работает лучше всего во всех случаях и не обязательно оптимален для каждого конкретного случая. Существует еще один подход, при котором вы получаете разные константы (значения K) для использования в фильтре и выбираете, какой набор использовать на основе фактических значений в системе.
Существует множество способов настройки ПИД-регулятора. Два лучших способа, которые я знаю, — это ручной (я знаю, что людям не нравятся ручные вещи, которые зависят от присутствия эксперта) и метод Циглера-Николса. С учетом сказанного я обнаружил, что могу получить лучшие результаты, настроив систему вручную, однако вы можете использовать метод Циглера-Николса в качестве отправной точки. (Следующие два подраздела в основном взяты из Википедии).
Ручная настройка
Если система подключена к сети, один из методов настройки — сначала установить K I и K D равны нулю. Увеличивайте K P до тех пор, пока выход контура не начнет колебаться (или просто не будет работать хорошо), затем K P должен быть установлен примерно на половину этого значения для отклика типа «четверть амплитудного затухания». Затем увеличивайте K I до тех пор, пока любое смещение не будет исправлено за достаточное для процесса время. Однако слишком большое количество K I вызовет нестабильность. Наконец, при необходимости увеличьте K D , пока выброс не будет минимальным. Однако слишком много K D вызовет медленную реакцию и вялость. Быстрая настройка контура ПИД-регулятора обычно слегка зашкаливает, чтобы быстрее достичь заданного значения; однако некоторые системы не допускают перерегулирования, и в этом случае требуется замкнутая система с избыточным демпфированием, для которой потребуется настройка K P , значительно меньшая, чем половина настройки K P , которая вызывала колебания.
Циглер-Николс
Другой эвристический метод настройки, официально известный как метод Циглера-Николса, был представлен Джоном Зиглером и Натаниэлем Б. Николсом в 1919 году.40с. Как и в описанном выше методе, коэффициенты усиления K I и K D сначала устанавливаются равными нулю. Пропорциональное усиление увеличивается до тех пор, пока не достигнет предельного усиления, K U , при котором выход контура начинает колебаться. K U и период колебаний P U используются для установки усиления, как показано:
Проверка параметров управления
Вы можете убедиться, что выбранные коэффициенты усиления хороши, посмотрев на форму выходного сигнала при применении пошаговой команды. Если в начале движения много начального звона (постоянное изменение) или перерегулирование, вероятно, ваш коэффициент усиления слишком высок. Если первоначальная команда медленно достигает желаемого результата, вам может потребоваться увеличить усиление.
Графики, показывающие распространенные проблемы с настройкой, за которыми следует хорошая кривая отклика. Синие линии — это команда, а красные линии — фактическая мощность двигателя.
На изображении выше, начиная слева, мы можем видеть:
1. Превышение выходного движения, с небольшим звоном сигнала, когда он устанавливается на команду. Небольшой перерегулирование часто допустимо, но мы пытаемся свести к минимуму перерегулирование, сохраняя при этом отзывчивую систему.
2. Медленная реакция выхода. Нам может понадобиться более быстрый ответ, чтобы система работала менее медленно. По мере того, как вы делаете систему менее медленной, вы часто увеличиваете перерегулирование и вероятность нестабильности.
3. Крайне нестабилен. Начинается с череды колебаний, за которыми следует большой всплеск в выводе команды. Мы хотим избежать этого!
4. Наконец, крайний правый график выглядит хорошо. Выходная мощность двигателя находится непосредственно над заданным движением с очень небольшим перерегулированием (если присмотреться).
Следующим шагом в проверке стабильности системы, которую вы только что настроили, может быть построение графика Боде. Нажмите здесь, чтобы узнать об этом
Планирование усиления
Проще говоря, планирование усиления позволяет выбирать различные наборы условий в зависимости от производительности системы. Таким образом, вы можете сказать, что если скорость меньше или равна некоторому значению, используйте один набор условий PID, если скорость больше этого значения, используйте другой набор условий PID. Это часто используется в нелинейных системах, так что вы можете упростить его до нескольких (почти) линейных частей. Это также хорошо, если есть какая-то область контроллера, где вам нужно быть более агрессивным.
Практические советы по программированию
PID (и другие контроллеры) могут вызвать очень резкие изменения ваших команд. Один из способов смягчить это — использовать трапециевидное управление (не путать с трапециевидной коммутацией). Установив скорость ускорения и замедления, мы можем сделать управление плавным и менее резким.
Еще один полезный совет: не забудьте установить минимальную и максимальную команды, которые могут быть отправлены вашим двигателям. Это предотвратит генерацию ПИД-регулятором неправильных/экстремальных команд для ваших двигателей.
Многие контроллеры двигателей позволяют задавать указанные выше значения ускорения, замедления и ограничения. Избавляет вас от необходимости реализовывать это с нуля.
Надеюсь, это было полезно, удачного тюнинга!
Понравилось? Найдите секунду, чтобы поддержать Дэвида Коханбаша на Patreon!
- Теги: управление, контроллеры, производная, DI, усиление, интеграл, двигатель, Николс, ПИ. PD, PID, пропорциональный, планирование, Циглер
- Категории: Программное обеспечение и алгоритмы, Системы и датчики
Введение в алгоритм ПИД-регулирования
Возможно, вы не знакомы с концепцией контура управления , но я гарантирую, что вы будете использовать его в той или иной степени каждый день. Контур управления — это любая система, в которой для управления определенным действием используется механизм обратной связи.
Когда вы ловите бейсбольный мяч, летящий по воздуху, ваши глаза обеспечивают обратную связь, которая сообщает вашему мозгу, где находится мяч и как вам нужно двигать рукой, чтобы его поймать. Когда вы хотите отрегулировать температуру душа перед входом в душ, вы чувствуете воду рукой, которая обеспечивает обратную связь с вашим мозгом и определяет, поворачиваете ли вы ручку, чтобы сделать воду горячее или прохладнее. Это примеры циклов управления.
Точно так же, как человеческое тело использует механизмы обратной связи и контуры управления, то же самое делают и электронные и механические устройства. Программный алгоритм, называемый PID, часто используется для управления этими системами. PID — это аббревиатура, обозначающая Пропорциональный , Интегральный и Производный . Те из вас, кто занимался исчислением, узнают эти термины, но для остальных они могут показаться немного пугающими. В этом посте я разберу три компонента алгоритма PID и объясню назначение каждого из них.
Как работает ПИД-регулятор
Чтобы описать, как работает алгоритм ПИД-регулятора, я буду использовать простой пример регулятора температуры. В этом примере у нас есть система, включающая электрическую горелку, кастрюлю с водой, датчик температуры и контроллер.
Контроллер может считывать температуру воды с помощью датчика температуры и регулировать уровень мощности горелки от 0 до 100 процентов. Программное обеспечение в контроллере отвечает за регулировку уровня мощности горелки, чтобы температура воды в кастрюле как можно быстрее достигла желаемого значения (заданного значения), а затем поддерживала эту температуру в течение неопределенного времени. Для решения этой проблемы в контроллере можно использовать алгоритм ПИД.
Пропорциональный
Первый компонент алгоритма ПИД является самым простым для понимания и наиболее важным для работы контроллера. P означает пропорциональный . Это означает, что управляющая переменная должна быть скорректирована пропорционально количеству ошибки в системе. Алгоритм PID, который использует только компонент P, может быть выражен как:
вывод = ошибка * Kp
Я просто использовал пару терминов, которые могут показаться незнакомыми, поэтому позвольте мне объяснить.
Управляющая переменная: Управляющая переменная – это выходной сигнал контроллера, который мы можем настроить. В нашем примере регулируемой переменной является уровень мощности горелки.
Переменная процесса: Переменная процесса — это измеренное значение в системе, которой вы пытаетесь управлять. Переменная процесса используется в качестве обратной связи для контроллера, чтобы он мог решить, как отрегулировать переменную управления. В данном случае параметром процесса является температура воды.
Ошибка: Ошибка — это разница между переменной процесса и заданным значением. В нашем примере заданной точкой будет некоторая температура, до которой мы пытаемся довести воду. Ошибка в любой момент времени будет представлять собой разницу между текущей температурой и заданной температурой.
Компонент алгоритма P работает, регулируя выходной сигнал пропорционально ошибке. Допустим, уставка для регулятора температуры составляет 100 градусов. Если измеренная температура в данный момент составляет 60 градусов, то ошибка равна 40. Выход контроллера будет установлен на 40 * Kp , где Kp — пропорциональный коэффициент . Kp — это постоянное неотрицательное значение, которое определяется в процессе настройки контроллера (подробнее о настройке мы поговорим позже). Теперь допустим, что значение Kp равно 10 (взято из воздуха). Тогда выход системы будет (100 – 60) * 10 = 400.
Вы можете подумать: «400?! Это намного больше, чем диапазон горелки от 0 до 100%. Как мы можем установить его на 400?» И вы совершенно правы. это называется насыщение, и это часто происходит в ПИД-контроллерах. Когда происходит насыщение, управляющей переменной просто нужно установить выходное значение на максимальное значение, 100%. Когда измеренная температура приближается к целевому значению, ошибка становится меньше, и в конечном итоге система становится ненасыщенной. В нашем примере система станет ненасыщенной при 90 градусах. При 95 градусах ошибка будет равна 5, а выход системы будет 5 * 10 = 50%.
Проблема с использованием только пропорционального контроллера заключается в том, что это обычно приводит к установившейся ошибке. По мере того, как ошибка становится все меньше и меньше, результат умножения ошибки на коэффициент пропорциональности в конечном итоге становится слишком малым, чтобы оказывать какое-либо влияние на переменную процесса. Это связано с тем, что реальные системы никогда не бывают эффективными на 100%. И вот где I компонент алгоритма вступает в игру.
Интеграл
I расшифровывается как интеграл, — математический термин, означающий накопление чего-либо с течением времени*. В случае PID компонент I накапливает ошибку, возникающую с течением времени. Эта накопленная ошибка затем умножается на Ки, интегральный коэффициент и добавляется к выходным данным. Алгоритм контроллера, который использует только компоненты P и I, может быть выражен следующим псевдокодом:
накопление_ошибки += ошибка * дельта_время выход = (ошибка * Kp) + (накопление_ошибки * Ki)
Интегральный компонент алгоритма управления может удалить любую установившуюся ошибку в системе, поскольку он накапливает эту ошибку с течением времени и компенсирует ее, а не просто смотрит на мгновенный снимок ошибки в один момент времени.
Производная
D обозначает производную и, вероятно, является самой сложной. Производный компонент реже используется в контроллерах, но по-прежнему важен в некоторых приложениях. В случае кастрюли с водой, стоящей на горелке без помех, 9Компонент 0022 D вообще не нужен. Однако, если мы усложним ситуацию, время от времени бросая горсти льда в кастрюлю, это может оказаться полезным.
Производный компонент отвечает за компенсацию внезапных изменений ошибки. Если бы мы бросили лед в кастрюлю с водой, температура внезапно упала бы, ошибка внезапно увеличилась бы, а производный компонент алгоритма сработал и увеличил бы мощность горелки.
Производная — это математический термин, означающий «наклон кривой». В этом случае кривая представляет собой график зависимости ошибки от времени. Если ошибка установившаяся, то результат Компонент D равен нулю. Полный алгоритм PID может быть выражен следующим псевдокодом:
accumulation_of_error += error * delta_time производная_ошибки = (ошибка - последняя_ошибка) / дельта_время последняя_ошибка = ошибка вывод = (ошибка * Kp) + (накопление_ошибки * Ki) + (производная_ошибки * Kd)
Компонент производной в основном полезен, когда система уже находится в устойчивом состоянии или близко к нему. В установившемся режиме компоненты P и I очень малы, потому что ошибка очень мала. Если ошибка внезапно увеличивается, требуется некоторое время, прежде чем компоненты P и I снова начнут работать. Однако компонент D реагирует на внезапное изменение ошибки и немедленно начинает ее компенсацию. По этой причине часто говорят, что компонент D отвечает за компенсацию будущих ошибок; он видит изменение ошибки и пытается предотвратить ее дальнейшее изменение.
Поскольку составляющая производной реагирует на изменения в ошибке, это может быть проблематично в ситуациях, когда измеряемая переменная процесса является зашумленной. Этот шум может привести к нестабильности выходного сигнала, когда в алгоритме управления используется компонент D .
Настройка ПИД-регулятора
Настройка ПИД-регулятора — это процесс определения идеальных значений для Kp , Ki, и Kd для достижения желаемого отклика . В некоторых системах может потребоваться, чтобы управляющая переменная достигла заданного значения как можно быстрее, даже если это означает превышение заданного значения.