Klipper

概述

[wdd <stepper>] 是威动电机(WD DRIVE)驱动器在 Klipper 下的扩展模块,用于配置电机的控制参数:控制环整定、前馈、保护阈值、归位检测、负载模型等。这些参数会在 Klipper 启动时自动写入驱动器,运行过程中也可以随时读取或修改。

  • 支持旋转电机(stp42)与直线电机(lin)两种驱动器,参数会自动适配对应型号,无需手动选择寄存器。
  • 配置里写了什么就下发什么;没有写的可选项沿用驱动器出厂默认值。

准备工作

使用前请确认:

  • 一台可正常运行的 Klipper 主机;
  • 一台威动电机;
  • 上位机与驱动板之间有可用的 CAN 通讯(USB-CAN 适配器或 CAN 网关);
  • printer.cfg 中已有目标电机的 [stepper_*] 配置,且 microsteps、rotation_distance、step_pin 均已填写。

配置 CAN 通讯(首次使用)

  1. 连接 CAN 总线:把 USB-CAN 适配器接到驱动板,总线两端各接 120 Ω 终端电阻,各节点波特率保持一致。

  2. 启用 CAN 接口。wddrive 固件固定使用 1 Mbit/s:

    sudo ip link set can0 up type can bitrate 1000000
    
  3. 查询总线上的设备,取得驱动板的 CAN UUID:

    ~/klippy-env/bin/python ~/klipper/scripts/canbus_query.py can0
    

    输出形如:

    Found canbus_uuid=1d002a00001c, Application: Klipper
    
  4. 把 UUID 写入 printer.cfg 的 [mcu] 段:

    [mcu]
    canbus_uuid: 1d002a00001c
    

查询不到设备时,依次检查:can0 是否已启用(ip -details link show can0)、波特率是否为 1 Mbit/s、终端电阻与接线是否正确、驱动板是否已运行在 Klipper 模式。

启用 wdd 模块

  1. 下载扩展模块 wdd.py,放入 Klipper 的 klippy/extras/ 目录。

    如果 Klipper 主机是树莓派,可以在电脑上 wdd.py 所在目录(通常是「下载」目录)打开终端,直接用 scp 上传(把 pi、raspberrypi.local 换成实际的登录用户名与主机地址,也可以直接写 IP):

    scp wdd.py pi@raspberrypi.local:~/klipper/klippy/extras/
    

    首次连接会提示确认主机指纹,按提示输入树莓派的登录密码即可。

  2. 在 printer.cfg 中新增 [wdd <电机名>] 配置段,名称与对应步进电机的最后一段一致(如 [wdd stepper_x] 对应 [stepper_x])。

  3. 参考下面的说明填写参数。

  4. 保存后执行 RESTART 使配置生效。

如果参数有误(缺少必要的整定方式、数值为负或超出允许范围等),Klipper 会在启动时报错并停止,不会带着错误配置运行。

配置说明

  • [wdd ...] 会读取同名 [stepper_*] 的细分、行程等设置,两者必须同时存在。
  • 配置里明确写出的参数才会下发;未填写的可选项保留驱动器出厂默认值。
  • 归位检测参数(homing_*)有内置默认值,会始终下发,请按实际机械在台架上标定。
  • 所有数值必须为非负数。

控制环整定

电机有三个控制环:位置环、速度环、电流环。每个环都必须给出整定方式,可以选择下面两种之一:

整定方式 如何填写
带宽整定 填写该环的 <环名>_bandwidth(单位 Hz)。此时该环的 kp / ki 会被忽略。
增益整定 填写该环的 <环名>_kp;速度环与电流环还必须同时填写 <环名>_ki。位置环没有积分项,只填 position_kp。
参数 说明
current_bandwidth 电流环带宽
current_kp / current_ki 电流环 P / I 增益
velocity_bandwidth 速度环带宽
velocity_kp / velocity_ki 速度环 P / I 增益
position_bandwidth 位置环带宽
position_kp 位置环 P 增益
# 电流环:带宽整定
current_bandwidth: 1000
# 速度环:kp/ki 整定(两者必须同时填写)
velocity_kp: 1.2
velocity_ki: 0.05
# 位置环:只有 kp
position_kp: 0.8

带宽与 kp/ki 二选一即可,整定方式由系统自动识别,不需要额外开关。

前馈(可选)

前馈用于改善跟随性能,属于可选项。

