4、固件与控制系统概述:了解Marlin、Klipper等固件中调平相关配置、G代码指令(G29、G30)的作用

3D打印机的自动调平功能并非单纯依赖硬件传感器,其核心逻辑由固件(Firmware)中的运动控制模块与G代码解释器共同实现。固件负责解析G代码指令、管理传感器信号、执行网格测量算法,并将补偿数据应用于每一层的打印路径中。目前主流的开源固件Marlin与Klipper在调平策略上存在显著差异:Marlin采用“固件内计算+静态补偿表”的方式,而Klipper则借助上位机强大的CPU进行实时运动学解算,将补偿量直接注入到每一步的步进电机脉冲中。理解这两种固件的调平架构,是开发自定义调平算法、优化打印质量的基础。

固件调平架构对比与G代码执行链路 Marlin 固件(静态补偿表) G29/G30 解析器 探针逻辑控制 网格测量引擎 补偿表存储(EPROM) Z轴运动叠加补偿量 G代码 Klipper 固件(实时运动学解算) 上位机Python解析 运动学解算器 调平状态机 步进电机脉冲流 实时补偿脉冲输出 调平关键差异对比 对比维度 Marlin Klipper 补偿时机 层开始前静态叠加 每一步进脉冲实时修正 网格存储 EPROM/Flash 持久化 上位机内存/配置文件 多点补偿算法 线性插值(3点/网格) 双线性/样条插值 图4-1 Marlin与Klipper调平架构对比及G代码执行链路

上图展示了两种固件在调平数据流上的根本区别。Marlin将调平视为“测量-存储-叠加”的静态过程,而Klipper将调平融入实时运动学解算。下面我们将深入解析G29/G30指令的具体作用、配置参数以及实战中的调试方法。

4.1 G29与G30指令的核心原理与执行流程

G29和G30是固件中与自动调平直接相关的两个G代码指令,但它们的职责完全不同。G29用于执行完整的自动调平测量序列,它会根据配置的网格点数(如3x3、5x5或7x7)驱动打印头在热床多个位置进行探测,并生成一个补偿网格。G30则是一个单点探测指令,它只测量当前探针位置的Z高度,通常用于校准Z轴偏移量(Z_PROBE_OFFSET_FROM_EXTRUDER)或手动验证某个特定点的热床高度。

核心原理:G29指令的执行过程可以拆解为四个阶段:预检测阶段(检查探针状态、热床温度是否达到设定值)、网格扫描阶段(按预设路径移动至各测量点,执行下探-回弹-记录Z值)、数据处理阶段(将测量值转换为相对于参考点(通常是热床中心)的偏移量)、存储与激活阶段(将网格数据写入固件变量或配置文件,并启用补偿功能)。G30则相对简单,它只执行一次探测动作并返回Z值,不涉及网格生成。

在Marlin固件中,G29的典型配置参数如下:

// Marlin Configuration.h 中相关配置
#define AUTO_BED_LEVELING_BILINEAR  // 使用双线性插值
#define GRID_MAX_POINTS_X 5          // X方向网格点数
#define GRID_MAX_POINTS_Y 5          // Y方向网格点数
#define Z_PROBE_OFFSET_FROM_EXTRUDER -1.85  // 探针相对喷嘴的Z偏移
#define LEFT_PROBE_BED_POSITION 20   // 探测区域左边界
#define RIGHT_PROBE_BED_POSITION 220 // 探测区域右边界
#define FRONT_PROBE_BED_POSITION 20  // 探测区域前边界
#define BACK_PROBE_BED_POSITION 220  // 探测区域后边界

执行G29时,固件会按照“左下角起始,蛇形扫描”的顺序移动至每个网格点。在每一个测量点,固件执行以下操作:① 移动至该点XY坐标;② 以较快的速度(通常为5mm/s)下探Z轴,直到探针触发;③ 记录触发时的Z轴位置;④ 抬升Z轴至安全高度(Z_CLEARANCE_DEPLOY_PROBE);⑤ 移动至下一个点。整个过程完成后,固件会计算每个测量点相对于参考点的Z偏差,并生成一个二维补偿矩阵。

指令 功能定位 典型应用场景 执行时间
G29 自动网格测量与补偿激活 打印前执行完整调平,生成补偿网格 约30-90秒(取决于网格点数)
G30 单点Z轴探测 校准Z探针偏移量、验证热床单点高度 约2-5秒
G29 S 仅获取当前网格数据(不重新测量) 查看已存储的补偿网格值 即时

4.2 Marlin固件调平配置实战与参数调优

在Marlin固件中,调平功能的启用涉及多个配置文件的协同修改。除了上述Configuration.h中的网格参数外,还需要在Configuration_adv.h中设置探针的类型(如BLTouch、机械探针或电容传感器)、探测速度、回弹距离等。一个常见的配置陷阱是Z_PROBE_OFFSET_FROM_EXTRUDER的符号错误——该值表示探针触发时喷嘴与探针尖端的Z向距离差,如果探针比喷嘴低,该值应为负数。

