2024-6-9 16:10:42 [显示全部楼层]
6486浏览
查看: 6486|回复: 1

[教程] 跟思兼学Klipper(30):使用辅助宏调整3D打印机无感归位阈值

[复制链接]
本帖最后由 pATAq 于 2024-6-9 16:12 编辑

又名《调整堵转检测阈值降低创想三维 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(越<u>高</u>越灵敏),主要配合低速静音 StealthChop 模式使用

  • StallGuard2 堵转阈值范围为 -64~63(越<u>低</u>越灵敏),主要配合高速防抖 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.

二、参考资料

三、校准堵转检测阈值方法(精简版)

git clone sgt_cal
cd sgt_cal

3.1 预处理脚本

sh pre_sgt_cal.sh

此脚本会进行以下操作:

  1. 注释掉 printer.cfg 中对 sensorless.cfg 的引用,避免干扰归位过程
  2. 注释掉 XY 电机的 hold_current,参考 Klipper 官方推荐
  3. 导入自定义配置文件 override.cfg
    • 启用电机驱动低速静音模式
    • 降低打印机最大速度、加速度以适配低速静音模式
    • 设置无动作超时时间 idle_timeout 为 600s (10分钟)
    • 设置初始堵转检测阈值为 255
    • 修改默认归位速度
  4. 重启 Klipper 使修改生效

3.2 校准堵转检测阈值步骤

  1. 确认热床远离喷嘴,防止归位时刮到热床,可以在控制台使用如下命令强制下降喷嘴:

    FORCE_MOVE STEPPER=stepper_z DISTANCE=20 VELOCITY=100
  2. 将热端手动移动到热床中心附近上方,如果无法移动,使用控制台输入 M84 关闭电机后再移动

  3. 控制台输入如下命令,不断调整阈值(默认从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
  4. 找到归位撞击声变大的灵敏值

    TEST_SGT stepper=x sgt=102
    • 在上述最高值的基础上,每次减5,当归位撞击声变大无法接受时,使用最后一个可以接受的值,逐步减1,直到找到合适的值。
    • 由于此时每次都会完整归位,所以归位完成后需要回退来进行下次测试,此处不设置 backoff 值,则默认回退 30mm
    • 例如 SGT=97 时撞击过重,则从102每次减1找到能接受的阈值,如 99,记为 SGT_MIN
    • 再次以 SGT=99 归位进行确认
  5. 使用辅助宏计算合适的堵转检测阈值

    • 网页上有一个新宏,名为 CALC_SGT,分别填入 SGT_MAX 和 SGT_MIN,会自动计算处合适的阈值
    • 公式为 最小值+(最大值-最小值)/3,此处我设置了四舍五入
  6. 重复上述过程获得 Y 的堵转检测阈值,注意归位时在右前方,<u>此时坐标为(229, 0),所以y不能回-30吧</u>,可以根据 positive_dir 判断。

3.3 后处理脚本

sh post_sgt_cal.sh -x 102 -y 83

此脚本执行如下动作:

  1. 恢复 printer.cfg 引用 sensorless.cfg
  2. 修改 override.cfg 中的 sgt 值,-x 和 -y 后分别为上述计算出的理想阈值
  3. 修改 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 进行测试

  1. 注释掉 sensorless.cfg,避免影响归位动作
  2. 注释 hold_current
  3. (默认已设置,无需改动)设置 homing_retract_dist: 0
  4. (默认已设置,无需改动)设置对应电机endstop_pin: tmc2209_stepper_x:virtual_endstop
  5. (无需设置,如果非2209/2240,则改为-63)设置driver_SGTHRS: 255
  6. (默认已设置,无需改动)设置正确的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,则获得的阈值可能会导致归位不稳定,可以通过以下方法改善:

  1. 增加归位速度,如 50~100mm/s
  2. 调整归位时电机电流,我们可以设置独立的电机运行电流 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

以及:

QDLZC  学徒

发表于 2024-6-13 13:09:58

你好,我是打印机设备厂家,请联系我VX:odoobpm
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail