
3D打印小螃蟹涡流校准XY偏移
简介
首款原创开源的3D打印klipper涡流对刀模块, 超高的重复定位精度, 快速的对刀速度, 绝妙的对刀思路
简介:首款原创开源的3D打印klipper涡流对刀模块, 超高的重复定位精度, 快速的对刀速度, 绝妙的对刀思路开源协议
:GPL 3.0
(未经作者授权,禁止转载)描述
1.小螃蟹涡流XY偏移校准, 耗费两个月的时间原创自研成功, diy也有涡流校准XY偏移了, 目前唯一
2.使用 LDC1612 涡流传感器对 3D 打印机的工具(热端/喷嘴)进行 XY 中心位置自动校准。主要适用于多热端或多头打印机,解决不同工具头之间的 XY 偏移问题。
3.探测速度快, 使用简单, 重复精度非常高, 不换热端探测重复精度在0.005mm以下, 固定偏移精度在0.02mm以下
4.工作原理:喷嘴扫过线圈中心点时, 频率会呈现抛物线形状, 在正中心点时, 频率达到极值, 在中心点附近时, 频率波形呈现抛物线, 只需找到抛物线顶点就能确定中心位置, 只要从至少两个方向扫过中心点附近时, 那么就能确定线圈的精确中心点位置
5.该线圈目前只能测量XY的偏移校准, Z校准需要借助压力床或涡流扫床tap等使用喷嘴Z限位的probe进行Z偏移校准, 注意喷嘴扫描高度, 要在线圈顶上0.5mm左右处扫过
6.该功能为klipper插件, 复用klipper涡流驱动ldc1612.py, 需要最新klipper版本才行, 具体见我的涡流扫床 3D打印涡流调平线圈-小螃蟹扫床线圈 这个也可以直接把涡流扫床线圈翻过来使用, 进行XY偏移校准
7.注意i2c通信耗费资源, 需要高主频mcu才行, stm32f072的不行, 如果用也可以, 需要改ldc1612.py文件, 把采样速率改低, 见涡流扫床的教程, 这个模块是固定到热床上的, 需要接线到主板上
8.涡流校准XY偏移github开源地址: https://github.com/chengxg/tool_eddy_calibration
教程文档地址也在: https://demo.chengxg.top/pangxie/#/articles/eddy_calibration
换热端项目地址: https://github.com/cx330-TXY/Simple-Multi-Hotend
9.小螃蟹qq交流群: 1057494383, 换热端qq交流群: 757271588

一. 涡流对刀插件G-code 命令详解
添加传感器配置块
[tool_eddy_calibration calibrator_xy]sensor_type: ldc1612frequency: 40000000reg_drive_current: 22 # 如果使用校准驱动电流命令这个注释max_sensor_hz: 3000000 # 线圈最大频率# LDC1612 I2C 配置i2c_speed: 400000i2c_address: 42 # 地址跳线连接i2c_mcu: mcu # 改成自己的i2c_software_scl_pin: SCL # 改成自己的i2c_software_sda_pin: SDA # 改成自己的# PCB线圈位置 大概位置coil_x: 28.7 # 改成自己的coil_y: 12.6 # 改成自己的coil_z: 0.4 # 改成自己的 线圈平面的Z坐标位置coil_inner_diameter: 2.0 #线圈内径# 扫描参数scan_height: 0.4 # 扫描高度, 距离pcb线圈中心点的高度, 以coil_z为基准再次提高的高度, 喷嘴扫描高度距离线圈高度为0.5mm左右scan_speed: 4.0 # 扫描速度, 速度低了效果不一定好scan_length: 4.0 # 扫描长度, 至少要覆盖线圈内径scan_safe_z: 2.0 # 安全Z高度, 比scan_height高就行travel_speed_xy: 100.0 # XY旅行速度travel_speed_z: 10.0 # Z旅行速度save_data: True # 是否保存探测数据到csv文件
1. TEST_LDC1612 — 传感器检测命令
快速检测 LDC1612 传感器是否正常工作,收集短时间内的频率数据并输出统计信息。在焊接完成后, 检测是否能正常工作
目前传感器线圈谐振频率在2.2Mhz左右

2. TOOL_EDDY_CALIBRATE — 校准工具中心
执行完整的工具 XY 中心位置校准,这是最核心的命令。执行完成后结果存储在插件last_result变量中,
在gecode中可以这样取值, {% set res = printer["tool_eddy_calibration calibrator_xy"]['0'] %} x坐标 res.x, y坐标 res.y, z坐标 res.z
| 参数 | 必填 | 默认值 | 说明 |
| TOOL | 是 | - | 工具标识符,如 0、1 |
| DIR | 否 | 45,135 | 扫描方向角度(逗号分隔),0°=X+, 90°=Y+, 至少两个方向 |
| PRE_DIR | 否 | 默认与DIR相同 |
预扫描方向角度(首次校准时使用) 用于将手动配置里的线圈中心点(coil_x,coil_y)进行精确化 |
| REPEATS | 否 | 1 |
重复测量次数(1-10),多次取平均提升精度 一次就已经相当精确, 一般一次就够了 |
| PAIR_CANCEL | 否 | 0 |
配对消除运动滞后(0=关,1=开) 一般不用开, 因为皮带有运动滞后, 从反向扫过时中心点位置并不一致, 相差大约0.03mm |
| SCAN_HEIGHT_OFFSET | 否 | 0.0 |
Z偏移微调(+远离线圈,-靠近线圈) 对于热端高度差相差太大时, 避免因高度差太大而造成撞机 |
| CENTER_XY | 否 | - |
覆盖初始扫描中心点,格式 X,Y 不设置就是从配置里的(coil_x,coil_y)取值 一般用于不同热端的XY偏移太大导致严重偏移中心点时使用 |
命令使用示例:
; 基本校准(默认 45° 和 135° 方向)TOOL_EDDY_CALIBRATE TOOL=0
; 自动反方向扫描,配对消除运动滞后 TOOL_EDDY_CALIBRATE TOOL=0 DIR=0,90 PAIR_CANCEL=1
; 3次重复测量 + 微调扫描高度 TOOL_EDDY_CALIBRATE TOOL=1 DIR=45,135 REPEATS=3 SCAN_HEIGHT_OFFSET=0.2
; 指定预扫描方向 TOOL_EDDY_CALIBRATE TOOL=0 PRE_DIR=0,90 DIR=45,135
; 指定初始扫描中心点 TOOL_EDDY_CALIBRATE TOOL=0 CENTER_XY=33.0,11.0 DIR=0,90
命令执行流程:
1. 检查打印机是否已回零
2. 确定扫描中心:优先使用已有中心点→ 其次使用 参数CENTER_XY 覆盖 → 最后使用配置的 coil_x/coil_y
3. 若无法确定精确中心,先用 PRE_DIR 方向预扫描定位, 将手动指定的大概线圈中心点精确化, 扫描结果会缓存起来, 下次扫描直接跳过
4. 沿 DIR 指定的各方向扫描,采集频率数据
5. 检测每个方向的频率峰值位置
6. 通过 LSQ 或配对平均法重建中心坐标
7. 若 重复次数REPEATS > 1,重复步骤 4-6 并取平均
8. 最后移动到检测到的中心点正上方
打印出来的这个中心点位置可以再回填到配置中的线圈的coil_x,coil_y坐标上
3. GET_TOOL_CENTER — 查询校准结果
查询指定工具的上次校准结果。
4. SET_TOOL_Z — 设置工具 Z 坐标
目前该模块不支持Z方向校准, 设置工具的 Z 坐标值,通常来自外部probe的测量结果, 使用压力床或者涡流tap得到的Z位置

5. CLEAR_TOOL_CENTER — 清除扫描中心点位置
用于清除TOOL_EDDY_CALIBRATE命令预扫描中心点的位置, 清除了之后再执行TOOL_EDDY_CALIBRATE时会先执行预扫描获取中心点位置, 然后再精确扫描

6. LDC_CALIBRATE_DRIVE_CURRENT CHIP=calibrator_xy — 线圈驱动电流校准命令
这个命令跟klipper涡流扫床的是一样的, 具体使用看我的小螃蟹涡流扫床项目
二. 对刀插件在换热端项目中的实际使用配置
calibration-eddy.cfg 完整配置文件
#换热端项目涡流对刀配置 https://github.com/cx330-TXY/Simple-Multi-Hotend# 寻找中心点: TOOL_EDDY_CALIBRATE TOOL=0 DIR=45,135 REPEATS=1# 查询校准结果: GET_TOOL_CENTER TOOL=0# 设置工具Z坐标: SET_TOOL_Z TOOL=0 Z=-0.1# 清除扫描中心点位置: CLEAR_TOOL_CENTER TOOL=0# 线圈驱动电流校准命令: LDC_CALIBRATE_DRIVE_CURRENT CHIP=calibrator_xy
[tool_eddy_calibration calibrator_xy]sensor_type: ldc1612frequency: 40000000reg_drive_current: 22 # 如果使用校准驱动电流命令这个注释max_sensor_hz: 3000000 # 线圈最大频率# LDC1612 I2C 配置i2c_speed: 400000i2c_address: 42 # 地址跳线连接i2c_mcu: mcu # 改成自己的i2c_software_scl_pin: SCL # 改成自己的i2c_software_sda_pin: SDA # 改成自己的# PCB线圈位置 大概位置coil_x: 28.7 # 改成自己的coil_y: 12.6 # 改成自己的coil_z: 0.4 # 改成自己的 线圈平面的Z坐标位置coil_inner_diameter: 2.0 #线圈内径# 扫描参数scan_height: 0.4 # 扫描高度, 距离pcb线圈中心点的高度, 以coil_z为基准再次提高的高度, 喷嘴扫描高度距离线圈高度为0.5mm左右scan_speed: 4.0 # 扫描速度, 速度低了效果不一定好scan_length: 4.0 # 扫描长度, 至少要覆盖线圈内径scan_safe_z: 2.0 # 安全Z高度, 比scan_height高就行travel_speed_xy: 100.0 # XY旅行速度travel_speed_z: 10.0 # Z旅行速度save_data: True # 是否保存探测数据到csv文件
[gcode_macro _TOOL_CALIB_VARS]variable_safe_x: 20.0 # 改成自己的 换刀/待机的安全区域X 喷嘴戳热床位置variable_safe_y: 35.0 # 改成自己的 换刀/待机的安全区域Y 喷嘴戳热床位置variable_safe_z: 5.0 # 改成自己的 换刀/待机的安全区域Z高度variable_tool_count: 2 # 改成自己的 工具总数 (例如0, 1,共2个)gcode:# 此处无需指令,仅用于存储变量
# ---------------------------------------------------------# 校准单个工具# 调用示例: CALIBRATE_TOOL TOOL=1# ---------------------------------------------------------[gcode_macro CALIBRATE_TOOL]gcode:{% set tool = params.TOOL|default(0)|int %}{% set vars = printer["gcode_macro _TOOL_CALIB_VARS"] %}
G1 X{vars.safe_x} Y{vars.safe_y} Z{vars.safe_z} F9000T{tool}SET_GCODE_OFFSET X=0 Y=0 Z=0 MOVE=0G1 X{vars.safe_x} Y{vars.safe_y} Z{vars.safe_z} F9000M109 S150 T{tool} # 加热到150度# CLEAN_NOZZLE # 看情况自己设置磨嘴, 要不然不准# 使用能够喷嘴限位的probe得到Z偏移PROBE METHOD=tap SAMPLES=3G1 X{vars.safe_x} Y{vars.safe_y} Z{vars.safe_z} F9000DO_CALIBRATE_TOOL TOOL={tool}_DO_SAVE_CALIB_RESULT TOOL={tool}M400 # 【关键】等待动作走完G90
[gcode_macro DO_CALIBRATE_TOOL]gcode:{% set tool = params.TOOL|default(0)|int %}{% set probeZ = printer.probe.last_probe_position.z %}# 清除上次的中心点位置CLEAR_TOOL_CENTER TOOL={tool}# 设置 使用喷嘴限位的probe探测到的Z位置SET_TOOL_Z TOOL={tool} Z={probeZ}{% set tool0ProbeZ = 0.0 %}{% if '0' in printer["tool_eddy_calibration calibrator_xy"] %}{% set tool0ProbeZ = printer["tool_eddy_calibration calibrator_xy"]["0"].z %}{% endif %}# 进行XY偏移校准, 设置一个相对于tool0的z偏移, 避免喷嘴碰到线圈TOOL_EDDY_CALIBRATE TOOL={tool} DIR=0,90 PAIR_CANCEL=0 SCAN_HEIGHT_OFFSET={probeZ-tool0ProbeZ}
[gcode_macro _DO_SAVE_CALIB_RESULT]gcode:{% set tool = params.TOOL|int %}{% set res0 = printer["tool_eddy_calibration calibrator_xy"]["0"] %}{% set res = printer["tool_eddy_calibration calibrator_xy"][tool|string] %}{% if tool == 0 %}# T0 永远存 0SAVE_VARIABLE VARIABLE=t0_offset_x VALUE=0.0SAVE_VARIABLE VARIABLE=t0_offset_y VALUE=0.0SAVE_VARIABLE VARIABLE=t0_offset_z VALUE=0.0{action_respond_info("✅ T0 基准点坐标已锁定")}{% else %}# 其他工具存探测结果SAVE_VARIABLE VARIABLE=t{tool}_offset_x VALUE={(res.x-res0.x)|round(4)}SAVE_VARIABLE VARIABLE=t{tool}_offset_y VALUE={(res.y-res0.y)|round(4)}SAVE_VARIABLE VARIABLE=t{tool}_offset_z VALUE={(res.z-res0.z)|round(4)}{action_respond_info("✅ T" ~ tool ~ " 偏移量已自动保存")}{% endif %}
# ---------------------------------------------------------# 批量校准所有工具# ---------------------------------------------------------[gcode_macro CALIBRATE_ALL_TOOLS]gcode:{% set vars = printer["gcode_macro _TOOL_CALIB_VARS"] %}{action_respond_info("开始全自动工具校准流程...")}# 全部预加热到150度, 注意电源功率{% for t in range(0, vars.tool_count) %}M104 S150 T{t}{% endfor %}# 遍历所有工具 (range(0, N) 生成 0 到 N-1){% for t in range(0, vars.tool_count) %}CALIBRATE_TOOL TOOL={t}{% endfor %}# 关闭加热{% for t in range(0, vars.tool_count) %}M104 S0 T{t}{% endfor %}untool{action_respond_info("所有工具校准完毕")}
三. 扫描算法介绍
1. 扫描过程
每个方向的扫描以中心点为基准,沿角度 θ 方向做长度为 L 的直线移动:
- 起点:(center_x - L/2 · cosθ, center_y - L/2 · sinθ)
- 终点:(center_x + L/2 · cosθ, center_y + L/2 · sinθ)
扫描过程中以固定采样率(LDC1612 默认 400 sps)采集频率数据,并同步记录打印时间,用于将频率与位置对应。
2. 峰值检测
峰值检测分为三步:
- 粗定位:排除边缘 15% 的数据后,在中间区域搜索频率极值点
- 自动类型检测(auto 模式):比较中心 30% 区域与边缘 15% 区域的频率均值,确定是 峰值形(大线圈) 还是 谷底形(小线圈)
- 精定位:在极值点附近使用加权最小二乘法抛物线拟合(高斯权重),达到亚采样精度的定位
抛物线拟合公式:y = a·x² + b·x + c,极值点位于 x = -b/(2a)。权重采用高斯分布,越靠近峰值权重越大,抑制远离峰值的噪声点影响。
3. 中心重建算法
根据 PAIR_CANCEL 参数选择两种重建方法:
LSQ 法(PAIR_CANCEL=0)
直接将各方向峰值的投影通过最小二乘法求解中心坐标。适用于扫描方向不对称或方向数较少的场景。
配对平均法(PAIR_CANCEL=1)
将 θ 和 θ+180° 方向的投影取平均,消除运动系统的方向性滞后(正反向运动精度不同),再用 LSQ 求解。
例如 DIR=0,90 配合 PAIR_CANCEL=1 会自动扩展为 0,90,180,270 四个方向,形成两对正反对称扫描。
四. 探测精度及喷嘴偏心问题
涡流传感器检测到的是喷嘴质心, 如果喷嘴质心与圆孔中心有偏心, 可以在加载偏移值时再添加一个固定偏移值


