Files
linuxcnc-modbus/hal_configuration.md
2026-06-05 19:12:51 +02:00

5.1 KiB

LinuxCNC HAL Configuration for Vevor D100 VFD via mb2hal

This guide explains how to connect the HAL pins of LinuxCNC to the mb2hal component configured in vfd_d100.ini.

1. Required Components

To achieve correct speed scaling, rotation control, feedback conversion, and "at-speed" detection, we will load the following standard HAL components:

  • scale: Used twice.
    1. spindle_speed_scale: Converts commanded RPM (e.g., 24000 RPM) to Modbus frequency units (tenths of Hz, 400.0 Hz = 4000).
    2. spindle_feedback_scale: Converts actual speed from RPM (from VFD metrics) to RPS (Revolutions Per Second) required by LinuxCNC.
  • mux2: Used twice.
    1. spindle_dir_mux: Selects between 2.0 (Forward) and 4.0 (Reverse).
    2. spindle_run_mux: Selects between 8.0 (Stop) and the output of spindle_dir_mux.
  • near: Compares commanded speed and actual speed to assert spindle.0.at-speed.

2. Speed Scaling Calculations

The VFD expects the given frequency in tenths of Hz (e.g., 400.0 \text{ Hz} = 4000 in register 0201H). The motor has a maximum speed of 24000 \text{ RPM} at 400 \text{ Hz}.

  • Commanded Speed Gain:

    Gain = \frac{4000 \text{ (Modbus Units)}}{24000 \text{ (RPM)}} = \frac{1}{6} \approx 0.16666667
  • Feedback Speed Gain (RPM to RPS):

    Gain = \frac{1}{60} \approx 0.01666667

3. HAL Configuration Snippet

Add the following lines to your main .hal file (e.g. custom.hal or postgui.hal depending on your setup):

# =====================================================================
# Vevor D100 VFD Modbus (mb2hal) Integration
# =====================================================================

# Load the mb2hal component
loadusr -Wn vfd mb2hal config=vfd_d100.ini

# Load helper components
loadrt scale names=spindle_speed_scale,spindle_feedback_scale
loadrt mux2 names=spindle_dir_mux,spindle_run_mux
loadrt near names=spindle_at_speed_near

# Add helper components to the servo thread
addf spindle_speed_scale servo-thread
addf spindle_feedback_scale servo-thread
addf spindle_dir_mux servo-thread
addf spindle_run_mux servo-thread
addf spindle_at_speed_near servo-thread

# =====================================================================
# 1. Spindle Run & Direction Logic
# =====================================================================

# Direction Mux Input Values: 2.0 = Forward Run, 4.0 = Reverse Run
setp spindle_dir_mux.in0 2.0
setp spindle_dir_mux.in1 4.0

# Run Mux Input Values: 8.0 = Stop, in1 = value from direction mux
setp spindle_run_mux.in0 8.0

# Connect selection signals
net spindle-rev-sig      spindle.0.reverse        => spindle_dir_mux.sel
net spindle-dir-cmd      spindle_dir_mux.out      => spindle_run_mux.in1

net spindle-on-sig       spindle.0.on             => spindle_run_mux.sel
net spindle-run-cmd      spindle_run_mux.out      => vfd.control.00.float

# =====================================================================
# 2. Spindle Commanded Speed Scaling
# =====================================================================

# Gain = 4000 / 24000 = 0.16666667
setp spindle_speed_scale.gain 0.16666667
setp spindle_speed_scale.offset 0.0

# Connect signals
net spindle-speed-cmd    spindle.0.speed-out-abs  => spindle_speed_scale.in
net spindle-speed-scaled spindle_speed_scale.out  => vfd.speed.00.float

# =====================================================================
# 3. Spindle Speed Feedback (RPM to RPS)
# =====================================================================

# Gain = 1 / 60 = 0.01666667 (converts RPM to RPS)
setp spindle_feedback_scale.gain 0.01666667
setp spindle_feedback_scale.offset 0.0

# Connect signals
net spindle-rpm-feedback vfd.metrics.rpm.float    => spindle_feedback_scale.in
net spindle-rps-feedback spindle_feedback_scale.out => spindle.0.speed-in

# =====================================================================
# 4. Spindle "At Speed" Detection
# =====================================================================

# Configure allowable difference (e.g., within 5% or 300 RPM)
setp spindle_at_speed_near.difference 300.0
# We want the speed to be compared on the absolute commanded speed (RPM)
net spindle-speed-cmd     => spindle_at_speed_near.in1
net spindle-rpm-feedback  => spindle_at_speed_near.in2
net spindle-at-speed      spindle_at_speed_near.out => spindle.0.at-speed

4. Troubleshooting & Tuning Tips

Tip

Modbus Communication Stability If you experience CRC errors or timeouts when the spindle motor starts spinning, it is likely due to Electro-Magnetic Interference (EMI).

  • Ensure your RS485 twisted-pair cable is shielded, and the shield is grounded only at one end (usually at the VFD or controller side, not both).
  • Add a 120\ \Omega termination resistor across the RX+/TX+ and RX-/TX- terminals at the VFD if it's at the end of the bus.
  • If the VFD takes too long to process requests, you can increase SERIAL_DELAY_MS in vfd_d100.ini to 70 or 100.