Sovol's Eddy hardware info

Discord topic

So, it seems to be similar to the BTT Eddy coil, it is pure LDC1612 + Coil board.
Reference frequency is 12MHz.
Coil frequency according to dumps is ~8 385 484 Hz = 8.3 MHz
Coil size seems to be: 9.3mm x 5.5mm

Because 8.3MHz is way out of spec, it will require some Python side hacks at least.
Or, maybe not:

12_000_000 / (1 << 28) = 0.0447
8_385_484 / 0.0447 = 187580101
hex(187580101) = '0xb2e3ec5' # is < 0x03ffffff

Some reference configs:

[probe_eddy_current my_eddy_probe]
reg_drive_current: 20

PCB photos



Calibration output with the current master F_IN_DIV = 2:

Frequency too noisy at step 1.810 -> 1.850
Frequency diff: 532.425, MAD_Hz: 244.914 -> MAD_Hz: 13.805
probe_eddy_current: noise 0.005354mm, MAD_Hz=115.202 in 1124 queries
Total frequency range: 39014.937 Hz
z_offset: 0.290 # noise 0.002908mm, MAD_Hz=90.512
z_offset: 0.530 # noise 0.003289mm, MAD_Hz=86.677
z_offset: 1.010 # noise 0.002055mm, MAD_Hz=49.632
The SAVE_CONFIG command will update the printer config file
and restart the printer.

With F_IN_DIV=4:

probe_eddy_current: noise 0.001774mm, MAD_Hz=21.036 in 2524 queries
Total frequency range: 59393.613 Hz
z_offset: 0.290 # noise 0.001932mm, MAD_Hz=59.151
z_offset: 0.530 # noise 0.001084mm, MAD_Hz=29.046
z_offset: 1.010 # noise 0.001801mm, MAD_Hz=38.516
z_offset: 2.010 # noise 0.001123mm, MAD_Hz=14.677
z_offset: 3.010 # noise 0.000231mm, MAD_Hz=1.931
The SAVE_CONFIG command will update the printer config file
and restart the printer.
Old Hack

So, hack for now is to change the value here: klipper/klippy/extras/ldc1612.py at master · Klipper3d/klipper · GitHub

- self.sensor_div = 1 if self.clock_freq != DEFAULT_LDC1612_FREQ else 2
+ self.sensor_div = 1 if self.clock_freq != DEFAULT_LDC1612_FREQ else 4

Hack is no longer required after v0.13.0-650-gca8230d50.

With F_IN_DIV=4 and reg_drive_current=21

probe_eddy_current: noise 0.001730mm, MAD_Hz=28.248 in 2524 queries
Total frequency range: 71648.040 Hz
z_offset: 0.290 # noise 0.002046mm, MAD_Hz=77.419
z_offset: 0.530 # noise 0.001592mm, MAD_Hz=55.797
z_offset: 1.010 # noise 0.003279mm, MAD_Hz=82.519
z_offset: 2.010 # noise 0.000826mm, MAD_Hz=11.995
z_offset: 3.010 # noise 0.003684mm, MAD_Hz=38.474
The SAVE_CONFIG command will update the printer config file
and restart the printer.

-Timofey

1 Like

Hey Timofey, thanks again for all the help!

With F_IN_DIV=4 and reg_drive_current=22

probe_eddy_current: noise 0.001387mm, MAD_Hz=28.688 in 2525 queries
Total frequency range: 87791.762 Hz
z_offset: 0.290 # noise 0.001456mm, MAD_Hz=69.981
z_offset: 0.530 # noise 0.000158mm, MAD_Hz=6.995
z_offset: 1.010 # noise 0.000772mm, MAD_Hz=23.503
z_offset: 2.010 # noise 0.001014mm, MAD_Hz=19.484
z_offset: 3.010 # noise 0.001115mm, MAD_Hz=13.904
The SAVE_CONFIG command will update the printer config file
and restart the printer.

Note that for reg_drive_current=21 and reg_drive_current=22 I had the bed at 60C during PROBE_EDDY_CURRENT_CALIBRATE

