Auto-leveling accuracy w/ BLTouch

I've been browsing the forum looking for a thread with similar symptoms to my own, but haven't seen anything discussed thus far.

I have a Wanhao i3 v2.1 that I've done a fair bit of modifications to. Most notably it's been upgraded to a RAMPS 1.4 controller, TMC2100 stepper drivers, and a BlTouch Z-Probe. I've also moved the Z-endstop so that the printer homes to X,Y-min and Z-max. I'm using Repetier-Server v0.83 as my host, and Repetier-Firmware v1.0dev as my firmware.

I've been following the Z-Probing guide located here:

As far as I can tell, everything is "working" correctly. I have carefully set my Z-Probe height and offsets. I am using a 5x5 grid for bed_leveling_method, and a 7x7 grid for distortion_correction_points. My bed_correction_method = 0. When I issue a G32 S2 command the probe measures the 25 points as expected, and then the console reports "Autoleveling enabled". Then I issue a G33, it measures the appropriate 41 points, and reports Distortion Correction Enabled. All measurements are performed with the bed and nozzle heated to printing temperatures. 

My problem is that this whole process doesn't seem to have any effect! I seem to have a slight 1mm high crown in my print bed, where the edges are a bit lower than the centre. Even after auto leveling and enabling distortion correction, my extruder is 1mm or more above the bed at the edges, and it presses into the bed in the centre. When I start a print with a .1mm first layer, that's about 60mm wide, the left side of the print has adhesion problems, and the right side is pressed into the glass firmly enough that it takes 2 or 3 layers before there is enough clearance for the PLA to start extruding.

Also, just to note, I'm aware that modifications to configuration.h doesn't modify EEPROM-stored parameters unless you change the value of EEPROM_MODE, so things like probe height and P1,P2,P3 X/Y coordinates I've been updating directly in the EEPROM using repetier-server.

What am I doing wrong? Can Z-Probing really not compensate for a 1mm crown? Am I doing something out of order? Would it be helpful for me to provide you with my configuration.h?

