Eddy probe - multiple calibration support

Basic Information:

Printer Model: Sovol SV08
MCU / Printerboard: Stock
Host / SBC: Stock
No logs because this isn’t a bug, just question / thought starter.

I discovered that after a long period without upgrading, moving up to the current version of Klipper this past weekend broke my old eddy-ng setup (BTT Eddy Duo). I was able to get the probe working again with tap zeroing with my normal build plate and print conditions, but I was curious because I couldn’t find one feature that I really liked in eddy-ng that I haven’t seen documented anywhere in mainline Klipper.

For whatever reason, I saw some pretty wide variations in workable drive current settings depending on the build plate I use and the temperature of the probe at the start of a print (most dramatically going from PLA at 50C to ABS/ASA at 100C bed temps - so the eddy probe was being put into use anywhere from ~40C to ~80C). In the eddy-ng world, I was able to store calibrations for drive currents of 16/17/18 and then automatically select the right one for the temperature / build plate combo with a macro:

[gcode_macro EDDY_TEMPERATURE_PROBE]
description: 
gcode:
  {% if printer['temperature_sensor btt_eddy'].temperature|float > 75 %}
    SET_DISPLAY_TEXT MSG="Tapping DC: 18"
    PROBE_EDDY_NG_TAP DRIVE_CURRENT=18
  {% else %}
    SET_DISPLAY_TEXT MSG="Tapping DC: 17"
    PROBE_EDDY_NG_TAP DRIVE_CURRENT=17
  {% endif %}

Does this sort of multi-calibration capability exist in the stock implementation? Or other ways that people have handled this?

Does this sort of multi-calibration capability exist in the stock implementation? Or other ways that people have handled this?

Support for several drive currents does not make practical sense
(and it affects scan output, so it will multiply the configuration invariants too much for too low value).

Basically, we only care about the noise output of PROBE_EDDY_CURRENT_CALIBRATE.
Higher temperature - increases noise.
Higher distance - decrease resolution/increase noise.

It describes how well a probe will work, and allows for more or less unbiased comparison between probes.

With reg_drv_current, it is complicated, as too high a value may increase noise, and too low, too.
In practice, you can do N+1 (or +2) from the calibrated value and compare the noise/total resolution range.
If it is better, then it makes sense to use it (instead of calibrated one).

The only practical things that I can say can make sense, but I don’t see a good way to implement that, is to store several “scan” curves for different build plates.
In an ideal world, with ideal metal sheets, they will be identical; in practice, there can be differences.
But right now it is not documented anywhere (AFAIK), so no one know how large it is in practice.

I would expect that generally, another plate can shift/resize, mapping a little.
For example, high/low 4 … 0.05mm will shift by N mm.
Or the frequency range can alter, and will be smaller/larger (and by so, mapping will not be linear anymore).

Hope that explains something,
-Timofey

Fair, and thanks for the quick feedback! That particular combination was what ended up working well for me on eddy-ng, which is why I figured I’d raise the question, since my first round of searching didn’t yield too much. I haven’t gone too deep into the source to see what’s different between your implementation and Vlad’s to see how much of a factor this would be. Before tap homing was implemented one of my plates was so problematic I couldn’t use it for a while with an eddy probe, so I definitely have at least one non-ideal sheet. I’m going to see how far off it is tonight, hopefully. Nothing beats real data.

What I used to find was that (at least with Vlad’s code) 17 was closest to “one size fits all”. It was just marginal enough around the edges that I needed to flex to 16 for low temperatures and 18 for very high temperatures.

eddy-ng just stored multiple drive current calibrations in the SAVE_CONFIG zone:

#*# [probe_eddy_ng btt_eddy]
#*# calibrated_drive_currents = 16, 17, 18
#*# calibration_version = 5
#*# reg_drive_current = 16
#*# tap_drive_current = 16
#*# calibration_16 = gASVyw...
#*# calibration_17 = gASV6g...
#*# calibration_18 = gASV3r...

In theory, it could also be done like having multiple skew correction profiles for different materials.

And the good news thus far - the problem plate (which is thicker steel plus thick PEI layer) worked fine without heating (which it couldn’t do before at the same cal as my normal plate), and on my normal plate (Cryogrip Glacier) I got up to 100c on the plate and the eddy mcu at 70 and everything’s working. So I may be looking at a non-issue. :+1: