board: MKS DLC32 (Single Axis)
name: LO-TTA-03
stepping:
  engine: I2S_STATIC
  idle_ms: 255
  pulse_us: 4
  dir_delay_us: 0
  disable_delay_us: 0
  segments: 12

axes:
  shared_stepper_disable_pin: i2so.0
  shared_stepper_reset_pin: NO_PIN
  x:
    steps_per_mm: 3200
    # ★ 900 mm/min = **15 mm/s = 15 转/s = 900 RPM**（导程 1mm ⇒ 1 rev/s = 1 mm/s）。
    #   —— 与平台侧「位置模式时的最大速度」maxValue = **15**(mm/s) 精确对齐（15 × 60 = 900）。
    #   【上限依据】SERVO42C 手册**脉冲口上限 60 kHz** ÷ 3200 步/mm = 18.75 mm/s = 1125 mm/min
    #     ⇒ MStep=16 下的**物理天花板 = 1125 mm/min**（DLC32 的 I2S 上限 125 kHz 不是瓶颈；
    #       pulse_us:4 ⇒ 4µs高+4µs低=8µs=125kHz 自洽）。
    #     本值 900 = 48 kHz ≈ **80%**，留 20% 余量。
    #     ★ **不要设 >1125**：DLC32 会真发 100+ kHz、42C 收不全 ⇒ 丢步 / 闭环下 err 飙 17.99。
    #   ★ 商家说的 2000 RPM = 33.3 mm/s 需 106.7 kHz，**超 60 kHz 近一倍 ⇒ 做不到**。
    #     真要 2000 RPM 只能把 42C 的 MStep 16→4（⇒ 本文件 steps_per_mm 改 800）+ 重做空载 CAL。
    #   ★ 第二道门槛是**加速度**（见下一条）：v_peak = √(Acc × 行程)，
    #     Acc 平台上限 15 ⇒ **要真正跑到 15 mm/s 至少需要 15mm 行程**，短行程到不了。
    #   沿革：60(=1mm/s，会把一切都钳到 1) → 600(=10mm/s) → 1000 → **900（本次）**。
    max_rate_mm_per_min: 900.0
    # ⚠ 这个值只是"上电初值"，**永远不影响实际运动**：
    #   DLL 每次下发运动前都执行 $axes/X/acceleration_mm_per_sec2=<平台「加减速度」>，
    #   覆盖它（FluidNCDeviceOperator.cpp:309-311）。
    #   ⇒ 想改加速度要改**平台侧**，且看该指令的 ishide：
    #     · ishide=0（如「相对定位运动（自定义参数）」）→ 改**指令面板里的「加减速度」输入框**
    #     · ishide=1（如「相对定位运动（默认参数）」/回零/预设）→ 改**全局参数区「加减速度」**
    #     两处上限都是 15 mm/s²。改本文件 100% 无效。
    acceleration_mm_per_sec2: 100.0
    # ★★ 软限位区间由 FluidNC 按下面规则算（Machine/Limit.cpp limitsMaxPosition/MinPosition）：
    #     positive_direction: true  ⇒ 允许区间 = [mpos_mm - max_travel_mm, mpos_mm]
    #     positive_direction: false ⇒ 允许区间 = [mpos_mm, mpos_mm + max_travel_mm]
    #   注意**整个区间是锚在 homing/mpos_mm 上的**：
    #     没有 homing 段时 mpos 恒为 0 ⇒ 区间退化成 [-max_travel_mm, 0]
    #     ⇒ 正向限位永远是 0、负向限位 = -max_travel_mm。这正是之前"正向设多少都没用"的根因。
    #   ★ 本机取 positive_direction: false —— 这是【不改 DLL 也能正确】的关键：
    #     DLL 下发 OpenSoftwareLimit 时会发
    #         $axes/x/max_travel_mm = pos - neg
    #         $axes/x/homing/mpos_mm = neg          ← 注意 DLL 传的锚点是 neg
    #     （FluidNCDeviceOperator.cpp::OpenSoftwareLimit → FluidNC_Impl.cpp::setSoftLimitRange）
    #     · 若 positive_direction = true ：区间 = [mpos-maxTravel, mpos] = [2*neg-pos, neg]  ❌
    #     · 取 positive_direction = false：区间 = [mpos, mpos+maxTravel]
    #                                          = [neg, neg+(pos-neg)] = **[neg, pos]**  ✅
    #     ⇒ 与平台「负向软限位 / 正向软限位」的字面语义精确一致。
    #   ⚠ 将来若把 DLL 锚点由 neg 改成 pos（见整合指南 §9.3 方案乙），本项必须同时改回 true。
    #     这两个必须匹配，否则区间会整体错位。
    #   ★ 本项在无回零动作时的唯一功能影响就是软限位区间朝向；其余引用处
    #     （回零动作方向 Cartesian.cpp / $23 位 Axes.cpp / "限位开关不支持该方向"警告 Axis.cpp）
    #     在没有回零动作、没有限位开关的本机上都不产生实际影响。
    max_travel_mm: 30.0
    soft_limits: true
    # ★★ 必须有 homing 段：否则 $axes/x/homing/mpos_mm 这个设置项根本不存在，
    #    运行时写入会静默失败（DLL 侧原先还丢弃了返回值），锚点只能是 0。
    #    cycle: -1 = set_mpos_only —— 只提供 mpos 锚点：不注册回零轴、不做任何回零动作，
    #    没有限位开关也能用。
    homing:
      cycle: -1
      positive_direction: false
      mpos_mm: -10.0
    motor0:
      stepstick:
        step_pin: i2so.1
        direction_pin: i2so.2
start:
  must_home: false
  check_limits: true
arc_tolerance_mm: 0.002
junction_deviation_mm: 0.01
verbose_errors: true
report_inches: false
use_line_numbers: false
planner_blocks: 16

i2so:
  bck_pin: gpio.16
  data_pin: gpio.21
  ws_pin: gpio.17