1 Like

Adding my config to this thread in case anyone else is looking to get their official Sovol eddy probe working with Klipper’s implementation of tap.

Note, to get any of this working correctly, you need to manually change this:

from else 2 to else 4

Follow Eddy Current Inductive probe - Klipper documentation
Note, skip LDC_CALIBRATE_DRIVE_CURRENT CHIP=my_eddy_probe, we manually set reg_drive_current: 22

  1. Only implement [probe_eddy_current my_eddy_probe] from my config below for now
  2. Home your toolhead (it will do X and Y, but not Z), then issue SET_KINEMATIC_POSITION X=177.50 Y=177.5 Z=8 so you are able to run the next command. My values are the centre of my bed, adjust to yours if necessary. It may be necessary to add my homing_override config, but replace SET_Z_FROM_PROBE METHOD=tap with SET_Z_FROM_PROBEfor now
  3. Run PROBE_EDDY_CURRENT_CALIBRATE CHIP=my_eddy_probe, note the name of your CHIP if it’s different. Then after it completes, SAVE_CONFIG
  4. You should be able to home now
  5. For setting up tap, note the MAD_Hz value for z_offset: 0.290 in the output of the above command. This gives you a great initial starting point for tap_threshold. You may still need to adjust/play around with this. Test with PROBE METHOD=tapand PROBE_ACCURACY METHOD=tapas outlined in the Tap configuration section of the guide
  6. You should be able to implement the rest of my config from below at this point
  7. In my START_PRINT macro, I added the following:
    -SET_Z_FROM_PROBE METHOD=tap after QGL, nozzle clean and nozzle at 150C
    -then, bed mesh commands updated to use the macros as below:
    SET_SCAN_FROM_TAP
    # For best results should match the previous command “scan” height
    {% set scan_height = printer.configfile.settings[“probe_eddy_current my_eddy_probe”].z_offset %}
    BED_MESH_CALIBRATE ADAPTIVE=1 METHOD=scan HORIZONTAL_MOVE_Z={scan_height}

My sovol-eddy.cfg:

[probe_eddy_current my_eddy_probe]
sensor_type: ldc1612
#   The sensor chip used to perform eddy current measurements. This
#   parameter must be provided and must be set to ldc1612.
#frequency:
#   The external crystal frequency (in Hz) of the LDC1612 chip.
#   The default is 12000000.
#intb_pin:
#   MCU gpio pin connected to the ldc1612 sensor's INTB pin (if
#   available). The default is to not use the INTB pin.
z_offset: 0.5
#   The nominal distance (in mm) between the nozzle and bed that a
#   probing attempt should stop at. This parameter must be provided.
#i2c_address:
i2c_mcu: extra_mcu
#i2c_bus:
i2c_software_scl_pin: extra_mcu:PB6
i2c_software_sda_pin: extra_mcu:PB7
#i2c_speed:
#   The i2c settings for the sensor chip. See the "common I2C
#   settings" section for a description of the above parameters.
x_offset: -16.43
y_offset: 10.22
#speed:
#lift_speed:
samples: 5
#sample_retract_dist:
samples_result: average #median
samples_tolerance: 0.025
samples_tolerance_retries: 3
#   See the "probe" section for information on these parameters.
tap_threshold: 140 # use top value from line z_offset: 0.290 # noise 0.001456mm, MAD_Hz=69.981 multiplied by 2
#   Noise cutoff/stop trigger threshold delta Hz per sample
#   See the Eddy_Probe.md for explanation
reg_drive_current: 22 # manually set as cold bed is 20, 60C bed is 21, best results at 22

