Klipper Pressure Advance(压力提前)调优完整指南:从原理到实战校准
2026/9/15 19:50:53 网站建设 项目流程

Klipper Pressure Advance(压力提前)调优完整指南:从原理到实战校准

【免费下载链接】klipperKlipper is a 3d-printer firmware项目地址: https://gitcode.com/GitHub_Trending/kl/klipper

Pressure advance(压力提前)是 Klipper 固件中用于消除挤出头"渗料(ooze)"与转角"鼓包(blobbing)"问题的核心特性。本文以 docs/Pressure_Advance.md 为骨架,结合 Klipper 源码(klippy/kinematics/extruder.pyklippy/chelper/kin_extruder.cklippy/extras/tuning_tower.py)与官方配置/命令参考,完整讲解其数学模型、配置参数、基于"调优塔(tuning tower)"打印件的实战校准流程,以及必须避开的常见坑。读完本文,你将能够针对自己的打印机、喷嘴与耗材组合,独立完成 pressure advance 的测量、计算与固化配置。

一、Pressure Advance 是什么:解决渗料与鼓包

在 3D 打印中,喷嘴内部的可压缩熔融塑料会产生"压力"。当挤出头突然加速挤出时,喷嘴内压力需要时间建立,导致挤出起始段出料不足;当挤出结束时,残余压力又会让多余耗材继续流出,形成"渗料(ooze)"。在转角处,这种残余压力则表现为"鼓包(blobbing)"。

Pressure advance 的解决思路是:不把"推入多少耗材 == 立即挤出多少耗材"当作事实,而是用基于压力的模型来描述挤出头行为。根据 docs/Kinematics.md 中的说明,该模型借鉴了两个物理定律:

  • 胡克定律(Hooke's law):耗材被推入挤出头时,内部压力随之升高;
  • 泊肃叶定律(Poiseuille's law):维持挤出的压力由流经喷嘴孔口的流量主导。

二者综合后,耗材、压力与流量之间的关系可以用一个线性系数来建模,即:

pa_position = nominal_position + pressure_advance_coefficient * nominal_velocity

也就是说,Klipper 会在挤出头加速阶段额外多推入一段耗材(提前建立压力),并在减速阶段等量回抽(抵消残余压力)。从 klippy/chelper/kin_extruder.c 源码注释可以看到这一模型的精确表述:

extruder_position(t) = nominal_position(t) # 无压力提前 pa_position(t) = nominal_position(t) + pressure_advance * nominal_velocity(t)

正是这个"加速多推、减速回抽"的动作,让喷嘴口在挤出开始时立即有足量材料、在挤出结束时立即停止出料——从而同时改善 ooze 与转角鼓包。

平滑处理(Smoothing):避免电机速度突变

基础的 pressure advance 公式会让挤出电机产生突变的加减速,因此 Klipper 引入了"平滑"机制:对pa_positionpressure_advance_smooth_time(默认 40ms)时间窗内做加权平均。其数学形式(见 docs/Kinematics.md 与kin_extruder.c中的extruder_integrate/pa_range_integrate实现)为:

smooth_pa_position(t) = ( definite_integral(pa_position(x) * (smooth_time/2 - abs(t - x)) * dx, from=t-smooth_time/2, to=t+smooth_time/2) / (smooth_time/2)^2 )

平滑计算可以跨越多个 G-Code move,其实际效果是:挤出电机会在名义挤出起点之前就开始运动,并在名义挤出结束之后继续运动一小段时间——这正是kin_extruder.cextruder_calc_position通过gen_steps_pre_active/gen_steps_post_active所处理的步进预生成窗口。

二、核心配置参数:pressure_advance 与 pressure_advance_smooth_time

Pressure advance 在配置文件中的[extruder]段下设置,对应源码为 klippy/kinematics/extruder.py 中ExtruderStepper的配置解析:

self.config_pa = config.getfloat('pressure_advance', 0., minval=0.) self.config_smooth_time = config.getfloat( 'pressure_advance_smooth_time', 0.040, above=0., maxval=.200)

结合 docs/Config_Reference.md 的官方说明,两个参数定义如下:

参数默认值取值范围含义
pressure_advance0.0>= 0加速期间推入挤出头的原始耗材长度(单位:mm 耗材 / (mm/s) 挤出速度)。减速时回抽等量耗材。设为 0 表示关闭该功能
pressure_advance_smooth_time0.040> 0,最大0.200(200ms)计算压力提前平均挤出速度所使用的时间窗(秒)。值越大,挤出运动越平滑;仅在pressure_advance非零时生效

配置示例(写入[extruder]段):

[extruder] pressure_advance: 0.258 pressure_advance_smooth_time: 0.040

需要注意:pressure_advance_smooth_time上限为 200ms,超出会直接报配置错误;pressure_advance取 0 时平滑时间自动失效(源码_set_pressure_advanceif not pressure_advance: new_smooth_time = 0.)。

三、调优前的准备工作(顺序很重要)

调优测试需要打印机已正确配置并可正常运行,因为整个流程依赖一次真实的打印与人工测量。动手前请务必按顺序完成以下前提:

  1. 校准挤出机 rotation_distance:挤出量不准会直接污染 pressure advance 测量结果。参见 docs/Rotation_Distance.md 中 extruder rotation_distance 的校准步骤。
  2. 确定合适的喷嘴温度:打印温度会影响熔融塑料粘度与压力特性,应在调 pressure advance 前先确定。
  3. 通读全文再开始:测试涉及打印并人工检查测试件,先完整理解流程,避免中途操作失误。

切片参数要求

使用切片器为测试件生成 G-Code。测试件使用仓库自带的 docs/prints/square_tower.stl(大型空心方形塔),切片时要求:

  • 高打印速度(例如 100mm/s);
  • 零填充(0% infill);
  • 较粗的层高(约为喷嘴直径的 75%)——这两点共同保证测试时拥有较高的耗材流量;
  • 关闭切片器中的"动态加速度控制(dynamic acceleration control)"与"scarf joint"接缝选项;
  • 其余参数保持默认即可(如 2~3 圈外壁、正常回抽量)。若希望进一步放大转角效应,可把外壁速度设为与其余部分相同,但这并非强制要求。

四、Pressure Advance 调优实战流程

第 1 步:降低转角速度与加速度

打印开始前,在终端/主机发送以下命令,让喷头以更慢的速度通过转角,从而放大挤出压力的影响:

SET_VELOCITY_LIMIT SQUARE_CORNER_VELOCITY=1 ACCEL=500

第 2 步:启动调优塔(Tuning Tower)

直驱(direct drive)挤出机使用:

TUNING_TOWER COMMAND=SET_PRESSURE_ADVANCE PARAMETER=ADVANCE START=0 FACTOR=.005

长鲍登(bowden)挤出机使用:

TUNING_TOWER COMMAND=SET_PRESSURE_ADVANCE PARAMETER=ADVANCE START=0 FACTOR=.020

这条命令会让 Klipper 在每一层都改写pressure_advance的值:层高越高,pressure advance 越大。打印完成后,测试件外观如下(层高越低处对应的 pressure advance 值越小):

理想值以下的层会在转角出现鼓包;理想值以上的层则会出现圆角、以及转角前段的挤出不足。

第 3 步:打印与观察

开始打印测试件。如果观察到转角已经明显打不好(说明已进入高于理想值的层段),可以提前取消打印,避免浪费时间打印已知无用的层。

第 4 步:测量与计算

打印完成后,用数显卡尺找到转角质量最佳处对应的打印件高度:

当拿不准时,优先选择更低的高度(即更保守的 pressure advance 值)。随后代入公式计算:

pressure_advance = <start> + <measured_height> * <factor>

示例:0 + 12.90 * .020 = .258

若默认的 START/FACTOR 难以分辨最优值,可以自定义这两个参数,但每次测试打印开始时都必须重新发出 TUNING_TOWER 命令(测试状态不会在打印间自动延续)。

第 5 步:写入配置并重启

将计算值写入[extruder]段:

[extruder] pressure_advance: 0.258

随后发送RESTART命令。RESTART 会清除调优测试状态,并把加速度与转角速度恢复为正常配置值。

典型值参考

常见 pressure advance 值在0.050 ~ 1.000之间(高值端通常只出现在鲍登挤出机上)。如果 pressure advance 调到 1.000 仍无明显改善,说明该组合下 pressure advance 不太可能提升打印质量——此时应回到默认配置(pressure_advance: 0)将其禁用。

五、命令机制深挖:TUNING_TOWER 与 SET_PRESSURE_ADVANCE

TUNING_TOWER 的完整语法

根据 docs/G-Codes.md 与 klippy/extras/tuning_tower.py 的实现,TUNING_TOWER的完整语法为:

TUNING_TOWER COMMAND=<command> PARAMETER=<name> START=<value> [SKIP=<value>] [FACTOR=<value> [BAND=<value>]] | [STEP_DELTA=<value> STEP_HEIGHT=<value>]

工具会在打印过程中按 Z 高度变化,持续向COMMAND注入不同参数值。三种取值组合及其计算公式如下:

  • FACTOR(连续变化)value = start + factor * z_height。适合本文这种"用尺或卡尺测量最优 Z 高度再代入公式"的场景;
  • FACTOR+BAND(分段变化)value = start + factor * ((floor(z_height / band) + .5) * band),每BAND毫米 Z 高度调整一次,平均变化率为factor/mm;
  • STEP_DELTA+STEP_HEIGHT(阶梯变化)value = start + step_delta * floor(z_height / step_height),适合温度塔那种"按条带读取标签"的模型;
  • SKIP=<value>:Z 高度低于该值时保持START不变,公式中的z_height实际为max(z - skip, 0)

从源码看,TuningTower通过gcode_move.set_move_transform(self, force=True)将自己注册为移动变换器:每当检测到"新 Z 高度的挤出移动"(move方法中newpos[3] > self.last_position[3] and newpos[2] != self.last_z等条件),就用calc_value()计算新值并执行注入命令;若检测到 Z 明显下降(z < self.last_z - CANCEL_Z_DELTACANCEL_Z_DELTA=2.0),则判定为"新一轮打印开始",自动结束测试模式。

SET_PRESSURE_ADVANCE 的完整语法

TUNING_TOWER注入的目标命令SET_PRESSURE_ADVANCE(见 docs/G-Codes.md)完整语法为:

SET_PRESSURE_ADVANCE [EXTRUDER=<config_name>] [ADVANCE=<pressure_advance>] [SMOOTH_TIME=<pressure_advance_smooth_time>]
  • 不指定EXTRUDER时,默认作用于当前激活喷头的挤出步进电机;
  • ADVANCE不指定时保持当前值,指定时不得为负;
  • SMOOTH_TIME范围0 ~ 0.200(秒)。

在 klippy/kinematics/extruder.py 的_set_pressure_advance中可以看到它的运行时实现:当SMOOTH_TIME未变化时,通过toolhead.register_lookahead_callback(...)前瞻队列的打印时间点上切换压力提前参数(extruder_set_pressure_advance),无需中断步进生成;仅当平滑时间改变时,才需要toolhead.flush_step_generation()做完整步进生成冲刷。这也是SET_PRESSURE_ADVANCE可以在打印中途(甚至调优塔打印中)被反复调用的底层原因。

六、重要注意事项(实战避坑)

  1. 参数依赖挤出头、喷嘴与耗材三者组合:不同厂家、甚至不同色素的耗材,所需 pressure advance 值可能差异显著。因此应在每台打印机、每卷耗材上分别校准,不可通用。

  2. 打印温度与挤出速率会影响 pressure advance:务必先完成挤出机 rotation_distance 与喷嘴温度的校准,再进行本文的调优流程。

  3. 测试打印的流量要求:测试件设计为高挤出流量 + 常规切片设置的组合。高流量通过高速度(如 100mm/s)+ 粗层高(约喷嘴直径 75%)实现;其他切片设置保持接近默认即可。

  4. 不同转角可能表现不一致:切片器常常把换层点安排在某一个转角,导致该转角与其余三个明显不同——遇到这种情况应忽略该转角,用其余三个转角调优。剩余转角之间也可能略有差异(源于机架在不同方向上对转角的细微反应差异),应选择一个对全部剩余转角都表现良好的值;拿不准时优先取更低的值

  5. 高 pressure advance 可能导致挤出机丢步:当值超过约 0.200 时,回到正常加速度后挤出机可能在加速推料时扭矩不足而打滑。原因在于 pressure advance 在加速期额外推入耗材、减速期回抽,值越大所需的挤出电机瞬时运动量越大。若发生丢步,要么降低加速度,要么禁用 pressure advance。

  6. 调优完成后切片器仍可保留小回抽:即使 Klipper 侧已调好 pressure advance,在切片器中配置一个较小的回抽值(如 0.75mm)并开启"wipe on retract(回抽擦拭)"选项仍有价值——它们有助于抵消由耗材粘性造成的"拉丝"(塑料粘性导致耗材被从喷嘴带出)。建议关闭切片器的"z-lift on retract(回抽抬Z)"选项。

  7. 压力提前不改变运动轨迹与打印时长:开启 pressure advance 的打印与关闭时耗时完全相同;打印期间挤出耗材总量也不变。它只是在加减速阶段附加了额外的挤出电机运动,并且没有任何配置项限制这个附加运动量——过大的 pressure advance 会导致加减速期间挤出电机剧烈运动,这也是需要合理取值的重要原因。

七、总结

Pressure advance 调优的本质,是用一次受控的"压力扫描打印"(调优塔)找到与当前挤出机-喷嘴-耗材组合匹配的线性压力系数。整个闭环为:降低转角速度放大效应 → TUNING_TOWER 逐层注入递增参数 → 数显卡尺定位最优层高 → 代入公式pressure_advance = start + measured_height * factor→ 写入[extruder]并 RESTART。配合对pa_position模型与平滑机制的源码级理解,你不仅能在实践中快速校准,也能在遇到极端值时准确判断问题的根源。

相关深入阅读:docs/Kinematics.md(压力模型与平滑推导)、docs/G-Codes.md(SET_PRESSURE_ADVANCETUNING_TOWER完整语法)、docs/Config_Reference.md([extruder]全部参数)、klippy/chelper/kin_extruder.c(压力提前步进生成的 C 实现)、klippy/extras/tuning_tower.py(调优塔实现)。

【免费下载链接】klipperKlipper is a 3d-printer firmware项目地址: https://gitcode.com/GitHub_Trending/kl/klipper

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询