挤出加速度与流量上限: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 值都必须在自己机器上标定。
三条边界:
- PA 在打印动作里生效,所以它受
[printer] max_accel约束。 PA 的本质是在速度变化前后给 E 轴加一段超前/滞后补偿,这段补偿本身要被执行器"跑得动"。打印中的 E 轴跟 XY 走同一个加速度预算,max_accel越低,PA 能兑现的补偿越少。把max_accel压到很低时,PA 的效果会一起被压掉,两者不能独立调。 - PA 补偿的是"压力建立延迟",不是"熔化不足"。 流量已经超过熔化上限时,加大 PA 只会让缺料段更缺、过料段更堵,并加速磨料/堵料。判据很清楚:如果降速后表面质量立刻正常,问题是流量上限,不是 PA 没调好。
- 螺杆/颗粒挤出里 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
四条要点:
- 顺序:先校挤出机,再校辅助段。 挤出机是精度关键段;辅助段受挤出机影响大,放最后校能吸收最新工况。
- 物理隔热优先。 两段共铝块或靠近安装时加隔热垫(PEEK / 玻纤),PID 会稳定很多 —— 软件补偿不如少耦合。
- 耦合太强时辅助段换
control: watermark(滞回开关 ±5 ℃),开关扰动不会喂进挤出机 PID 的微分项。 - 必须在打印结束、机器空闲时校准。 全功率加热循环 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 校准消的是热耦合/参数失配,两者叠加效果最好;更高温场景仍需把传感线双绞屏蔽 + 单端接地才能彻底断根。
相关阅读
- 螺杆转速与体积流量换算 —— 这些 mm³/s 怎么换回 rpm
- FGF 颗粒挤出机厂商与方案对标 —— 各家流量口径的出处
- Klipper 挤出机配置要点 —— 参数语义速查
- 熔化区长度与流量天花板 —— 为什么加长有拐点