参数 说明
velocity_feed_forward 速度前馈系数,0 表示关闭
velocity_accel_feed_forward 加速度前馈系数
position_velocity_feed_forward 位置模式下的速度前馈比例,1.0 表示直通
position_acceleration_feed_forward 位置模式下的加速度前馈系数

位置类控制模式使用 position_* 前馈,速度模式(PV)使用 velocity_* 前馈,两者互不影响,按需配置。

保护参数(可选)

以下保护参数均为可选项,不填写时使用驱动器出厂默认值。

电压保护

参数 说明 单位
over_voltage_fault 过压故障阈值 V
over_voltage_warning 过压警告阈值 V
under_voltage_fault 欠压故障阈值 V
under_voltage_warning 欠压警告阈值 V
voltage_filter_time 电压滤波时间 ms

电流与过载保护

参数 说明 单位
short_circuit_threshold 短路 / 过流保护阈值 A
over_current_filter_time 过流滤波时间 ms
i2t_overload_level I²t 过载预警水位 %
i2t_max_time I²t 满载动作时间 ms

电机温度保护

参数 说明 单位
motor_over_temp_fault 电机过温故障阈值 °C
motor_over_temp_warning 电机过温警告阈值 °C

例如 over_voltage_fault: 54 表示过压故障阈值 54 V;motor_over_temp_fault: 85 表示电机过温故障 85 °C。

电机温度读取(可选)

驱动器内部带有电机温度采样(对象字典 0x2000:0C)。开启 motor_temperature 后,模块会周期性读取该温度并注册成 Klipper 温度传感器,可以直接在 Mainsail / Fluidd 的温度曲线里查看。若驱动器的对象字典没有 0x2000:0C,读取会失败并在日志中告警,请不要开启。

参数 说明 默认值
motor_temperature 是否启用电机温度传感器,填 True 开启 False
motor_temperature_gcode_id 可选,温度传感器的 M105 标识(如 T0),填写后 M105 会一并返回该温度 不填(不在 M105 中显示)
[wdd stepper_x]
# ...
motor_temperature: True
motor_temperature_gcode_id: T0      # 可选

启用后:

  • 传感器以 temperature_sensor wdd stepper_x 注册,可直接在 Mainsail / Fluidd 的温度图表中查看;
  • 可以用 TEMPERATURE_WAIT SENSOR="wdd stepper_x" MINIMUM=... MAXIMUM=... 等待温度进入目标区间;
  • wdd stepper_x 对象状态中同时提供 temperature 与 motor_temperature 两个字段;
  • 单次读取超时会沿用上一次的数值,连续多次失败才会在 klipper.log 中记录警告。

本开关只负责读取与显示温度,不写入对象字典;电机过温保护由上文 motor_over_temp_fault / motor_over_temp_warning 负责,两者互不依赖,可以只开其中一个。

撞块归位检测

归位时驱动器会让电机缓慢顶向机械限位(撞块),当相位电流升高与位置跟随误差增大同时出现时判定已到达限位。相关参数有内置默认值,会始终下发。

参数 说明 默认值
homing_force_limit 撞块阶段的最大推力(电流上限) 1.0 A
homing_current_threshold 判定撞块所需的电流阈值 0.7 A
homing_following_error 判定撞块所需的位置跟随误差 2.0 mm
homing_filter_time 上述条件需持续保持的时间 50 ms
homing_retract_distance 撞块后的回退距离 3.0 mm

注意: 上表默认值只是参考起点,不是安全值。请务必根据实际电机与机械结构在台架上标定后再用于生产,也不要把阈值全部设为 0,否则归位可能在开始瞬间就误判到位。

负载模型与其它

参数 说明
load_inertia_ratio 旋转电机(stp42)的负载惯量比
load_mass 直线电机(lin)的负载质量,单位 kg
encoder_pll_bandwidth 编码器 PLL 带宽
max_profile_velocity 最大轮廓速度
max_motor_speed 最大电机转速

两个负载参数按电机类型二选一填写。

多电机与多驱动板配置

一台 Klipper 主机可以同时控制多台威动电机。每台驱动器都是 CAN 总线上的一个独立节点,需要为它单独声明一个 [mcu <名称>] 段,并在对应 [stepper_*] 的引脚前加上该名称作为前缀。

定义多个 MCU

不带名称的 [mcu] 是默认 MCU;其余驱动板用 [mcu <名称>] 单独声明。每块板填写自己的 canbus_uuid,挂在同一条 CAN 总线上时 canbus_interface 相同:

[mcu]
canbus_interface: can0
canbus_uuid: f280ac7410f9

[mcu y]
canbus_interface: can0
canbus_uuid: c039d265332e

