跟思兼學(xué)Klipper(30):使用輔助宏調(diào)整3D打印機(jī)無(wú)感歸位堵轉(zhuǎn)檢測(cè)閾值
又名《調(diào)整堵轉(zhuǎn)檢測(cè)閾值降低創(chuàng)想三維 K1C 打印機(jī)無(wú)感歸位啪啪聲》
前言
原創(chuàng)文章,轉(zhuǎn)載引用務(wù)必著名鏈接,水平有限,如有疏漏,歡迎指正交流。
文章如有更新請(qǐng)?jiān)L問(wèn) DFRobot 社區(qū)及 cnblogs 博客園,前者內(nèi)容較全,后者排版及閱讀體驗(yàn)更佳。
手中的創(chuàng)想三維 K1C 3D 打印機(jī)目前使用很滿意。如果想要使用原生 Klipper 的話需要解決 prtouch_v2 壓力熱床調(diào)平器使用閉源 MIPS 二進(jìn)制庫(kù)的問(wèn)題,目前有多種解決方案,此處按下不表。
K1C 的 XY 軸使用 TMC2209 堵轉(zhuǎn)檢測(cè)特性(StallGuard4)實(shí)現(xiàn)無(wú)限位歸位(也稱無(wú)限位歸零、無(wú)感歸零、無(wú)感歸位)功能,從而實(shí)現(xiàn)不借助額外限位開(kāi)關(guān)的情況下實(shí)現(xiàn)歸位。日常歸位 Y 軸的時(shí)候啪的一聲令人膽顫,我都怕 X 橫梁給撞歪,或者機(jī)架給撞散架(雖然不會(huì)),所以準(zhǔn)備重新校準(zhǔn)堵轉(zhuǎn)檢測(cè)閾值(以下簡(jiǎn)稱閾值)。由于重復(fù)步驟比較多,所以寫了個(gè)輔助宏。
我們約定:控制臺(tái)指的是網(wǎng)頁(yè)上和 Klippy 交互的輸入命令接收反饋的地方,ssh 終端指的是使用 SSH 登錄后輸入 Linux 命令的地方。
軟硬件測(cè)試環(huán)境:
- Creality K1C 3D 打印機(jī)
- CrealityOS (已 root,已安裝 Moonraker 和 Fluidd)
免責(zé)聲明:本教程僅作個(gè)人記錄和分享,未按正確指令操作導(dǎo)致出現(xiàn)問(wèn)題,和本人無(wú)關(guān)。【W(wǎng)IP WARNING】目前部分內(nèi)容還在完善,基本思路沒(méi)問(wèn)題。
一、基礎(chǔ)知識(shí)

