跳转至

挤出加速度与流量上限:Klipper 侧怎么定

结论:[extruder] 段里没有 max_accel —— 打印中的挤出加速度由 [printer] max_accel 决定,max_extrude_only_* 只作用于回抽与独立挤出(官方原文:"These settings do not have any impact on normal printing moves.")。 不显式写这两个参数时 Klipper 会自动推导,而大喷嘴会把自动值放大到失去保护意义:1.5 mm 喷嘴 + 2.85 mm 料算出 423 mm/s,等于没有上限。 流动上限的真正依据是熔化能力(14 / 20 / 22 mm³/s 台架口径),不是 Klipper 参数;多段加热热端的等待逻辑要重写 M109,不能靠原版等"稳定"。

一、先分清两类动作

Klipper 的挤出相关限制分属两个完全不同的动作集合,混在一起调是无效的:

动作 谁在控制加速度 相关参数
正常打印移动 [printer] max_accel(Klipper 按 XY 运动反推 E 的速度曲线,让压力跟得上速度) 切片器的速度/流量上限、温度、熔化段长度
回抽 / 单独挤出(MOVE_E、装料、清洗、prime) [extruder] 自己的两组参数 max_extrude_only_velocity、max_extrude_only_accel、max_extrude_cross_section

所以"挤出机加速度设多少"这个问题的答案是:看 [printer] max_accel。 在 [extruder] 段里加一行 max_accel 不会生效 —— 那一行根本不存在,官方文档也没有它。想让打印中挤出更保守,改的是 [printer] max_accel 或切片器的流量上限。

二、自动推导值是怎么来的

不显式写 max_extrude_only_velocity 时,Klipper 按喷嘴直径推出一个"截面积",再拿它乘 XY 速度、除以丝料截面积得到料速:

max_extrude_cross_section 默认 = 4 × 喷嘴直径²              # 单位 mm²
max_extrude_only_velocity 自动 ≈ (4 × 喷嘴² × XY 速度) ÷ 丝料截面积

关键在于这个截面积只跟喷嘴走,跟丝料直径无关,而料速 = 体积流量 ÷ 丝料截面积。所以同一台机器换丝料,自动值会差 2.65 倍:

丝料 截面积 相对
1.75 mm 2.405 mm² —
2.85 mm 6.379 mm² 2.65 倍

对 0.4 mm 喷嘴:

情况(0.4 mm 喷嘴) 自动推导的 max_extrude_only_velocity
1.75 mm 料 ≈ 79.8 mm/s
2.85 mm 料 ≈ 30.1 mm/s

这条就是"2.85 mm PETG 的默认加速度是不是偏高"的答案:不偏高。 参数注释掉、不写的时候,自动值已经按 2.85 缩过了。真正偏高的场景是从 1.75 的配置抄过来,比如照搬 max_extrude_only_velocity: 150 —— 那是 2.85 工况下自动值的 5 倍,属于真实风险。

三、大喷嘴:自动值等于没限制

喷嘴从 0.4 换到 1.5,截面积差 14 倍(0.36 → 2.25 mm²,乘 4 后 0.64 → 9.00 mm²)。前面那套 0.4 时代的数字直接作废:

喷嘴 max_extrude_cross_section 默认(= 4 × 喷嘴²) 自动推导的 max_extrude_only_velocity(2.85 mm 料) 能当上限用吗
0.4 0.64 mm² 30.1 mm/s 可以
1.5 9.00 mm² 423 mm/s 不能 —— 等于放开

原因很直观:自动推导是拿 9 mm² 的截面乘 XY 速度(300 mm/s 级)反推料速,得出的数字比任何真实热端能熔化的流量都大一个量级。保护逻辑失效,而不是保护得太紧。

⇒ 1.5 mm 及以上喷嘴必须显式限流:max_extrude_only_velocity 按实际可达流量换算,max_extrude_only_accel 显式给值,max_extrude_cross_section 也按真实熔化能力下调。

换算方法(用体积流量反推料速,避免凭感觉填):

v_料[mm/s] = Q[mm³/s] ÷ A_丝料[mm²]
Q[mm³/s]   = A_丝料 × v_料

2.85 mm 料、截面积 6.379 mm²:

目标体积流量 对应料速 落在哪档热端
100 mm³/s 15.7 mm/s 长熔化段可稳定
157 mm³/s 24.6 mm/s 2.85 / 1.5 mm 设计工况
200 mm³/s 31.4 mm/s Dyze Typhoon 级(200 mm³/s)
500 mm³/s 78.4 mm/s 颗粒路线(Dyze Pulsar 500 mm³/s)

四、可直接用的配置片段

4.1 0.4 mm 喷嘴 / 直驱 / 常温材料

[extruder]
# 打印时的加速度不在这里控制 → 看 [printer] max_accel
max_extrude_only_velocity: 60      # 回抽 + 独立挤出的速度上限
max_extrude_only_accel: 1000       # 回抽 + 独立挤出的加速度上限
max_extrude_cross_section: 0.64    # 显式给,避免自动推导被放大

4.2 1.5 mm 喷嘴 / 2.85 mm 料(低剪切高流量工况)

[extruder]
filament_diameter: 2.850           # 必须与实际丝料一致,自动值依赖它
max_extrude_only_velocity: 25      # ≈157 mm³/s ÷ 6.379 mm²,按实测可达流量取
max_extrude_only_accel: 500        # 大流量下放缓,避免瞬时过流触发压力尖峰
max_extrude_cross_section: 2.5     # 按真实焊道截面给,不沿用 4×1.5² = 9.0

max_extrude_cross_section: 2.5 的依据:1.5 mm 喷嘴 × 1.2 mm 层高的焊道截面约 1.8 mm²,留一点余量即可;给到 9.0 mm² 等于允许 4 倍以上的瞬时过流,而热端根本熔化不了。

4.3 螺杆 / 颗粒挤出(FGF)

颗粒挤出没有"丝料截面积"这个概念,流量由螺杆转速决定,所以这组参数的语义要重新理解:

[extruder]
# 体积流量由螺杆 rpm 决定(见 screw-flow-and-rpm.md),E 轴只是传动链
max_extrude_only_velocity: 20      # 按标定后的最大安全料速给
max_extrude_only_accel: 300        # 大热容 + 高扭矩,加速度给保守值
max_extrude_cross_section: 4.0     # 按最大焊道截面(如 2×2 mm)留余量

FGF 场景下这组参数几乎不构成约束 —— 因为焊道截面(2 mm 级)远小于默认的 9.0 mm²,真正的限流点是螺杆转速与加热功率,不是 E 轴参数。把 FGF 的流量安全寄托在 Klipper 参数上是错的,要落在转速上限与温度监控上。

五、流量上限该按什么定

Klipper 参数只是"闸门",闸门开多大取决于热端能吃多少。台架实测(非宣传稿)给出的量级:

方案 最大体积流量 口径
标准 V6(基准) 14 mm³/s CNC Kitchen 实测
Volcano / 加长熔化段 20 mm³/s CNC Kitchen 实测
CHT 三孔分流 22 mm³/s(官方称 ≥ +30%,喷嘴须 ≥0.6 mm 才有意义) 第三方评测 + 厂商白皮书
BIQU Panda Juicer 52 mm³/s(标称 +70%) 厂商标称
Bambu Lab H2D 标准热端 40 / 选配高流量 65 mm³/s 厂商口径(250 mm 圆形单壁件 / ABS / 280 ℃)
E3D ObXiDian 500 标称最多 +70%,耐温 500 ℃ 厂商口径(Formnext 2025-11)
Dyze Typhoon(2.85 mm) 200 mm³/s(0.9 kg/h) 厂商口径,与 2.85 mm 方案最接近的商用参照
Dyze Pulsar(颗粒) 500 mm³/s(2.5 kg/h) 厂商口径
SEAM(螺杆主动塑化) 10 kg/h,熔体压力 350 bar 学术/工业

把流量换成"打印速度"才有操作意义。以 1.5 mm 喷嘴、0.6 mm 层高(A = 0.9 mm²)为例:

热端能力 可达速度
100 mm³/s 111 mm/s
157 mm³/s 174 mm/s
200 mm³/s 222 mm/s
500 mm³/s 556 mm/s

这张表解释了为什么"加速度调小"解决不了欠料:流量上限一旦卡在 157 mm³/s,任何速度超过 174 mm/s 的移动都在欠料,加速度调多小都没用 —— 只能降速、升温或换热端。

两个有文献支撑的提流量杠杆:加长熔化段(延长稳定挤出区间)与提高熔化温度。但 X 光 CT 实证(2023)显示高速下熔体只在外环、中心固体芯与喷嘴壁之间存在气隙,且加热器温度的影响几乎测不到 ⇒ 单靠"加长 + 加温"有上限,继续突破要靠分流(从内部加热)或主动塑化(螺杆)。Bondtech 白皮书的工程做法也印证这一点:接近极限流量时需把喷嘴温度抬到厂商推荐值之上,补偿冷料进入加热块带来的额外热负荷。

六、pressure advance 的边界

先说明数据边界:源材料里没有 pressure advance 的实测数据,下面只讲机制边界,不给推荐数值 —— 任何具体的 PA 值都必须在自己机器上标定。

三条边界:

  1. PA 在打印动作里生效,所以它受 [printer] max_accel 约束。 PA 的本质是在速度变化前后给 E 轴加一段超前/滞后补偿,这段补偿本身要被执行器"跑得动"。打印中的 E 轴跟 XY 走同一个加速度预算,max_accel 越低,PA 能兑现的补偿越少。把 max_accel 压到很低时,PA 的效果会一起被压掉,两者不能独立调。
  2. PA 补偿的是"压力建立延迟",不是"熔化不足"。 流量已经超过熔化上限时,加大 PA 只会让缺料段更缺、过料段更堵,并加速磨料/堵料。判据很清楚:如果降速后表面质量立刻正常,问题是流量上限,不是 PA 没调好。
  3. 螺杆/颗粒挤出里 PA 不适用。 FGF 的流量由螺杆转速决定,E 轴只是传动链,压力补偿的物理对象不存在。它的等价物是转速-速度前馈:实测挤出量与螺杆转速呈线性相关,用机器人/机床的速度信号做前馈即可显著减少溢料与欠料、改善壁厚一致性(Virtual and Physical Prototyping, 2025 的机器人 SEAM 工作)。这是 FGF 该抄的那一段,不是抄 PA。

七、多段加热热端:重写 M104 / M109

大热容量、多段加热的热端(颗粒挤出机是典型)用原版 M109 会很慢:原版要等温度稳定(波动落在范围内并持续一段时间),而大热容结构本身波动大,稳定阶段拖得很久。

重写思路三条:

要点 做法
不等稳定 M104(只设温)+ TEMPERATURE_WAIT(到位就走)
容差 ±5 ℃(MINIMUM={S-5} MAXIMUM={S+5}),更激进可改 ±3
辅助段跟随 heater_section2 设为主挤出机 −5 ℃
降温 S <= 0 时全部清零,不等待
参数透传 用 for 循环遍历 params,不再手动拆 T

前置:M104 也必须 rename,否则下面的 M104.1 不存在。

[gcode_macro _HANDLE_TEMP_SYNC]
variable_last_temp: 0
gcode:

[gcode_macro M104]
rename_existing: M104.1
gcode:
    {% set S = params.S|float %}
    {% if S <= 0 %}
      SET_HEATER_TEMPERATURE HEATER=extruder TARGET=0
      SET_HEATER_TEMPERATURE HEATER=heater_section2 TARGET=0
    {% else %}
      SET_HEATER_TEMPERATURE HEATER=heater_section2 TARGET={S - 5}
      M104.1 {% for p in params %}{'%s%s' % (p, params[p])}{% endfor %}
    {% endif %}
    SET_GCODE_VARIABLE MACRO=_HANDLE_TEMP_SYNC VARIABLE=last_temp VALUE={S}

[gcode_macro M109]
rename_existing: M109.1
gcode:
    {% set S = params.S|float %}
    {% if S <= 0 %}
      SET_HEATER_TEMPERATURE HEATER=extruder TARGET=0
      SET_HEATER_TEMPERATURE HEATER=heater_section2 TARGET=0
      SET_GCODE_VARIABLE MACRO=_HANDLE_TEMP_SYNC VARIABLE=last_temp VALUE={S}
    {% else %}
      SET_HEATER_TEMPERATURE HEATER=heater_section2 TARGET={S - 5}
      M104.1 {% for p in params %}{'%s%s' % (p, params[p])}{% endfor %}
      TEMPERATURE_WAIT SENSOR=extruder MINIMUM={S - 5} MAXIMUM={S + 5}
      SET_GCODE_VARIABLE MACRO=_HANDLE_TEMP_SYNC VARIABLE=last_temp VALUE={S}
    {% endif %}

为什么辅助段取 −5 ℃ 而不是同温:两段共铝块或紧邻安装时,主段的热会往辅段传,辅段同温设定会持续把主段顶过冲;低 5 ℃ 相当于提前预判这段热耦合。

两个实现注意点:

  • params.S 缺失时 |float 会抛异常。若切片器可能发不带 S 的 M104/M109,需要加 {% if 'S' in params %} 保护,否则宏直接报错停机。
  • 辅助加热器名带中文或空格时(如 heater_generic 加热段二)必须加引号:HEATER="heater_generic 加热段二"。控制台支持 UTF-8 命令。

八、两段加热的 PID 解耦校准

Klipper 没有多段 MIMO 解耦控制,每个加热器是独立 PID。软件层面最实际的"解耦"策略是:校准时让另一段保持在工作温度,这样校出的 PID 已经把另一段的稳态热耦合当成固定扰动吸收掉了。

; 第 1 步:校准挤出机(保持加热段二在工作温度)
M104 S170
M141 S165
PID_CALIBRATE HEATER=extruder TARGET=180
SAVE_CONFIG

; 第 2 步:校准加热段二(保持挤出机在工作温度)
M104 S170
M141 S165
PID_CALIBRATE HEATER="heater_generic 加热段二" TARGET=175
SAVE_CONFIG

四条要点:

  1. 顺序:先校挤出机,再校辅助段。 挤出机是精度关键段;辅助段受挤出机影响大,放最后校能吸收最新工况。
  2. 物理隔热优先。 两段共铝块或靠近安装时加隔热垫(PEEK / 玻纤),PID 会稳定很多 —— 软件补偿不如少耦合。
  3. 耦合太强时辅助段换 control: watermark(滞回开关 ±5 ℃),开关扰动不会喂进挤出机 PID 的微分项。
  4. 必须在打印结束、机器空闲时校准。 全功率加热循环 3–5 分钟/段,中断则参数不写入(报 pid_calibrate interrupted)。SAVE_CONFIG 会把 PID 参数追加到 printer.cfg 末尾。

九、多加热棒 PWM 错相:一行配置消 EMI

多段加热热端的两根加热棒同频 PWM 大电流通断,会通过共地/电源线耦合进温度传感线(PT1000 尤其敏感)→ 读数毛刺 → PID 误动作 → 高温振荡。典型症状:温度周期性振荡,且大量 >1.5 ℃ 的跳变毛刺。

根因:默认 pwm_cycle_time 都是 0.1 s,所有加热棒同相导通,峰值电流叠加,耦合最强。

修复:错开各加热器的 pwm_cycle_time。

[extruder]
pwm_cycle_time: 0.1

[heater_generic 加热段二]
pwm_cycle_time: 0.15      # 0.1 → 0.15,错开 50% 周期

一台两段加热设备的实测效果:

指标 修复前 修复后
辅助段温度毛刺(>1.5 ℃ 跳变) 76 次 0 次
挤出机段毛刺 5 次 0 次
偏移 +6.0 / +6.5 ℃ +0.4 / +0.35 ℃
平均偏差 1.39 / 1.82 ℃ 0.31 / 0.47 ℃

挤出机稳在 ±0.5 ℃ 内,接近单独加热的水平。

三条经验:

  • 这是零成本、立即见效的第一步,应作为多加热棒配置的默认动作;
  • 加热棒数量 >2 时按 0.1 / 0.15 / 0.2 ... 等差错开;
  • 与 PID 解耦校准不冲突也不重复:错相消的是传感线 EMI 毛刺,PID 校准消的是热耦合/参数失配,两者叠加效果最好;更高温场景仍需把传感线双绞屏蔽 + 单端接地才能彻底断根。

相关阅读