[mcu y1]
canbus_interface: can0
canbus_uuid: 24c700add124

引脚前缀

[stepper_*] 里的引脚归属哪块 MCU,由引脚前的 <mcu 名称>: 前缀决定;不写前缀就是默认的 [mcu]。注意取反符号 ! 写在最前面,即 !<名称>:<引脚>:

[stepper_x]                  # 使用默认 [mcu]
step_pin: PA0
dir_pin: PA1
enable_pin: !PA2
endstop_pin: PA3

[stepper_y]                  # 使用 [mcu y]
step_pin: y:PA0
dir_pin: y:PA1
enable_pin: !y:PA2
endstop_pin: y:PA3

[stepper_y1]                 # 使用 [mcu y1],方向取反
step_pin: y1:PA0
dir_pin: !y1:PA1
enable_pin: !y1:PA2
endstop_pin: y1:PA3

wdd 段

每台电机都要有对应的 [wdd <stepper 名称>],名称与 [stepper_*] 的最后一段一致,与它挂在哪块 MCU 上无关:

[wdd stepper_x]
# ...

[wdd stepper_y]
# ...

[wdd stepper_y1]
# ...

龙门等需要同步的双 Y 轴可以像上面这样用两个电机并联驱动(Klipper 会把 stepper_y1 自动并入 Y 轴);若无需机械同步,各自独立配置即可。所有电机共用同一条 CAN 总线时,请确保总线两端各接一个 120 Ω 终端电阻,各节点波特率统一为 1 Mbit/s。

完整配置示例

以下为旋转电机(stp42)的完整示例;直线电机(lin)把 load_inertia_ratio 换成 load_mass 即可。

[stepper_x]
step_pin: PA0
dir_pin: PA1
enable_pin: !PA2
microsteps: 16
rotation_distance: 20
endstop_pin: PA3
position_endstop: 0
position_max: 400
homing_speed: 50.0

[wdd stepper_x]
# --- 控制环(每环带宽与 kp/ki 二选一,三环都必须给) ---
current_bandwidth: 1000                 # 电流环:带宽整定
velocity_kp: 1.2                        # 速度环:kp/ki 整定
velocity_ki: 0.05
position_kp: 0.8                        # 位置环:只有 kp

# --- 前馈(可选) ---
position_velocity_feed_forward: 0.5     # 位置模式速度前馈
position_acceleration_feed_forward: 0.7 # 位置模式加速度前馈

# --- 负载模型(按电机类型二选一) ---
load_inertia_ratio: 0.32                # 旋转电机(stp42)
# load_mass: 0.5                        # 直线电机(lin),单位 kg

# --- 保护(可选,缺省使用出厂默认值) ---
over_voltage_fault: 54                  # V
under_voltage_warning: 20               # V
motor_over_temp_fault: 85               # °C
short_circuit_threshold: 5              # A
i2t_overload_level: 100                 # %
i2t_max_time: 10000                     # ms

# --- 撞块归位检测(有默认值,会始终下发;此处演示覆盖) ---
# homing_force_limit: 1.0               # A,撞块阶段最大推力
# homing_current_threshold: 0.7         # A,撞块电流阈值
# homing_following_error: 2.0           # mm,撞块位置跟随误差
# homing_filter_time: 50                # ms,条件需持续保持的时间
# homing_retract_distance: 3.0          # mm,撞块后回退距离

# --- 电机温度读取(可选) ---
# motor_temperature: True               # 启用电机温度传感器
# motor_temperature_gcode_id: T0        # 可选,M105 中显示为 T0

# --- 其它(可选) ---
# encoder_pll_bandwidth: 2000
# max_profile_velocity: 300
# max_motor_speed: 3000

运行时调整

调机时无需重启,可直接在 Klipper 控制台读取或修改参数。

写入参数(VALUE 填物理值,直接带单位对应的数值即可):

WDD_SET STEPPER=stepper_x PARAM=current_bandwidth VALUE=800
WDD_SET STEPPER=stepper_x PARAM=over_voltage_fault VALUE=52
WDD_SET STEPPER=stepper_x PARAM=homing_force_limit VALUE=1.0

读取参数:

WDD_GET STEPPER=stepper_x PARAM=current_bandwidth
WDD_GET STEPPER=stepper_x PARAM=over_voltage_fault

命令执行后,控制台会回显读取到的当前值。

以下参数名可在 PARAM= 后使用,与配置文件中的名称一致:控制环参数、前馈参数、保护参数、归位参数、负载模型参数。