First Layer Not Uniform Across the Print Bed – Need Help!

Hi everyone,

I’m having an issue with my first layer not being consistent across the entire print bed. In some areas, it looks too squished, while in others, it seems too far from the bed, leading to poor adhesion. I’ve already tried the following:

  • Bed leveling (both manually and with the printer’s auto-leveling, if available)
  • Z-offset adjustment (tweaked it multiple times)
  • Cleaning the bed (using isopropyl alcohol to remove any residue)
  • Checking for warped bed (seems fine, but not 100% sure)

Despite these efforts, I still get uneven results. Has anyone encountered a similar issue? Could it be related to the bed surface, the probe accuracy, or something else I might be missing?

I’d really appreciate any advice or troubleshooting steps you recommend.

Thanks in advance!



Hi,
Don’t care the mesh. Everyone have a similar picture.
Your calibration print is not very visible.
Did you try to make a real print ?

Yes, I tried to make real print, that’s why I realized that the bed was not right.
Basically in the upper right part of the bed it squashes the layer and in the rest it seems to do it right.
I don’t know if using klipper’s screws_tilt_adjust could help me with this problem.

I’m really new in Klipper.
So I can’t tell you if you’re right.
I suggest you wait for another advice.
BR

1 Like

The SV06 ACE uses adaptive bedmesh leveling. The cutout changes with each print. In addition, the deviation shown is relatively small. There are significantly worse examples. The printer evens out these unevennesses in the lower part of the prints. That’s how it should be.

Yes, I know it uses adaptive bedmesh, in fact I have KAMP configured for it instead of using the native script.
But when doing an Ellis calibration print (First Layer Squish | Ellis’ Print Tuning Guide) the first layer is inconsistent, and I can’t find a solution for it.

This is fortunate timing. I printed a full-bed first layer (220x220x0.25 mm) last night as a test, and it’s definitely not consistent across the bed. Some areas are perfectly smooth, but others are rough and bumpy, indicating that the nozzle was slightly too low. The inconsistent areas are spread throughout the bed and not just near the edges (which would be more expected).

I don’t consider this a super serious issue at this time, as the inconsistent first layer errs on the side of “nozzle too low”, and it’s not enough to cause adhesion issues that I’ve noticed. However, I would of course like a better result if possible. :slight_smile:

@tverdyy, what does your probe repeatability look like? To test this, heat up the nozzle to your usual probing temp (Sovol’s default config uses 130c), home the printer, and run PROBE_ACCURACY in the Mailsail console.

My SV06 ACE probe has a range of 0.024 and a standard deviation of 0.008. This is within the usable range specified in the Klipper docs, but only just barely. (“If the results of the test show a range value that is greater than 25 microns (.025mm) then the probe does not have sufficient accuracy for typical bed leveling procedures.”)

For comparison, my old Ender 3 + CR Touch reports a standard deviation of 0.002 in Marlin’s probe repeatability test. Obviously the probe hardware is quite different, and a loadcell-based probe may not be quite as accurate, but I am wondering if this is the cause of our slightly inconsistent first layers.

It seems like other printers with loadcell probes have various calibration routines (K1, MK4S). Perhaps something similar could be done for the Sovol loadcell too?

Though… this is where my knowledge runs out. :slight_smile: If I understand correctly, Sovol’s loadcell (HX711) isn’t supported for nozzle probing in mainline Klipper yet, so I’m not sure what calibration options exist, if any. (It does look like they released the relevant code in their open-source repo, so hopefully this can be integrated into upstream Klipper someday.)

Thanks for your response!

As you mentioned, this isn’t a major issue, but it can be quite annoying in certain prints, especially when trying to achieve a specific first-layer finish. For example, if using a textured print bed with a carbon fiber pattern, the inconsistency becomes more noticeable.

Regarding the probe accuracy test, I ran it at 150°C, and my results were:

Metric Value
Maximum -0.044375
Minimum -0.181875
Range 0.137500
Average -0.146250
Median -0.156875
Standard Deviation 0.038719

As you can see, my deviation is much higher compared to yours, which might explain why I’m seeing more variation across the bed.

About the HX711 sensor you mentioned, I noticed that there is an implementation for it in Klipper’s mainline, but I haven’t dared to try it yet since it seems to be missing some parameters. Here’s the repo I found:
:link: Klipper HX711 Implementation

In conclusion, I’m starting to wonder if this sensor is even reliable enough for achieving a consistently good first layer. Maybe it would be worth switching to something like Klicky, Beacon, or a similar probe instead of using the stock one. What do you think?

Ah, yeah, range of 0.138 and deviation of 0.039 seem like they’d cause you a number of issues. For reference, here’s my latest run (130c nozzle and 60c bed, probing in the center after having run a Z_TILT_ADJUST just to make sure a skewed gantry doesn’t lead to inconsistent Z axis movement):

PROBE_ACCURACY at X:110.000 Y:110.000 Z:10.000 (samples=10 retract=2.000 speed=3.0 lift_speed=3.0)
probe at 110.000,110.000 is z=-0.185000
probe at 110.000,110.000 is z=-0.201250
probe at 110.000,110.000 is z=-0.193750
probe at 110.000,110.000 is z=-0.188750
probe at 110.000,110.000 is z=-0.187500
probe at 110.000,110.000 is z=-0.185000
probe at 110.000,110.000 is z=-0.207500
probe at 110.000,110.000 is z=-0.202500
probe at 110.000,110.000 is z=-0.202500
probe at 110.000,110.000 is z=-0.197500
probe accuracy results: maximum -0.185000, minimum -0.207500, range 0.022500, average -0.195125, median -0.195625, standard deviation 0.007815

So that time I got a range of 0.023 and deviation of 0.008. That’s still not as good as I’d like, but good enough to be usable.

I’m not sure why your probe seems to be significantly less accurate. It would be good to gather data from more folks to get an idea how widespread the problem is.

Just checking, but have you ruled out any mechanical issues like loose bed screws (accessible via the cutouts of the magnet on the heated bed) or wobbly extruder mount? Anything that leads to the bed or extruder deflecting when the nozzle taps the bed will probably throw the process out of whack.

As for using a separate probe… I really like the idea of a nozzle probe, to be honest. Not needing to mess with the Z offset when changing nozzles, etc. is nice. So I’m hopeful that Sovol + the community can find a way to improve the accuracy of the existing hardware. :crossed_fingers:

Edit: Interestingly, probing slower (1 mm/s instead of the default 3 mm/s) gives me a much more consistent result, but it also results in a lower probed distance:

probe accuracy results: maximum -0.165000, minimum -0.175000, range 0.010000, average -0.168875, median -0.168125, standard deviation 0.003555

Presumably the force at which the probe hits the bed affects the trigger point, with a higher speed pressing into the bed more before triggering. So there might be something to this—I can live with slower bed meshes if they are more accurate—but it would take more investigation to adjust the Z offset for a slower config.

Thanks for the detailed response!

I ran a couple of PROBE_ACCURACY tests under different conditions. Here are my results:


Default Calibration (Nozzle 150°C, Bed 50°C, Speed 3 mm/s)

Results:

  • Maximum: -0.110625
  • Minimum: -0.151875
  • Range: 0.041250
  • Average: -0.131875
  • Median: -0.132500
  • Standard Deviation: 0.010680

Probe Readings:
-0.1256, -0.1406, -0.1256, -0.1393, -0.1243, -0.1356, -0.1306, -0.1518, -0.1343, -0.1106


Slow Calibration (Nozzle 150°C, Bed 50°C, Speed 1 mm/s)

Results:

  • Maximum: -0.049375
  • Minimum: -0.094375
  • Range: 0.045000
  • Average: -0.079875
  • Median: -0.083125
  • Standard Deviation: 0.012390