[bed_mesh]
speed: 250 #500
horizontal_move_z: 2
mesh_min: 18,18 # These min/max points are with the above linked Eddy mount on the stock toolhead.
mesh_max: 332,332
probe_count: 15,15 # 25,25 # Set to a lower 15,15 default as it appears a too high probe_count (too dense mesh) is bad with rapid_scan, see: https://www.klipper3d.org/Bed_Mesh.html#rapid-continuous-scanning
algorithm: bicubic
bicubic_tension: 0.5
split_delta_z: 0.0125 # see: https://www.klipper3d.org/Bed_Mesh.html#move-splitting
mesh_pps: 3,3
adaptive_margin: 5
fade_start: 1
fade_end: 10
fade_target: 0
#scan_overshoot: 5  #uncomment this section if you still have room left over on the X axis for some scan overshoot to product smoother movements and more accurate scanning. Uncommenting this should be fine if you are using a standard voron mount.

[homing_override]
gcode:
  # Move 5 up, just in case (this is our safety zhop, this needs 'set_position_z: 0' below)
  G91 ; set relative positioning
  G0 Z5 F1000 ; 5 up zhop
  {% if not rawparams or 'Y' in rawparams %}
    {action_respond_info('Homing Y')}
    G28 Y
    G90 ; set absolute positioning
    G0 Y177.5 F6000 ; return to center
    M400 ; Wait for move to finish
  {% endif %}
  {% if not rawparams or 'X' in rawparams %}
    {action_respond_info('Homing X')}
    G28 X
    G90 ; set absolute positioning
    G0 X177.5 F6000 ; return to center
    M400 ; Wait for move to finish
  {% endif %}
  {% if not rawparams or 'Z' in rawparams %}
    {action_respond_info('Homing Z')}
    G90 ; set absolute positioning
    G0 X177.5 Y177.5 F6000 ; return to center, please add your offsets manually if you want to
    G28 Z
    #G91 ; set relative positioning
    G0 Z10 F1000 ; 10mm zhop before probe
    G0 Z2 F1000
    M400
    SET_Z_FROM_PROBE METHOD=tap # no need for PROBE before this
    G0 Z5 F1000 ; 5mm up
    M400 ; Wait for move to finish
  {% endif %}
  G90 ; set absolute positioning
axes: xyz
set_position_z: 0 # This forces the z position to be at 0 when we start homing, so we can move the Z up before homing.

[gcode_macro _RELOAD_Z_OFFSET_FROM_PROBE]
gcode:
    {% set Z = printer.toolhead.position.z %}
    {% set tap_correction = -0.05 %} # manual, can adjust up or down as needed
    M118 Z adjust {Z} -> {Z - tap_correction - printer.probe.last_probe_position.z}
    SET_KINEMATIC_POSITION Z={Z - tap_correction - printer.probe.last_probe_position.z}

[gcode_macro SET_Z_FROM_PROBE]
gcode:
    {% set METHOD = params.METHOD | default("automatic") %}
    PROBE METHOD={METHOD}
    _RELOAD_Z_OFFSET_FROM_PROBE METHOD={METHOD}
    G0 Z5

[gcode_macro _ADJ_SCAN_FROM_TAP]
gcode:
    {% set OFFSET = printer.probe.last_probe_position.z %}
    # Not 100% sure about sign
    SET_GCODE_OFFSET Z={(-OFFSET)}

[gcode_macro SET_SCAN_FROM_TAP]
gcode:
    SET_Z_FROM_PROBE METHOD=tap
    # Move to the tap point
    {% set is_absolute = printer.gcode_move.absolute_coordinates %}
    G90
    {% set cf = printer.configfile.settings %}
    {% set eddy = cf["probe_eddy_current my_eddy_probe"] %}
    {% set amap = printer.gcode_move.axis_map %}
    {% set tpos = printer.gcode_move.position %}
    G0 Z5 F300 # Z-Hop
    G0 Y{tpos[amap["Y"]] - eddy.y_offset} X{tpos[amap["X"]] - eddy.x_offset} F3000
    G0 Z{eddy.z_offset} F300
    PROBE METHOD=scan
    _ADJ_SCAN_FROM_TAP
    {% if not is_absolute %}
    G91
    {% endif %}

Here is a better version of how to implement this, if anyone else would like to try:

please let me know if there are any issues, this was from memory, and of course as you know during testing things are done in all sorts of order