Your advise would be greatly appreciated.



  • First make sure to use dev branch since G33 for cartesian has some flaws in 0.92 preventing correct moves.

    Then you must be aware that it only covers the area where you measured with probe. If the crown is outside it will be neglected since printer does not know about it.

    G33 reduces correction over height so make sure it corrects high enough.

    G32 returns a rotation matrix after measuring, so you see if it has any effect for your bed or is already level. Then only z is corrected to average height.

    My guess is not using dev, right?
  • Thanks for reviewing this for me!

    I did mention in my previous message that I am actually using 1.0dev. It was a long message though, you might have missed it ;) Originally I was using the checkin from April 19th. Last night I did a repo pull just to be sure I had the latest, but it doesn't seem to have made a difference.

    The crown is definitely within the area that I'm probing. My 3 points are P1:20,55; P2:180,55; P3:20,190. My minimum Y probe point is 55 because I have the z-probe attached to the X-axis carriage bearing, so I can't completely reach the front of the build surface. Even considering that, the crown is basically in the centre of the build surface, well within that grid.

    I expect to get about 5 layers of full distortion correction before it starts to degrade. Slicer layer height is 0.1mm, DISTORTION_END_HEIGHT is set to 1, and DISTORTION_START_DEGRADE is set to 0.5. However, I have been watching the Z-axis steppers while the first few layers are printing, and I don't see them moving at all.

    Both G32 and G33 return the expected output. Based on what I understand from reading your "Z-probing with repetier" guide, and some online research, the G32 rotation matrix seems to have calculated a slight correction. Certainly, after the command has completed the printer updates its Z-height to a slightly different value which seems to be the average of the measured points. (e.g. 126.33mm instead of the pre-configured 125mm). I'm not currently in front of my printer, but when I'm home this evening I can run both commands and provide you with the output, if that would be helpful.


  • Yes, I have missed the 1.0 part.
    G33 L0
    returns the stored correction matrix so you see if it mimics what you expected to be stored.

    What I did for testing was setting 100% correction to 10mm and added 5mm bump by hand (G33 X<pos> Y<pos> Z5) and then at Z=5 i moved over that spot to see it move up/down. I do this because correcting in wrong direction would damage bed so better start higher with correction enabled there and use values I see easily.
  • Hm. I think we might have found something here. I did the test you suggested where I used G33 X100 Y100 Z5 and changed distortion start/end heights to 5/10mm, just to test the compensation. When I moved to X10,Y100, and then jogged the extruder left and right across the print bed, there was definitely significant Z compensation, so that's good. However, I also heard significant binding of the Z-axis screw rods, and after jogging left and right a number of times the extruder would begin to hit the bed when beyond the 5mm "bump". It seemed pretty clear that the Z-axis was missing some steps when trying to raise, but not when trying to lower. Strange, since there is no binding and no loss of height when traveling or when homing under normal circumstances.

    After digging into it, I think it's a problem with my setting for Z-Axis max acceleration. As I mentioned, this Wanhao i3 has been upgraded quite a bit. When I replaced the original Melzi board with a RAMPS 1.4, I set most of the acceleration, jerk, and feedrate values the same as the stock Melzi settings since I wasn't replacing the steppers. HOWEVER, one of the things I also changed was I replaced the 4988 stock drivers with TMC2100s. If you're not familiar, these things take as input the same 1/16 microstepping input as the 4988s, so the steps/mm configuration in the firmware is the same. However they internally interpolate from 1/16 to 1/256 on the motor output. It makes for VERY smooth and quiet operation. However, I suspect it also significantly reduces the torque of the motor!! I changed the Z-Axis max acceleration in the EEPROM from the stock setting of 100mm/s/s to 60mm/s/s and I don't hear any more binding on the Z-Axis when jogging back and forth across my 5mm "test bump".

    I'm going to re-flash with my normal distortion correction settings, re auto-level and remeasure the distortion map, and see how things are behaving. I'll post an update tomorrow.


  • Sorry for the delay; busy weekend. I've had a chance today to continue playing. Unfortunately, I'm still not quite there, though accuracy seems a little better...

    I adjusted accelerations as I mentioned above, and then I redid the z-probe height calibration procedure you discuss in your "Z-Probing with Repetier" guide. Then I preheated bed and extruder, issued a G32 S2 command, home all once complete, then a G33 command. Even after all that, when I attempt to print a part with a layer height of 0.1mm, the right side of the bed seems to be pretty accurately leveled, but the left side of the bed (especially in the back, Y>~90mm) is about half a mm too high, which obviously causes layer adhesion problems.

    You can find the log of my most recent auto-leveling and distortion calibration, my current configuration.h file, and the table I used for calculating z-probe height here:

    Do you have any suggestions for how to proceed? Does anything look strange in the confg or logs?

    Appreciate all your assistance,

  • Hi,

    I'm experiencing simalar problems like you, also on DEV version.
    Region of the bed are pretty good levelled, other are to low or to high

    It is quite frustating ...

  • Your protocol shows no correctios > 0.1 so it will never correct 0.5mm and the question is more how can you get a 0.5mm error if there is no such deviation when measuring.

    One thing often seen is that a hot bed has different shape then cold, so it is important to measure under printing conditions if that is the case for you.
  • I always perform auto-level and distortion measuring with the bed heated to 70 degrees, and the extruder at 205 degrees. These are the temperatures that I intend to print under normal circumstances w/ PLA.

    Even cold, I know there's >0.1mm of distortion on my bed, so I'm scratching my head as to why the distortion measurement isn't picking it up.

    Perhaps it's a problem of reproducibility? I'm using a BLTouch as a Z-probe. I have no reason to suspect that it's inaccurate, but do you have any thoughts regarding their use? As a test, I could heat up the bed and run (say) 3 distortion measurements in a row and we could compare the results of each. Ideally, each distortion correction map would be exactly the same. Or maybe the problem is something like the depth at which the probe triggers varies a little bit? As I mentioned above, I've used your recommended procedure for calibrating the Z-probe, so I expect it's as accurate as I can make it...
  • So I heated up my bed and extruder this evening and did 4 sequential distortion measurements, one right after the other. I don't know... there's more variation in the successive correction matrices than I would have expected. Clearly that's not in mm. What are those values, steps? What do you think? Is that deviation within what you would consider a normal margin of error?

    (the text files "sequential measurements x of 4.txt" are the console logs I'm referring to)


  • Precision is ok I think. Matrix are z steps. You also see that there is a stripe going down in the middle but not as same x positions.
  • Fair enough. I plotted the correction matrices in a surface chart and the results do look pretty consistent, so that's good, and I'm learning lots.

    Having said that, I don't really know where to go from here. I still can't reliably print, what with my first layer being half a mm up in the air. Do you have any suggestions as to how I can proceed? Since we've determined that distortion correction seems accurate, is there maybe a problem with the way distortion correction is interacting with auto-leveling? Honestly, assuming you have a print surface without an extreme tilt to it, I'm not really sure what auto-levelling accomplishes that couldn't be corrected for with distortion correction.

    Can you give me any more direction regarding next troubleshooting steps I could take?

  • All G33 errors are < 0.1mm so turn it off and check if you still get 0.5mm error. Then you know it does not come from G33. Also what I du is, is I print first layer 0.3mm to equalize small problems. That should work already with autoleveling and your precision.

    With only autolevel make sure z moves up down according tilt. a and b are tilt for x and y direction so a = 0.007 means over 200mm it will change z for 200*0.007 = 1.4mm.

    When G32 works continue with G33 but set full correction to 30mm and max. correction also accordingly. With it enabled go to Z=10 and test G30 at several points. Since correction is enabled it should be pretty precise since we have corrections set for that z height it is included. G30 will also show how much z correction got used at that point. This is the same as height map with host. I'm just only a bit unsure about double correction since we are in correction height when we start, so that might need to get subtracted once from output.

    With deltas there is another problem that also causes extra error/distance. Geometric errors can cause the extruder head to change direction a few ° and that causes also some extra gap that no z probe will measure, also eventually the z probe does the same rotation being fixed on the same platform. So that would equalize the measured error with reality more or less.
  • I turned off G33, and I still see the front left of the build surface (i.e. X and Y both lower than ~75mm) raise about 0.5mm higher than the rest of the plate. So this doesn't seem to be introduced by G33, although I would have hoped that G33 would be able to compensate for it. Is this potentially caused by something in my auto-leveling configuration? You'll notice from my configuration (linked above) that I've got software leveling enabled, and I'm measuring a 5x5 grid instead of a simpler P1/P2/P3 method. Since auto-leveling simply calculates the average plane that most closely matches all 25 of the measured points, maybe something about the averaging is causing the surface to skew unnaturally high in one corner? I don't know, I'm sort of stretching here.

    Your recommendation regarding an extra thick first layer was a good one though, at least until I figure out this leveling/distortion problem. I've set up a multi-process profile in Simplyfy3D with the first layer being 0.3mm thick, and a second process at 0.1mm for layers above 0.3mm. It's not ideal, but at least I can resume printing.
  • You only say front for x <75 has problems, so I assume the rest of the bed is working fine. Since you get a plane and if rotation swould be bad, you would get too close in the right back. So I think that the the bed has some beding in the left front. Using a ruler and some light from behind it is easy to see where you have bumps/bending on the bed.

    Since you have ALWAYS_CHECK_ENDSTOPS 0 (i hope) the z probe should not interfere here when using G33, so I would normally also expect it to correct bending at least in the range where it had measurememnt points.
  • OK, that makes sense. An incorrect rotation would cause a corresponding reduction in the back right of the bed. Nevertheless, small (~0.5mm) imperfections in the bed like this are exactly why I went through the effort of installing a z-probe on my printer. I wanted to be able to compensate for them without pulling my hair out using sheets of paper and thumb screws. Forget about my specific printer for a moment. In general, would you expect G33 to be able to compensate for imperfections in the print surface of around 0.5mm?

    No, I just checked my configuration (linked above) and ALWAYS_CHECK_ENDSTOPS = 1. I didn't see any reference to this parameter in your Auto-leveling guide that I was following. Why would I want to disable this? It sounds risky... what impact would it have on G33, given that I home to Z-Max, not Z-Min?
  • If you home z max you can leave it on. Problem is for those using z probe as z min so they have M119 report z min. Then triggering of probe prevents moves down whcih could have been the reason G33 did not go down here.

    Normally 0.5mm correction is no problem as long as the part is inside measured distortion correction area. You should see 0.5mm then with G33 L0 output at these coordinates. If not you can set them manually
    G33 X<pos> Y<pos> Z<correction>
    Also I would then wonder why printing gets an other offset as the z probe also this might happen with hardware related errors where the xy offset is enough for the error. Anyhow try manually correcting the area and check if it gets closer then.
Sign In or Register to comment.