目前都是以第一个喷嘴为基准计算的偏移, 如果第一个喷嘴本身就有偏心那么后续的喷嘴的误差不但与自身偏心有关还要叠加第一个喷嘴的偏心
如果更近一步消除固定误差, 那么我们可以制作一个假的喷嘴用来做基准, 这个假的喷嘴是一个圆锥型定位销, 内部是实心的不存在偏心问题
这样就可以消除基准喷嘴的偏心问题, 理论上能够实现固定偏移误差减半的效果


提供这个页面工具, 把插件保存的csv导入即可, 这个是扫过线圈时的频率波形, 可以看到中心点处频率最低

单热端重复测量定位精度很高, 重复精度基本在0.01mm以下








也可以使用我的涡流扫床反过来使用, 就是线圈直径太大, 会受加热块和固定弹片的影响, 可能会造成一个0.05mm的固定偏移
设计图
未生成预览图,请在编辑器重新保存一次BOM
暂无BOM
克隆工程知识产权声明&复刻说明
本项目为开源硬件项目,其相关的知识产权归创作者所有。创作者在本平台上传该硬件项目仅供平台用户用于学习交流及研究,不包括任何商业性使用,请勿用于商业售卖或其他盈利性的用途;如您认为本项目涉嫌侵犯了您的相关权益,请点击上方“侵权投诉”按钮,我们将按照嘉立创《侵权投诉与申诉规则》进行处理。
请在进行项目复刻时自行验证电路的可行性,并自行辨别该项目是否对您适用。您对复刻项目的任何后果负责,无论何种情况,本平台将不对您在复刻项目时,遇到的任何因开源项目电路设计问题所导致的直接、间接等损害负责。











