
3D打印涡流调平线圈-小螃蟹扫床线圈
简介
3d打印涡流调平, idm调平, 扫床线圈, ldc1612, 温漂, 线圈
简介:3d打印涡流调平, idm调平, 扫床线圈, ldc1612, 温漂, 线圈开源协议
:GPL 3.0
描述
6. 扫床视频介绍使用: 见B站 3D打印涡流线圈调平开源及Eddy current sensor error问题解决, 该线圈我起名为: 小螃蟹扫床线圈; 该线圈我已经量产了一批, 欢迎购买;
7.目前klipper在2026年1月份升级了涡流驱动, tap功能得到支持, 类似IDM的touch模式, 就不需要AHT20温度传感器了, 无需温度校准, 自动Zoffset, tap介绍视频见: 3D打印klipper自带涡流调平tap模式介绍
一. LDC1612芯片报错问题:
这个是用klipper自带的涡流, 不是第三方插件, 目前只能扫床, 没有tap功能, 但是可以用来做Z限位, 温漂是关键, klipper自带涡流驱动, 近期有人已经提交了pull request准备支持tap功能, 嫩不能成为正式功能还未知
1. Unable to obtain 'i2c_read_response' response
发送命令LDC_CALIBRATE_DRIVE_CURRENT chip=eddy_probe 就报这个, 说明芯片虚焊, 或者压根i2c引脚配置的不对
2. Failed calibration - incomplete sensor data
上机测试时, 发送自动校准命令PROBE_EDDY_CURRENT_CALIBRATE CHIP=eddy_probe, 发现也能正常校准, 但是最后保存时提示这个问题, 也是芯片虚焊导致的
3. Failed calibration - frequency not increasing each step
发送自动校准命令PROBE_EDDY_CURRENT_CALIBRATE CHIP=eddy_probe, 前边正常校准, 但是在最后保存配置时提示这个, 说明芯片焊接是没问题的, 是探测到的最前边几个数据有问题, 出现了距离越远频率越高的情况, 可能是热床太重导致距离喷嘴很近时发生了震动所致, 这种需要抬高喷嘴, 避免离热床太近造成震动
4. Error during homing z: Eddy current sensor error
这个要重点说明, 这个报错主要原因的是ldc1612的振幅错误报告引起的, 因为校准驱动电流是在热床上方20mm处测量得到的驱动电流, ldc1612最佳测量线圈的振幅在1.2V-1.8V之间, 这个最佳驱动电流只在当前高度, 当前温度下适用, 当高度降低到2mm左右时, 驱动电流不再适用, 会引起ldc1612的振幅错误报告, 而klipper中又启用了这个错误报告, 一旦出现振幅错误, ldc1612就报告这个错误,这就是为什么总是报告这个错误, 我们测量的是频率, 不需要振幅必须在这个最佳区间内, 因此直接改动klipper代码. 修改ldc1612的寄存器配置来禁用这个错误报告.
最佳驱动电流受温度, 线圈谐振频率, 传感器安装高度等方面的影响, 在20mm处测量的最佳驱动频率不满足这些情况, 这个错误报告很灵敏, 振幅错误报告分为振幅高错误和振幅低错误, 而驱动电流的设置只能在1-31之间设置, 可调范围有限, 你很有可能安装的高度差那么一点点, 你就永远无法得到最佳驱动电流,不是高了就是低了, 因此就出现了你无论如何调整驱动电流, 始终会报这个错误的问题, 因此必须禁用这个错误报告.
其他错误参考fly文档: https://mellow.klipper.cn/docs/DebugDoc/faq/eddy/
二. 修改klipper涡流驱动代码:
klipper官方是用必趣的eddy做的测试, 必趣的eddy参数跟我这个线圈参数不一样, 要改下一些代码配置

