跟思兼学Klipper(30):使用辅助宏调整3D打印机无感归位堵转检测阈值
又名《调整堵转检测阈值降低创想三维 K1C 打印机无感归位啪啪声》
前言
原创文章,转载引用务必著名链接,水平有限,如有疏漏,欢迎指正交流。
文章如有更新请访问 DFRobot 社区及 cnblogs 博客园,前者内容较全,后者排版及阅读体验更佳。
手中的创想三维 K1C 3D 打印机目前使用很满意。如果想要使用原生 Klipper 的话需要解决 prtouch_v2 压力热床调平器使用闭源 MIPS 二进制库的问题,目前有多种解决方案,此处按下不表。
K1C 的 XY 轴使用 TMC2209 堵转检测特性(StallGuard4)实现无限位归位(也称无限位归零、无感归零、无感归位)功能,从而实现不借助额外限位开关的情况下实现归位。日常归位 Y 轴的时候啪的一声令人胆颤,我都怕 X 横梁给撞歪,或者机架给撞散架(虽然不会),所以准备重新校准堵转检测阈值(以下简称阈值)。由于重复步骤比较多,所以写了个辅助宏。
我们约定:控制台指的是网页上和 Klippy 交互的输入命令接收反馈的地方,ssh 终端指的是使用 SSH 登录后输入 Linux 命令的地方。
软硬件测试环境:
- Creality K1C 3D 打印机
- CrealityOS (已 root,已安装 Moonraker 和 Fluidd)
免责声明:本教程仅作个人记录和分享,未按正确指令操作导致出现问题,和本人无关。【WIP WARNING】目前部分内容还在完善,基本思路没问题。
一、基础知识
德国 Trinamic 公司(已被 Maxim 收购,后者又被 ADI 收购)的部分步进电机驱动支持 StallGuard 技术,它通过监测电机转动时的电流变化情况,判断电机是否处于堵转状态,当电机发生堵转时,电流会瞬间变大,TMC 驱动通过内部的电流传感器实时监测电机的电流变化情况,当电流变大到一定程度时,就会判断电机处于堵转状态,并停止驱动电机,从而避免电机过载和损坏。
使用此特性可以实现 3D 打印机的无感归位功能,也就是撞击框架导致电机堵转并被驱动检测到后停止,优点是减少接线、增大可移动范围;缺点是需要调整合适的堵转检测阈值,并且此阈值受归位速度、电机运行电流和温度影响,其中前两者可控,温度需要观察。
目前常见的 TMC 步进电机驱动对堵转检测技术支持情况:
StallGuard2 | StallGuard4 | |
---|---|---|
TMC2208(TMC2225) | - | - |
TMC2209(TMC2226) | - | 支持 |
TMC2240 | 支持 | 支持 |
TMC2130 | 支持 | - |
TMC2660 | 支持 | - |
TMC5160 | 支持 | - |
-
StallGuard4 堵转阈值范围为 0-255(越高越灵敏),主要配合低速静音 StealthChop 模式使用
-
StallGuard2 堵转阈值范围为 -64~63(越低越灵敏),主要配合高速防抖 SpreadCycle 模式使用
-
StallGuard2 和 StallGuard4 的区别:
StallGuard4 is optimized for operation with StealthChop, its predecessor StallGuard2 works with
SpreadCycle. The function is similar: Both deliver a load value, going from a high value at low load, to
a low value at high load. While StallGuard2 becomes tuned to show a “0”-reading for stall detection,
StallGuard4 uses a comparison-value to trigger stall detection, rather than shifting SG_RESULT itself.
二、参考资料
- Klipper 关于 TMC 无限位归位的文档,可以查看中文版
- Voron 关于无限位归位的步骤,可以作为上述的补充
- klipper_sensorless_homing,homing_override 的通用模板宏,K1 系列不需要
三、校准堵转检测阈值方法(精简版)
git clone sgt_cal
cd sgt_cal
3.1 预处理脚本
sh pre_sgt_cal.sh
此脚本会进行以下操作:
- 注释掉 printer.cfg 中对 sensorless.cfg 的引用,避免干扰归位过程
- 注释掉 XY 电机的 hold_current,参考 Klipper 官方推荐
- 导入自定义配置文件
override.cfg
:- 启用电机驱动低速静音模式
- 降低打印机最大速度、加速度以适配低速静音模式
- 设置无动作超时时间 idle_timeout 为 600s (10分钟)
- 设置初始堵转检测阈值为 255
- 修改默认归位速度
- 重启 Klipper 使修改生效
3.2 校准堵转检测阈值步骤
-
确认热床远离喷嘴,防止归位时刮到热床,可以在控制台使用如下命令强制下降喷嘴:
FORCE_MOVE STEPPER=stepper_z DISTANCE=20 VELOCITY=100
-
将热端手动移动到热床中心附近上方,如果无法移动,使用控制台输入
M84
关闭电机后再移动 -
控制台输入如下命令,不断调整阈值(默认从255开始),找到可以完成归位动作,且轻触即停的最灵敏值。
# 如下命令代表测试 x 电机,触发堵转检测后回退距离为 0mm,堵转检测阈值为 255。 TEST_SGT stepper=x backoff=0 sgt=255
- 当阈值过于灵敏时,挤出头将会移动很短距离就停下,无法归位,此时需要调整阈值
- 初始可以“大踏步”,阈值每次降低50,找到用手挡不住的阈值,网页按急停按钮或者控制台输入M112。
- 再重复使用二分法,结合5/2/1的步进微调,直到找到可以归位同时可以用手轻轻挡下的最高灵敏值。
- 如果测试时热端到达 Y 轴最大处,可以设置 backoff 值让其回退(不指定时默认回退 30mm)
- 再使用上述命令完整归位来进行确认。
- 加载网床补偿时,G90 会要求你先归位,所以要先清除网床才能相对移动。
- 例如:SGT=150 时动一下就停,SGT=100 时用手挡不下来,我们就选择125作为新值。如果125可以停下,则以此为基础每次加1或者2,如127再行测试,直到找到“可以完成归位,同时轻触即可停下的阈值”,假设为102,记为
SGT_MAX
-
找到归位撞击声变大的灵敏值
TEST_SGT stepper=x sgt=102
- 在上述最高值的基础上,每次减5,当归位撞击声变大无法接受时,使用最后一个可以接受的值,逐步减1,直到找到合适的值。
- 由于此时每次都会完整归位,所以归位完成后需要回退来进行下次测试,此处不设置 backoff 值,则默认回退 30mm
- 例如 SGT=97 时撞击过重,则从102每次减1找到能接受的阈值,如 99,记为
SGT_MIN
- 再次以 SGT=99 归位进行确认
-
使用辅助宏计算合适的堵转检测阈值
- 网页上有一个新宏,名为
CALC_SGT
,分别填入 SGT_MAX 和 SGT_MIN,会自动计算处合适的阈值 - 公式为 最小值+(最大值-最小值)/3,此处我设置了四舍五入
- 网页上有一个新宏,名为
-
重复上述过程获得 Y 的堵转检测阈值,注意归位时在右前方,此时坐标为(229, 0),所以y不能回-30吧,可以根据 positive_dir 判断。
3.3 后处理脚本
sh post_sgt_cal.sh -x 102 -y 83
此脚本执行如下动作:
- 恢复 printer.cfg 引用 sensorless.cfg
- 修改 override.cfg 中的 sgt 值,-x 和 -y 后分别为上述计算出的理想阈值
- 修改 endstop_position 值。这是由于重新校准后,XY 轴特别是 Y 轴会相比之前提前触发,后方擦嘴和左侧划线位置会受到影响,所以需要调整,此处微调1mm。
四、校准堵转阈值方法(完整版)
4.1 设置合适的归位速度
无感归位需要合适的归位速度,K1系列的默认值为30mm/s,Klipper官方文档建议设置为步进电机 rotation_distance 的一半,此处为 20齿*2mm/2=20mm/s,但是我实际测试至少提升到 40 为宜。如果此值过小,会导致测试的堵转阈值范围过小(最大最小值差值小于5)。
# printer.cfg
[stepper_x]
homing_speed: 40
[stepper_y]
homing_speed: 40
4.2 修改 printer.cfg 进行测试
- 注释掉 sensorless.cfg,避免影响归位动作
- 注释 hold_current
- (默认已设置,无需改动)设置
homing_retract_dist: 0
- (默认已设置,无需改动)设置对应电机
endstop_pin: tmc2209_stepper_x:virtual_endstop
- (无需设置,如果非2209/2240,则改为-63)设置
driver_SGTHRS: 255
- (默认已设置,无需改动)设置正确的
diag_pin
override.cfg 内容
# [include override.cfg]
[idle_timeout]
timeout: 600
[printer]
max_accel: 15000
max_accel_to_decel: 7500
max_z_velocity: 7.5
max_z_accel: 150
square_corner_max_velocity: 100.0
[stepper_x]
position_endstop: 228
homing_speed: 40
[tmc2209 stepper_x]
stealthchop_threshold: 999999
# hold_current:1.0
driver_SGTHRS: 83
[stepper_y]
position_endstop: 1
homing_speed: 40
[tmc2209 stepper_y]
stealthchop_threshold: 999999
# hold_current:1.0
driver_SGTHRS: 101
[force_move]
enable_force_move: True
4.3 找到成功归位的最高敏感值
对于2209来说,255最灵敏,0最不灵敏。我们在控制台输入如下自定义宏命令
TEST_SGT stepper=x sgt=125 back=0
直到找到可以正确归位,并且手指轻挡即可停下的最高阈值。
再次使用此阈值归位,确认可以正确归位。
辅助调试宏内容
[gcode_macro TEST_SGT]
description: 堵转阈值辅助测试宏 by 思兼,默认用于TMC2209。
gcode:
{% set stepper = params.STEPPER|default('x')|string %}
{% set backoff_distance = params.BACKOFF|default(30)|int %}
# 如果 TMC2209/2226/2240 则默认255,否则默认-64, StallGuard2和4的区别见官方手册,精度更高
{% set sgt = params.TMCSGT|default(255)|int %}
SET_TMC_FIELD STEPPER=stepper_{stepper} FIELD=SGTHRS VALUE={sgt}
G4 P2000
G28 {stepper}0
M400
BED_MESH_CLEAR
G91
G0 {stepper}-{backoff_distance} F3000
G90
[gcode_macro CALC_SGT]
description: 输入最大和最小堵转阈值,自动计算合适的阈值。如果计算 StallGuard2,需要修改一下
gcode:
{% set sgt_max = params.SGTMAX|default(0)|int %}
{% set sgt_min = params.SGTMIN|default(0)|int %}
{% if sgt_max - sgt_min > 5%}
{% set ideal_sgt = (sgt_min + (sgt_max - sgt_min) / 3)|round|int %}
RESPOND PREFIX="推荐SGT值:" MSG="{ ideal_sgt }"
{% else %}
RESPOND TYPE=error MSG="堵转检测灵敏度不理想,差值小于5,请修改归位速度和/或归位电流后重试"
{% endif %}
4.4 找到成功归位的最低敏感值
之后我们使用如下参数找到能接受的最低阈值,从最高值逐渐减5,此时撞击声较大,选择之前的一个值。从上一个值逐渐减1。
TEST_SGT stepper=y sgt=125
4.5 计算合适的堵转检测阈值
公式为 最小值+(最大值-最小值)/3,必要时四舍五入
4.6 应用堵转检测阈值
五、常见问题
5.1 何时需要重新调整阈值
由于堵转检测阈值受环境温度、电机型号、电机电流、归位速度等影响,当参数发生较大改变时需要重新调整。同时如果使用 TMC_AutoTune 组件自动设置驱动参数,也需要重新调整。
5.2 测得的阈值不满意怎么办
如果 SGT_MAX 和 SGT_MIN 差值小于 5,则获得的阈值可能会导致归位不稳定,可以通过以下方法改善:
- 增加归位速度,如 50~100mm/s
- 调整归位时电机电流,我们可以设置独立的电机运行电流 run_current 和归位时电流,从而增加灵活度,具体可以参考上面的klipper_sensorless_homing
Bounus
常见 3D 打印机驱动对比
工作电压 | 工作电流 | StealthChop | StallGuard | CoolStep | 通讯协议 | |
---|---|---|---|---|---|---|
TMC2209 | 4.75 to 29V DC | IMAX=2.8A,IRMS = 2.0A | 2 | 4 | Y | UART |
TMC2130 | 4.75 to 46V DC | IMAX=2.5A,IRMS = 2.0A | 1 | 2 | Y | SPI |
TMC2240 | 4.5V to 36V DC | IMAX=5.0A,IRMS = 2.1A | 2 | 2+4 | Y | SPI/UART |
TMC2660 | up to 30V DC | IMAX=4.0A | N | 2 | Y | SPI |
TMC5160 | 8 to 60V DC | 1 to several 10A | 2 | 2 | Y | SPI/UART |
以及:
独立run_current
If an axis is not specified then it will default to the position that the head was last commanded to.