Probe Readings:
-0.0943, -0.0893, -0.0893, -0.0831, -0.0818, -0.0856, -0.0831, -0.0731, -0.0693, -0.0493


Observations

  • Probing slower doesn’t seem to make a huge difference. The range improved slightly, but the standard deviation actually got worse. This suggests that the sensor may have inherent accuracy issues regardless of speed.
  • I have checked all screws and mounts on both the hotend and the bed. There’s no noticeable wobble or looseness, yet the probe readings remain inconsistent.

Possible Next Steps

  1. Test at different temperatures – The probe might behave differently at, say, Sovol’s default 130°C vs 150°C.
  2. Increase sample size in PROBE_ACCURACY – More data could help identify trends or filter out inconsistencies.
  3. Re-check gantry alignment – Even after Z_TILT_ADJUST, there could still be minor skew affecting results.
  4. Consider switching probes – If the built-in sensor is inherently unreliable, I might try something like Klicky or Beacon.

Would love to hear your thoughts, anyone else seeing similar inconsistencies?

I’m not an electronics specialist! I don’t know how the sensor is connected in the Klipper. Nevertheless, I believe that the fluctuations in the measurement result have only a minimal influence on the result. Why? Only a significant change in the measurement value is needed to detect the nozzle touching the print bed. The measurement value itself is irrelevant. Contamination on the nozzle and on the print bed has a much greater impact.

I reviewed Sovol’s custom implementation and noticed that they have a filtering variable (Lv_Bo) in the debug method (cmd_WEIGHTING_DEBUG_QUERY), but it is not used in the main measurement flow. This could be affecting the consistency of the readings.

####################################################
# Sensitivity(灵敏度): 0.9mV/V ± 0.2mV
# Excitation_voltage(激励电压): 5V
# Range(量程) = Sensitivity * Excitation_voltage = 4.5mV
# senser_rang(重量) = 10KG
# 实际测量:1.5mV
# 读取测量:2.0mV
####################################################
cb = self.chip.query_hx711_read_data.send([self.chip.oid, 0, 0])

Lv_Bo = 0.02  # 滤波系数 小于1

# Get HX711 ADC value.
d = cb['data']

hx711_data = (d[0] & 0xff) | (d[1] & 0xff) << 8 | (
    d[2] & 0xff) << 16 | (d[3] & 0xff) << 24

hx711_data_out = hx711_data

if hx711_data_out < 100:
    gcmd.respond_info("HX711_Info:Data error!")
else:
    weight_mg = hx711_data_out * (0.5 * 4.28 / 128) / (8388607)

    if not hasattr(self, 'last_val'):
        self.last_val = weight_mg

    filtered_weight_mg = self.last_val * \
        (1 - Lv_Bo) + weight_mg * Lv_Bo
    self.last_val = filtered_weight_mg

    gcmd.respond_info("HX711_Info: %d/0x%x(origin) / %.6f(ENOB) / %.6f(filtered)" %
                        (hx711_data_out, hx711_data_out, weight_mg, filtered_weight_mg))

    gcmd.respond_info("HX711: Raw value: %.6f, Filtered value: %.6f" % (
        weight_mg, filtered_weight_mg))

cmd_WEIGHTING_DEBUG_QUERY_help = "Obtain HX711 measurement values"

To verify this, I modified the code to print both raw and filtered values, and here are the results:

HX711: Raw value: 0.018538, Filtered value: 0.001439
HX711_Info: 9301432/0x8dedb8(origin) / 0.018538(ENOB) / 0.001439(filtered)

This suggests that the filter significantly smooths the measurements, which could improve stability. However, since it’s not applied in the main measurement process, the values may fluctuate more than expected.

A possible solution would be to apply this filtering in the primary measurement loop rather than only in the debug function. Has anyone else noticed this or tested something similar?