三. 关于首次校准涡流时的命令:
1.驱动电流校准命令 LDC_CALIBRATE_DRIVE_CURRENT CHIP=eddy_probe
这个校准驱动电流校准不要在离热床20mm处校准, 而要在喷嘴接近热床的位置校准, 高度2mm左右, 不用很准, 因为已经禁用了振幅错误报告
2.eddy频率高度校准命令 PROBE_EDDY_CURRENT_CALIBRATE CHIP=eddy_probe
①在校准之前, 先要手动调平热床, 热床不能歪的厉害;
②如果你打算使用这个涡流来做虚拟Z限位, 那么首先要加热热床到80度, 喷嘴温度在150度, 保持喷嘴清洁;
③如果你当前没有没有Z限位, 那么你要先使用这个命令来设置一个当前的Z位置, SET_KINEMATIC_POSITION Z=填写最大Z高度 , 这样就不用Z归位了
④然后执行 LDC_CALIBRATE_DRIVE_CURRENT CHIP=eddy_probe 命令, 然后klipper进入手动probe的页面, 在页面手动控制Z轴移动到喷嘴跟热床接近的地方
⑤如果用来Z限位那么用A4纸的手感必须到位, 不用来做Z限位, 随便就行了, 差个0.2mm也不要紧;
⑥设置完了之后, klipper会自动获取高度跟频率的对应关系, 最后保存配置就可以了;
四. 关于温漂:
1.在不封箱的条件下, 温漂很低, 通常在0.04mm以下, 也不一定, 不好说
z-offset=1mm, 热床温度从常温到100度, eddy线圈温度从常温到60度, 频率变化率为3Khz, 温漂造成的z偏移为0.02mm左右, 影响并不大, 可以用来Z限位
2.在封箱条件下, 温漂不可接受
z-offset=1mm, 热床温度从常温到108度, eddy线圈温度从常温到80度, 长时间频率漂移可达26Khz, 温漂造成的z偏移为0.2mm左右, 这样的温漂不可接受, 具体漂多少这个需要看机器自身的情况, 温漂主要发生在在eddy温度从65度-80度之间, 封箱下温漂应该与打印机整体结构的温漂有关, 单纯线圈的温漂不会这么大, 如果安装线圈的支架和整个工具头都温漂了, 这就难顶了, 闷的时间越长形变越大;
3. 如何对抗温漂
初始校准时就热床加热到80度, 喷嘴温度150度, 把温差范围缩小下, 在打印前, 热床加热时抬升z, 远离热床避免线圈温度过度增加, 必要时或许可以打开冷却风扇给线圈降下温;
4.做温度校准
如何操作具体看klipper文档, 就是线圈温度每隔3-4度执行下校准, 非常耗时, 因为温漂不仅仅与线圈的温度有关, 如果整个机器都形变了的话, 温度校准也不能解决温漂, 封箱难顶;

从室温温加热到热床108度时的频率漂移图, 该机器封箱, 温漂较大,频率漂移26Khz以上,误差0.2mm, 可能与我的机器打印件多有关

我另外一台机器, 同样加热到108度, 半封箱, 这个机器全温度范围温漂就小了, 频率漂移8Khz以下,温漂影响误差0.05mm左右
5.klipper目前更新了tap功能,支持喷嘴限位,自动zoffset
官方的设置教程见: https://www.klipper3d.org/Eddy_Probe.html
我翻译了以下官方的教程见: klipper_eddy_probe.html
[probe_eddy_current my_probe]
# eddy probe configuration...
# Recommended starting values for the tap
#samples: 3
#samples_tolerance: 0.025
#samples_tolerance_retries: 3
tap_threshold: 0 # 0 means tap is disabled
就是设置 tap_threshold: 0 这个参数, 默认是0, 表示禁用tap功能, 一般直接设置个100-200就行
要启用tap模式首先要先安装 scipy, 安装的慢的话可以用国内源安装
~/klippy-env/bin/pip install scipy
~/klippy-env/bin/pip install scipy -i https://pypi.tuna.tsinghua.edu.cn/simple
tap模式目前的精度在0.02mm左右
如果能把数据请求速率改为500的话, 那么精度提升, 见上边的 修改klipper代码部分
注意使用tap模式得需要磨嘴, 保证喷嘴干净
五. klipper参考配置文件:
把下面的代码添加你的配置文件中, 添加到一个单独文件中, 方便管理
# 先改klippy/extras/ldc1612.py 代码, 把 REG_ERROR_CONFIG 改成 0x1c, 把 SETTLETIME 改为 0.0002
# 驱动电流校准: LDC_CALIBRATE_DRIVE_CURRENT CHIP=eddy_probe
# 频率高度对应校准: PROBE_EDDY_CURRENT_CALIBRATE CHIP=eddy_probe
# 第一次校准时使用: PROBE_EDDY_CURRENT_CALIBRATE_AUTO
# tap模式自动Z偏移: SET_Z_FROM_PROBE METHOD=tap
[probe_eddy_current eddy_probe]
sensor_type: ldc1612
i2c_address: 42
i2c_mcu: toolhead
frequency: 40000000
i2c_speed: 400000
# i2c_bus: i2c1
i2c_software_scl_pin: toolhead:SCL1
i2c_software_sda_pin: toolhead:SDA1
# reg_drive_current: 25 #驱动电流, 直接写死不用校准, 改klippy/extras/ldc1612.py 代码, 把REG_ERROR_CONFIG 改成0x1c, SETTLETIME = 0.0002
x_offset: 0 #记得设置x偏移
y_offset: 20 #记得设置y偏移
z_offset: 2 #记得设置z偏移
speed: 5 #探测速度
samples: 3 #采样次数
sample_retract_dist: 5.0 #采样时喷嘴抬升距离
samples_tolerance: 0.05
samples_tolerance_retries: 3
tap_threshold: 200 # klipper最新更新的参数, tap模式支持, 默认是0, 表示禁用tap功能, 一般设置为100-200就行
#集成线圈的加速度计配置
[lis2dw]
i2c_address: 25
i2c_mcu: toolhead
# i2c_bus: i2c1
i2c_software_scl_pin: toolhead:SCL1
i2c_software_sda_pin: toolhead:SDA1
[resonance_tester]
accel_chip: lis2dw
accel_per_hz: 50
probe_points: 100, 100, 20
# 板载AHT20温度传感器配置, 需要升级到最新版的klipper版本才能用
# [temperature_probe eddy_probe]
# horizontal_move_z: 2
# sensor_type: AHT2X
# i2c_mcu: toolhead
# i2c_speed: 400000
# i2c_address: 56
# i2c_software_scl_pin: toolhead:SCL1
# i2c_software_sda_pin: toolhead:SDA1
# aht10_report_time: 10 # 温度报告时间间隔, 最低为5秒
[gcode_macro Z_TILT_ADJUST]
description: eddy 快速Z调平, 三点调平
rename_existing: _Z_TILT_ADJUST
gcode:
{% set PROBE_Z_OFFSET = printer.configfile.settings['probe_eddy_current eddy_probe'].z_offset|float %}
# ========== 状态保存 ==========
SAVE_GCODE_STATE NAME=STATE_Z_TILT
# ========== 环境准备 ==========
BED_MESH_CLEAR # 清除存在的网床数据
# ========== 主调平过程 ==========
# 第一次调平前先慢慢调平, 三点之差在很小范围内再扫床, 避免撞床
{% if not printer.z_tilt.applied %}
# 初始粗调
_Z_TILT_ADJUST horizontal_move_z=8 retry_tolerance=1 SAMPLES=1
{% endif %}
# 精细调平
_Z_TILT_ADJUST horizontal_move_z={PROBE_Z_OFFSET} retry_tolerance=0.0075 retries=20 METHOD=rapid_scan ADAPTIVE=1
# ========== 后处理 ==========
G90 # 绝对坐标
G0 Z5 F300 # 抬升Z轴
M117 Z_tilt Completed # 显示完成状态
# ========== 状态恢复 ==========
RESTORE_GCODE_STATE NAME=STATE_Z_TILT
M400
# Z_TILT_ADJUST跟QUAD_GANTRY_LEVEL 二选一
#[gcode_macro QUAD_GANTRY_LEVEL]
#rename_existing: _QUAD_GANTRY_LEVEL
#description: eddy 快速Z调平, 四点龙门调平
#gcode:
# {% set PROBE_Z_OFFSET = printer.configfile.settings['probe_eddy_current fly_eddy_probe'].z_offset|float %}
# # ========== 状态保存 ==========
# SAVE_GCODE_STATE NAME=STATE_QGL
# # ========== 环境准备 ==========
# BED_MESH_CLEAR # 清除存在的网床数据
# # ========== 主调平过程 ==========
# # 第一次调平前先慢慢调平, 四点之差在很小范围内再扫床, 避免撞床
# {% if not printer.quad_gantry_level.applied %}
# # 初始粗调
# _QUAD_GANTRY_LEVEL horizontal_move_z=10 retry_tolerance=1 SAMPLES=1
# {% endif %}
# # 精细调平
# _QUAD_GANTRY_LEVEL horizontal_move_z={PROBE_Z_OFFSET} retry_tolerance=0.0075 retries=20 METHOD=rapid_scan ADAPTIVE=1
# # ========== 后处理 ==========
# G90 # 绝对坐标
# G0 Z5 F300 # 抬升Z轴
# M117 QGL Completed # 显示完成状态
# # ========== 状态恢复 ==========
# RESTORE_GCODE_STATE NAME=STATE_QGL
# M400
# eddy 快速网床
[gcode_macro BED_MESH_CALIBRATE]
rename_existing: _BED_MESH_CALIBRATE
gcode:
{% set PROBE_Z_OFFSET = printer.configfile.settings['probe_eddy_current eddy_probe'].z_offset|float %}
_BED_MESH_CALIBRATE horizontal_move_z={PROBE_Z_OFFSET} METHOD=rapid_scan {rawparams}
[gcode_macro PROBE_EDDY_CURRENT_CALIBRATE_AUTO]
description: 第一次使用涡流时, 校准使用
gcode:
BED_MESH_CLEAR
G28 X Y
G90 # Abs positioning
G1 X20 Y20 F6000
{% if 'z' not in printer.toolhead.homed_axes %}
SET_KINEMATIC_POSITION Z={ printer.toolhead.axis_maximum.z-1 } # Allows the user to work it down until it touches.
{% endif %}
PROBE_EDDY_CURRENT_CALIBRATE CHIP=eddy_probe
[gcode_macro _RELOAD_Z_OFFSET_FROM_PROBE]
description: tap模式设置Z偏移
gcode:
{% set Z = printer.toolhead.position.z %}
# 官方tap模式设置后喷嘴是远离热床大约0.1mm, 需要再加上一点偏移
{% set position_endstop = 0.07 %} # 默认偏移在0.07mm左右
#在printer.cfg最下面添加上下面这个才支持偏移值保存到position_endstop
#*#
#*# [stepper_z]
#*# position_endstop = 0.07
{% set raw_config = printer.configfile.config %}
{% if 'stepper_z' in raw_config %}
# 从position_endstop里获取校准的偏移, 便于在页面上手动调节偏移值
{% set position_endstop = raw_config.stepper_z.position_endstop|trim|float %}
{% endif %}
RESPOND MSG="position_Z={'%0.2f' | format(Z)} probe_Z={'%0.2f' | format(printer.probe.last_probe_position.z)} position_endstop={'%0.2f' | format(position_endstop)}"
SET_KINEMATIC_POSITION Z={Z - printer.probe.last_probe_position.z + position_endstop}
[gcode_macro SET_Z_FROM_PROBE]
description: Z归零使用tap模式命令: SET_Z_FROM_PROBE METHOD=tap
gcode:
{% set METHOD = params.METHOD | default("automatic") %}
PROBE METHOD={METHOD}
_RELOAD_Z_OFFSET_FROM_PROBE
G0 Z5 F300
在printer.cfg最下面添加上下面这个才支持偏移值保存到position_endstop, 便于打印时实时调整观察首层效果, 打印完成后保存到position_endstop
#*#
#*# [stepper_z]
#*# position_endstop = 0


tap模式使用参考, 使用 SET_Z_FROM_PROBE METHOD=tap 命令
[gcode_macro CLEAN_NOZZLE]
description: 磨嘴
gcode:
{% set wipe_count = 8 %}
G1 Z2 F300
G1 X20 Y5 F3600
G1 Z-0.1 F300
{% for wipe in range(wipe_count) %}
{% for coordinate in [(20, 1),(1, 1)] %}
G0 X{coordinate[0]} Y{coordinate[1]} F2000
{% endfor %}
{% endfor %}
G1 Z2 F300
[gcode_macro PRINT_START] # 将 PRINT_START 设置为开始打印时的宏,自定义打印前的动作
gcode:
BED_MESH_CLEAR # 卸载网床
G21
G90
G28 # 归位所有轴
G1 Z2 F500
G1 X20 Y2 F2000
G92 E0 #重置挤出
M107 #风扇关闭
M190 S{params.BED} # 热床到指定温度
M109 150 #喷嘴温度到150
G28 Z F500
Z_TILT_ADJUST #自动调平
G1 X20 Y20 F2000
SET_Z_FROM_PROBE METHOD=tap # 涡流tap模式自动Z偏移
CLEAN_NOZZLE # 擦嘴
G1 X20 Y20 F2000
SET_Z_FROM_PROBE METHOD=tap # 涡流tap模式自动Z偏移
SET_Z_FROM_PROBE METHOD=tap # 涡流tap模式自动Z偏移 多执行一次, 提升稳定性
;判断是否有自适应网床参数
{% if params.MESH_MIN %}
; 此处接收来自Orca的自适应网床参数,需要软件中配置传参
BED_MESH_CALIBRATE PROFILE=default mesh_min={params.MESH_MIN} mesh_max={params.MESH_MAX} ALGORITHM={params.MESH_ALGO} PROBE_COUNT={params.PROBE_COUNT} ADAPTIVE=1 ADAPTIVE_MARGIN=0
{% else %}
BED_MESH_CALIBRATE PROFILE=default ADAPTIVE=1 ADAPTIVE_MARGIN=0 #每次探测网床
{% endif %}
BED_MESH_PROFILE LOAD=default #可选调用默认网床
M109 S{params.EXTRUDER} #喷嘴温度到打印温度
#划线
G92 E0
G1 Y0.5 F6000
G1 X180 F6000
G1 Z0.32 F400
G1 X20 E40 F1000
G1 Z1.0 F200
G92 E0
G1 Y2 F2000
G1 Z0.32 F400
G1 X180 E40 F1000
G1 Z1.0 F200
G92 E0
六. 我的klipper校准的一些频率-高度对应数据, 这个线圈安装高度距离喷嘴1.6mm处测量到的数据:
#*# [probe_eddy_current eddy_probe]
#*# reg_drive_current = 25
#*# calibrate =
#*# 0.020000:6471543.396,0.060000:6451423.693,0.100000:6431876.141,
#*# 0.140000:6412376.517,0.180000:6394309.813,0.220000:6376299.953,
#*# 0.260000:6358925.629,0.300000:6341717.100,0.340000:6325247.246,
#*# 0.380000:6309253.550,0.420000:6293368.751,0.460000:6278408.694,
#*# 0.500000:6263672.292,0.540000:6249405.426,0.580000:6235666.543,
#*# 0.620000:6221941.280,0.660000:6208866.686,0.700000:6195956.218,
#*# 0.740000:6183596.015,0.780000:6171344.304,0.820000:6159339.469,
#*# 0.860000:6147923.601,0.900000:6136674.237,0.940000:6125652.498,
#*# 0.980000:6114856.690,1.020000:6104334.283,1.060000:6093994.016,
#*# 1.100000:6083899.432,1.140000:6073840.189,1.180000:6064077.884,
#*# 1.220000:6054339.409,1.260000:6044783.009,1.300000:6035257.197,
#*# 1.340000:6025965.196,1.380000:6016801.149,1.420000:6007729.500,
#*# 1.460000:5998650.146,1.500000:5989840.788,1.540000:5981059.861,
#*# 1.580000:5972490.448,1.620000:5963976.109,1.660000:5955639.124,
#*# 1.700000:5947430.575,1.740000:5939329.690,1.780000:5931339.717,
#*# 1.820000:5923476.994,1.860000:5915809.727,1.900000:5908254.963,
#*# 1.940000:5900820.804,1.980000:5893541.729,2.020000:5886432.648,
#*# 2.060000:5879425.269,2.100000:5872564.453,2.140000:5865781.951,
#*# 2.180000:5859194.803,2.220000:5852688.330,2.260000:5846340.096,
#*# 2.300000:5840058.476,2.340000:5833975.256,2.380000:5827950.150,
#*# 2.420000:5822082.966,2.460000:5816314.983,2.500000:5810667.586,
#*# 2.540000:5805094.969,2.580000:5799652.046,2.620000:5794310.898,
#*# 2.660000:5789093.715,2.700000:5783954.245,2.740000:5778931.248,
#*# 2.780000:5774020.725,2.820000:5769209.898,2.860000:5764482.081,
#*# 2.900000:5759852.177,2.940000:5755316.347,2.980000:5750843.024,
#*# 3.020000:5746491.516,3.060000:5742197.800,3.100000:5738037.092,
#*# 3.140000:5733922.899,3.180000:5729929.560,3.220000:5725959.033,
#*# 3.260000:5722107.071,3.300000:5718265.444,3.340000:5714533.567,
#*# 3.380000:5710870.278,3.420000:5707304.859,3.460000:5703773.802,
#*# 3.500000:5700336.122,3.540000:5696935.016,3.580000:5693611.008,
#*# 3.620000:5690329.158,3.660000:5687134.701,3.700000:5683996.528,
#*# 3.740000:5680920.112,3.780000:5677899.200,3.820000:5674923.277,
#*# 3.860000:5671997.356,3.900000:5669122.803,3.940000:5666306.716,
#*# 3.980000:5663552.248,4.020000:5660856.271
#*#
#*# [stepper_z]
#*# position_endstop = 0.07
超高的频率变化超过400khz, 噪声仅0.1um, 这个数据在执行完频率高度对应校准后会打印出来
probe_eddy_current: noise 0.000079mm, MAD_Hz=16.228 in 2525 queries
Total frequency range: 781156.814 Hz
z_offset: 0.250 # noise 0.000110mm, MAD_Hz=47.773
z_offset: 0.530 # noise 0.000107mm, MAD_Hz=37.080
z_offset: 1.010 # noise 0.000078mm, MAD_Hz=20.212
z_offset: 2.010 # noise 0.000100mm, MAD_Hz=17.703
z_offset: 3.010 # noise 0.000103mm, MAD_Hz=10.908
七. 关于线圈设计:
线圈形状不会对使用造成影响, 无论是8边形还是圆形,还是超圆线圈, 影响微乎其微
为此我还开发一个在线工具来设计超圆线圈: https://demo.chengxg.top/eddy_coil_designer.html
TI官方的线圈设计工具: https://webench.ti.com/wb5/LDC/#/spirals
我设计的LDC1612线圈频率在线实时监控传感器: https://oshwhub.com/cxg01/3d-printer-weighing-hot-bed-sensor, 也可以用来当做普通的接近开关使用





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



评论