操作流程如下:

  1. 物理安装与接线检查:确认探针的供电(通常为5V或12V)、信号线(SERVO或Z_MIN)连接正确,并在固件中启用对应的引脚定义。
  2. 配置探针类型:在Configuration.h中设置#define BLTOUCH或#define FIX_MOUNTED_PROBE等宏定义。
  3. 设置探测区域:根据热床实际尺寸,合理设置LEFT/RIGHT/FRONT/BACK_PROBE_BED_POSITION,确保探测点不超出热床边界。
  4. 校准Z探针偏移:使用G30指令在热床中心点进行多次探测,结合手动调平(如纸片法)确定精确的Z_PROBE_OFFSET_FROM_EXTRUDER值。
  5. 执行G29并验证:发送G29指令,观察固件返回的网格数据。通过M420 V命令查看当前补偿矩阵,确认数值在合理范围内(通常±0.3mm以内)。

风险提示:在Marlin中,如果热床温度未达到设定值(通常为60℃),G29会拒绝执行或产生不准确的测量结果。这是因为热床受热膨胀会导致表面高度变化。务必在G29前添加M190 S60(等待热床达到60℃)指令,确保测量条件与实际打印条件一致。

实战案例:某用户使用BLTouch探针,在5x5网格下发现热床中心区域补偿值正常(±0.1mm),但四个角落的补偿值达到-0.4mm。经排查,发现是热床固定弹簧松动导致热床边缘下垂。通过重新调整热床四角弹簧的预紧力,并重新执行G29,补偿值恢复到±0.15mm以内。这个案例说明,固件调平无法完全替代机械调平,网格补偿只能修正小幅度的不平整,对于超过0.5mm的机械变形,应先进行物理调整。

4.3 Klipper固件调平配置与高级特性

Klipper的调平架构与Marlin有本质不同。Klipper将调平计算放在上位机(如树莓派)中执行,通过bed_mesh配置模块实现网格测量与补偿。Klipper的调平数据不存储在固件中,而是保存在上位机的配置文件中,每次启动时自动加载。Klipper支持更高级的插值算法,如双线性插值和样条插值,并且可以在打印过程中动态调整补偿量。

Klipper的配置文件(printer.cfg)中调平相关配置如下:

# printer.cfg 中 bed_mesh 配置示例
[bed_mesh]
speed: 120              # 探测移动速度
horizontal_move_z: 5    # 探测点之间的Z抬升高度
mesh_min: 20, 20        # 网格最小坐标
mesh_max: 220, 220      # 网格最大坐标
probe_count: 5, 5       # X/Y方向网格点数
algorithm: bicubic       # 插值算法:bicubic 或 linear
fade_start: 1           # 补偿渐入起始层
fade_end: 10            # 补偿渐入结束层(10层后补偿量降为0)

[bltouch]
sensor_pin: ^PC14        # 探针信号引脚
control_pin: PA4         # 探针控制引脚
x_offset: -30            # 探针相对喷嘴的X偏移
y_offset: -5             # 探针相对喷嘴的Y偏移
z_offset: 1.85           # 探针相对喷嘴的Z偏移

Klipper的fade功能是一个亮点:它允许补偿量在打印的前几层内逐渐减小至零,避免在打印较高物体时因补偿过度导致模型底部变形。例如,设置fade_start: 1和fade_end: 10,意味着从第1层到第10层,补偿量线性递减,第10层之后不再施加补偿。这对于打印高精度模型非常有用。

经验提醒:Klipper的probe_count建议设置为奇数(如3、5、7),这样可以确保网格中心点与热床中心重合,便于参考点的对称性。同时,Klipper支持adaptive_mesh功能,可以根据模型在热床上的实际占用区域动态调整网格测量范围,大幅缩短调平时间。

Klipper的调平执行流程与Marlin类似,但G代码指令略有不同。Klipper使用BED_MESH_CALIBRATE命令替代G29,使用PROBE命令替代G30。不过,Klipper也兼容G29指令,但需要通过[gcode_macro G29]进行映射。在Klipper中,调平数据可以通过BED_MESH_OUTPUT命令查看,通过BED_MESH_CLEAR命令清除。

4.4 常见误区与调平策略复盘

在调平算法的开发与调试过程中,工程师常陷入以下误区:

  • 误区一:过度依赖网格补偿。网格补偿的修正能力有限,通常只能处理±0.5mm以内的不平整。如果热床变形超过1mm,应优先考虑更换热床或增加刚性支撑。
  • 误区二:忽略温度对探测精度的影响。探针(尤其是电容式传感器)的测量值会随温度漂移。建议在热床达到目标温度后等待2-3分钟,让热床和探针充分热稳定后再执行G29。
  • 误区三:网格点数越多越好。虽然增加网格点数可以提高补偿精度,但也会显著增加测量时间,并且可能引入噪声。对于大多数打印场景,5x5网格已经足够;对于高精度打印,7x7网格是合理上限。
  • 误区四:忽略Z轴机械回差。如果Z轴丝杆或皮带存在回差(backlash),会导致探测值不准确。建议在固件中启用Z_STEPPER_AUTO_ALIGN或机械回差补偿功能。

总结复盘:固件调平的本质是“测量-建模-补偿”的闭环控制。Marlin适合对实时性要求不高、硬件资源有限的场景,其静态补偿表简单可靠;Klipper则适合需要高速打印、高精度补偿的场景,其实时运动学解算能力更强。在实际开发中,应根据打印机结构、探针类型和打印需求选择合适的固件,并重点校准Z探针偏移量、合理设置网格参数、确保热床温度稳定。下一阶段,我们将深入探讨网格补偿算法的数学原理,包括双线性插值、最小二乘拟合以及补偿矩阵的平滑处理。