pATAq 发表于 2024-6-9 16:10:42

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

本帖最后由 pATAq 于 2024-6-9 16:12 编辑

又名《调整堵转检测阈值降低创想三维 K1C 打印机无感归位啪啪声》

# 前言

原创文章,转载引用务必著名链接,水平有限,如有疏漏,欢迎指正交流。

文章如有更新请访问 (https://mc.dfrobot.com.cn/thread-319309-1-1.html?fromuid=725344)及 (https://www.cnblogs.com/sjqlwy/p/sensorless_homing.html),前者内容较全,后者排版及阅读体验更佳。

手中的创想三维 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】目前部分内容还在完善,基本思路没问题。

# 一、基础知识

![](https://www.symmetryelectronics.com/getmedia/954a6642-51a9-423e-81d2-97746976a662/Trinamic-Low-Logo.png)

德国 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.

# 二、参考资料

* (https://www.klipper3d.org/TMC_Drivers.html#_2),可以查看中文版
* (https://docs.vorondesign.com/community/howto/clee/sensorless_xy_homing.html),可以作为上述的补充
* (https://github.com/kyleisah/klipper_sensorless_homing),homing_override 的通用模板宏,K1 系列不需要

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

```shell
git clone sgt_cal
cd sgt_cal
```

## 3.1 预处理脚本

```shell
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. 确认热床远离喷嘴,防止归位时刮到热床,可以在控制台使用如下命令强制下降喷嘴:

   ```yaml
   FORCE_MOVE STEPPER=stepper_z DISTANCE=20 VELOCITY=100
   ```

2. 将热端手动移动到热床中心附近上方,如果无法移动,使用控制台输入 `M84` 关闭电机后再移动

3. 控制台输入如下命令,不断调整阈值(默认从255开始),找到可以完成归位动作,且轻触即停的最灵敏值。

   ```yaml
   # 如下命令代表测试 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`

7. 找到归位撞击声变大的灵敏值

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

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

## 3.3 后处理脚本

```shell
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)。

```yaml
# printer.cfg

homing_speed: 40


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 内容

```yaml
#

timeout: 600


max_accel: 15000
max_accel_to_decel: 7500
max_z_velocity: 7.5
max_z_accel: 150
square_corner_max_velocity: 100.0


position_endstop: 228
homing_speed: 40


stealthchop_threshold: 999999
# hold_current:1.0
driver_SGTHRS: 83


position_endstop: 1
homing_speed: 40


stealthchop_threshold: 999999
# hold_current:1.0
driver_SGTHRS: 101


enable_force_move: True
```

## 4.3 找到成功归位的最高敏感值

对于2209来说,255最灵敏,0最不灵敏。我们在控制台输入如下自定义宏命令

```yaml
TEST_SGT stepper=x sgt=125 back=0
```

直到找到可以正确归位,并且手指轻挡即可停下的最高阈值。

再次使用此阈值归位,确认可以正确归位。

### 辅助调试宏内容

```yaml

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


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。

```yaml
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 和归位时电流,从而增加灵活度,具体可以参考上面的(https://github.com/kyleisah/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      |
| (https://www.analog.com/cn/products/tmc2240.html) | 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 |

以及:

* (https://marlinfw.org/docs/hardware/tmc_drivers.html)
* (https://www.klipper3d.org/TMC_Drivers.html)
* (https://klipper.discourse.group/t/hold-current-and-run-current-tmc2209/1171)

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

你好,我是打印机设备厂家,请联系我VX:odoobpm
页: [1]
查看完整版本: 跟思兼学Klipper(30):使用辅助宏调整3D打印机无感归位阈值