跟思兼學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.

浙公網安備 33010602011771號