德國(guó) Trinamic 公司(已被 Maxim 收購(gòu),后者又被 ADI 收購(gòu))的部分步進(jìn)電機(jī)驅(qū)動(dòng)支持 StallGuard 技術(shù),它通過(guò)監(jiān)測(cè)電機(jī)轉(zhuǎn)動(dòng)時(shí)的電流變化情況,判斷電機(jī)是否處于堵轉(zhuǎn)狀態(tài),當(dāng)電機(jī)發(fā)生堵轉(zhuǎn)時(shí),電流會(huì)瞬間變大,TMC 驅(qū)動(dòng)通過(guò)內(nèi)部的電流傳感器實(shí)時(shí)監(jiān)測(cè)電機(jī)的電流變化情況,當(dāng)電流變大到一定程度時(shí),就會(huì)判斷電機(jī)處于堵轉(zhuǎn)狀態(tài),并停止驅(qū)動(dòng)電機(jī),從而避免電機(jī)過(guò)載和損壞。
使用此特性可以實(shí)現(xiàn) 3D 打印機(jī)的無(wú)感歸位功能,也就是撞擊框架導(dǎo)致電機(jī)堵轉(zhuǎn)并被驅(qū)動(dòng)檢測(cè)到后停止,優(yōu)點(diǎn)是減少接線、增大可移動(dòng)范圍;缺點(diǎn)是需要調(diào)整合適的堵轉(zhuǎn)檢測(cè)閾值,并且此閾值受歸位速度、電機(jī)運(yùn)行電流和溫度影響,其中前兩者可控,溫度需要觀察。
目前常見(jiàn)的 TMC 步進(jìn)電機(jī)驅(qū)動(dòng)對(duì)堵轉(zhuǎn)檢測(cè)技術(shù)支持情況:
| StallGuard2 | StallGuard4 | |
|---|---|---|
| TMC2208(TMC2225) | - | - |
| TMC2209(TMC2226) | - | 支持 |
| TMC2240 | 支持 | 支持 |
| TMC2130 | 支持 | - |
| TMC2660 | 支持 | - |
| TMC5160 | 支持 | - |
-
StallGuard4 堵轉(zhuǎn)閾值范圍為 0-255(越高越靈敏),主要配合低速靜音 StealthChop 模式使用
-
StallGuard2 堵轉(zhuǎn)閾值范圍為 -64~63(越低越靈敏),主要配合高速防抖 SpreadCycle 模式使用
-
StallGuard2 和 StallGuard4 的區(qū)別:
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 關(guān)于 TMC 無(wú)限位歸位的文檔,可以查看中文版
- Voron 關(guān)于無(wú)限位歸位的步驟,可以作為上述的補(bǔ)充
- klipper_sensorless_homing,homing_override 的通用模板宏,K1 系列不需要
三、校準(zhǔn)堵轉(zhuǎn)檢測(cè)閾值方法(精簡(jiǎn)版)
git clone sgt_cal
cd sgt_cal
3.1 預(yù)處理腳本
sh pre_sgt_cal.sh
此腳本會(huì)進(jìn)行以下操作:
- 注釋掉 printer.cfg 中對(duì) sensorless.cfg 的引用,避免干擾歸位過(guò)程
- 注釋掉 XY 電機(jī)的 hold_current,參考 Klipper 官方推薦
- 導(dǎo)入自定義配置文件
override.cfg:- 啟用電機(jī)驅(qū)動(dòng)低速靜音模式
- 降低打印機(jī)最大速度、加速度以適配低速靜音模式
- 設(shè)置無(wú)動(dòng)作超時(shí)時(shí)間 idle_timeout 為 600s (10分鐘)
- 設(shè)置初始堵轉(zhuǎn)檢測(cè)閾值為 255
- 修改默認(rèn)歸位速度
- 重啟 Klipper 使修改生效
3.2 校準(zhǔn)堵轉(zhuǎn)檢測(cè)閾值步驟
-
確認(rèn)熱床遠(yuǎn)離噴嘴,防止歸位時(shí)刮到熱床,可以在控制臺(tái)使用如下命令強(qiáng)制下降噴嘴:
FORCE_MOVE STEPPER=stepper_z DISTANCE=20 VELOCITY=100 -
將熱端手動(dòng)移動(dòng)到熱床中心附近上方,如果無(wú)法移動(dòng),使用控制臺(tái)輸入
M84關(guān)閉電機(jī)后再移動(dòng) -
控制臺(tái)輸入如下命令,不斷調(diào)整閾值(默認(rèn)從255開(kāi)始),找到可以完成歸位動(dòng)作,且輕觸即停的最靈敏值。
# 如下命令代表測(cè)試 x 電機(jī),觸發(fā)堵轉(zhuǎn)檢測(cè)后回退距離為 0mm,堵轉(zhuǎn)檢測(cè)閾值為 255。 TEST_SGT stepper=x backoff=0 sgt=255- 當(dāng)閾值過(guò)于靈敏時(shí),擠出頭將會(huì)移動(dòng)很短距離就停下,無(wú)法歸位,此時(shí)需要調(diào)整閾值
- 初始可以“大踏步”,閾值每次降低50,找到用手擋不住的閾值,網(wǎng)頁(yè)按急停按鈕或者控制臺(tái)輸入M112。
- 再重復(fù)使用二分法,結(jié)合5/2/1的步進(jìn)微調(diào),直到找到可以歸位同時(shí)可以用手輕輕擋下的最高靈敏值。
- 如果測(cè)試時(shí)熱端到達(dá) Y 軸最大處,可以設(shè)置 backoff 值讓其回退(不指定時(shí)默認(rèn)回退 30mm)
- 再使用上述命令完整歸位來(lái)進(jìn)行確認(rèn)。
- 加載網(wǎng)床補(bǔ)償時(shí),G90 會(huì)要求你先歸位,所以要先清除網(wǎng)床才能相對(duì)移動(dòng)。
- 例如:SGT=150 時(shí)動(dòng)一下就停,SGT=100 時(shí)用手擋不下來(lái),我們就選擇125作為新值。如果125可以停下,則以此為基礎(chǔ)每次加1或者2,如127再行測(cè)試,直到找到“可以完成歸位,同時(shí)輕觸即可停下的閾值”,假設(shè)為102,記為
SGT_MAX
-
找到歸位撞擊聲變大的靈敏值
TEST_SGT stepper=x sgt=102- 在上述最高值的基礎(chǔ)上,每次減5,當(dāng)歸位撞擊聲變大無(wú)法接受時(shí),使用最后一個(gè)可以接受的值,逐步減1,直到找到合適的值。
- 由于此時(shí)每次都會(huì)完整歸位,所以歸位完成后需要回退來(lái)進(jìn)行下次測(cè)試,此處不設(shè)置 backoff 值,則默認(rèn)回退 30mm
- 例如 SGT=97 時(shí)撞擊過(guò)重,則從102每次減1找到能接受的閾值,如 99,記為
SGT_MIN - 再次以 SGT=99 歸位進(jìn)行確認(rèn)
-
使用輔助宏計(jì)算合適的堵轉(zhuǎn)檢測(cè)閾值
- 網(wǎng)頁(yè)上有一個(gè)新宏,名為
CALC_SGT,分別填入 SGT_MAX 和 SGT_MIN,會(huì)自動(dòng)計(jì)算處合適的閾值 - 公式為 最小值+(最大值-最小值)/3,此處我設(shè)置了四舍五入
- 網(wǎng)頁(yè)上有一個(gè)新宏,名為
-
重復(fù)上述過(guò)程獲得 Y 的堵轉(zhuǎn)檢測(cè)閾值,注意歸位時(shí)在右前方,此時(shí)坐標(biāo)為(229, 0),所以y不能回-30吧,可以根據(jù) positive_dir 判斷。
3.3 后處理腳本
sh post_sgt_cal.sh -x 102 -y 83
此腳本執(zhí)行如下動(dòng)作:
- 恢復(fù) printer.cfg 引用 sensorless.cfg
- 修改 override.cfg 中的 sgt 值,-x 和 -y 后分別為上述計(jì)算出的理想閾值
- 修改 endstop_position 值。這是由于重新校準(zhǔn)后,XY 軸特別是 Y 軸會(huì)相比之前提前觸發(fā),后方擦嘴和左側(cè)劃線位置會(huì)受到影響,所以需要調(diào)整,此處微調(diào)1mm。
四、校準(zhǔn)堵轉(zhuǎn)閾值方法(完整版)
4.1 設(shè)置合適的歸位速度
無(wú)感歸位需要合適的歸位速度,K1系列的默認(rèn)值為30mm/s,Klipper官方文檔建議設(shè)置為步進(jìn)電機(jī) rotation_distance 的一半,此處為 20齒*2mm/2=20mm/s,但是我實(shí)際測(cè)試至少提升到 40 為宜。如果此值過(guò)小,會(huì)導(dǎo)致測(cè)試的堵轉(zhuǎn)閾值范圍過(guò)小(最大最小值差值小于5)。
# printer.cfg
[stepper_x]
homing_speed: 40
[stepper_y]
homing_speed: 40
4.2 修改 printer.cfg 進(jìn)行測(cè)試
- 注釋掉 sensorless.cfg,避免影響歸位動(dòng)作
- 注釋 hold_current
- (默認(rèn)已設(shè)置,無(wú)需改動(dòng))設(shè)置
homing_retract_dist: 0 - (默認(rèn)已設(shè)置,無(wú)需改動(dòng))設(shè)置對(duì)應(yīng)電機(jī)
endstop_pin: tmc2209_stepper_x:virtual_endstop - (無(wú)需設(shè)置,如果非2209/2240,則改為-63)設(shè)置
driver_SGTHRS: 255 - (默認(rèn)已設(shè)置,無(wú)需改動(dòng))設(shè)置正確的
diag_pin
override.cfg 內(nèi)容
# [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 找到成功歸位的最高敏感值
對(duì)于2209來(lái)說(shuō),255最靈敏,0最不靈敏。我們?cè)诳刂婆_(tái)輸入如下自定義宏命令
TEST_SGT stepper=x sgt=125 back=0
直到找到可以正確歸位,并且手指輕擋即可停下的最高閾值。
再次使用此閾值歸位,確認(rèn)可以正確歸位。
輔助調(diào)試宏內(nèi)容
[gcode_macro TEST_SGT]
description: 堵轉(zhuǎn)閾值輔助測(cè)試宏 by 思兼,默認(rèn)用于TMC2209。
gcode:
{% set stepper = params.STEPPER|default('x')|string %}
{% set backoff_distance = params.BACKOFF|default(30)|int %}
# 如果 TMC2209/2226/2240 則默認(rèn)255,否則默認(rèn)-64, StallGuard2和4的區(qū)別見(jiàn)官方手冊(cè),精度更高
{% 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: 輸入最大和最小堵轉(zhuǎn)閾值,自動(dòng)計(jì)算合適的閾值。如果計(jì)算 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="堵轉(zhuǎn)檢測(cè)靈敏度不理想,差值小于5,請(qǐng)修改歸位速度和/或歸位電流后重試"
{% endif %}
4.4 找到成功歸位的最低敏感值
之后我們使用如下參數(shù)找到能接受的最低閾值,從最高值逐漸減5,此時(shí)撞擊聲較大,選擇之前的一個(gè)值。從上一個(gè)值逐漸減1。
TEST_SGT stepper=y sgt=125
4.5 計(jì)算合適的堵轉(zhuǎn)檢測(cè)閾值
公式為 最小值+(最大值-最小值)/3,必要時(shí)四舍五入
4.6 應(yīng)用堵轉(zhuǎn)檢測(cè)閾值
五、常見(jiàn)問(wèn)題
5.1 何時(shí)需要重新調(diào)整閾值
由于堵轉(zhuǎn)檢測(cè)閾值受環(huán)境溫度、電機(jī)型號(hào)、電機(jī)電流、歸位速度等影響,當(dāng)參數(shù)發(fā)生較大改變時(shí)需要重新調(diào)整。同時(shí)如果使用 TMC_AutoTune 組件自動(dòng)設(shè)置驅(qū)動(dòng)參數(shù),也需要重新調(diào)整。
5.2 測(cè)得的閾值不滿意怎么辦
如果 SGT_MAX 和 SGT_MIN 差值小于 5,則獲得的閾值可能會(huì)導(dǎo)致歸位不穩(wěn)定,可以通過(guò)以下方法改善:
- 增加歸位速度,如 50~100mm/s
- 調(diào)整歸位時(shí)電機(jī)電流,我們可以設(shè)置獨(dú)立的電機(jī)運(yùn)行電流 run_current 和歸位時(shí)電流,從而增加靈活度,具體可以參考上面的klipper_sensorless_homing
Bounus
常見(jiàn) 3D 打印機(jī)驅(qū)動(dòng)對(duì)比
| 工作電壓 | 工作電流 | StealthChop | StallGuard | CoolStep | 通訊協(xié)議 | |
|---|---|---|---|---|---|---|
| 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 |
以及:
獨(dú)立run_current
If an axis is not specified then it will default to the position that the head was last commanded to.

浙公網(wǎng)安備 33010602011771號(hào)