I'm building a custom-designed coreXY printer with dual independent Z axis motors, and am currently running into an absolutely baffling problem with my bed leveling. I've been chasing this problem in circles for weeks, and I'm hoping that a few more knowledgeable sets of eyes might catch something I've missed.
In short, the "level" plane calculated using a BLTouch and mesh bed leveling does not seem to match the bed. The general result is the right side of the bed being significantly further from the nozzle than the left, but also the rear right is the furthest point, and the rear left is the closest.
I know the bed isn't particularly flat, but this issue persists regardless of any bed adjustments. In fact, the printer seems to compensate for these changes, and the high and low spots in the print are exactly the same no matter the absolute flatness or "levelness" of the bed. Also, the high and low spots in the print don't match up with high and low spots in the height map at all. Most of the bed is within about .1-.2mm of flat, with only the outer edges (50mm or so) deviating significantly from that.
Above the 1st level, it prints nearly flawlessly. I have plenty of tweaking left to do, but levelness and distance between higher layers seems to be just fine.
At this point, I'm not even sure where the issue lies. I'm fairly certain the mechanical design is sound. The frame is incredibly rigid, and I've spent hours adjusting the geometry of the various gantries and linear rails and rods to be running as perfectly square and/or level as possible.
Even if something isn't quite right, shouldn't bed leveling be able to adjust for whatever offset or geometry change that introduces? If the toolhead/nozzle were lower at one end of an axis compared to the other, wouldn't the bed just move up or down to cancel that out? Or am i misunderstanding how mesh bed leveling works? It seems to me that this is a software/config issue, but I'm not sure of anything at this point.
Any help would be greatly appreciated.
Images and config files below. Hopefully you're able to get a decent idea of what I'm working with. I can post more config files, images, or renderings from the 3d model if any other information will help.
config.g
M80 C"pson" ; power on
; Basic setup
M575 P1 S1 B57600 ; enable PanelDue
G90 ; absolute coordinates
M83 ; relative extruder moves
M550 P"CoreXY Printer" ; printer name
M669 K1 ; CoreXY mode
M552 S1 ; enable network
M586 P0 S1 ; enable HTTP
M586 P1 S0 ; disable FTP
M586 P2 S0 ; disable Telnet
; Drives
M569 P0 S1 ; drive 0; forwards
M569 P1 S0 ; drive 1; backwards
M569 P2 S0 ; drive 2; backwards (left Z leadscrew)
M569 P3 S1 ; drive 3; forwards (extruder)
M569 P4 S0 ; drive 4; backwards (right Z leadscrew)
M584 X0 Y1 Z2:4 E3 ; drive mapping
M906 X1800 Y1800 Z1400 E1000 I40 ; motor currents (mA); idle factor
M84 S1 ; idle timeout
M350 X16 Y16 Z16 E16 I1 ; 16x microstepping with interpolation
M92 X80 Y80 Z400 E415 ; steps per mm
M566 X2100 Y2100 Z1200 E600 ; jerk (mm/min)
M203 X36000 Y36000 Z3600 E6000 ; maximum speed (mm/min)
M201 X15000 Y15000 Z1000 E3000 ; acceleration (mm/s^2)
M204 P5000 T10000 ; print and travel acceleration
; Axis Limits
M208 X-10 Y-10 Z0 S1 ; axis minima
M208 X318 Y300 Z370 S0 ; axis maxima
; Endstops
M574 X2 S1 P"xstop" ; X endstop high end; NO; pin xstop
M574 Y1 S1 P"ystop" ; Y endstop low end; NO; pin ystop
; Z-Probe
M950 S0 C"exp.heater3" ; servo 0; pin exp.heater3
M558 P9 C"^zprobe.in" H5 F120 T40000 ; Z probe type BLTouch; pin zprobe.in; dive height, speed
G31 P500 X0 Y25 Z2.4 ; Z probe trigger value; position offset
M376 H3
; Z-leveling
M671 X370:-58 Y150:150 S10 ; leadscrew positions; 10mm correction limit
; Bed heater
M308 S0 P"bedtemp" Y"thermistor" A"Bed Heat" T100000 B4138 ; sensor 0; pin bedtemp; type thermistor; name
M950 H0 C"bedheat" T0 ; heater 0; pin bedheat; sensor 0
M307 H0 R0.230 K0.266:0.000 D2.74 E1.35 B0 ; PID parameters; disable bang-bang
M140 H0
M143 H0 S120 ; temperature limit 120C
; Hotend
M308 S1 P"e0temp" Y"thermistor" A"Hotend" T100000 B4138 ; sensor 1; pin e0temp; type thermistor; name
M950 H1 C"e0heat" T1 ; heater 1; pin e0heat; sensor 1
M307 H1 R3.034 K0.525:0.211 D5.88 E1.35 V23.8 B0 ; PID parameters; disable bang-bang
M143 H1 S300 ; temperature limit 300C
; Fans
M950 F0 C"fan0" Q20 ; fan 0; pin fan0; 20Hz PWM
M106 P0 C"Part Cooling"
M950 F1 C"fan2" ; fan 1; pin fan2
M106 P1 C"Hotend" S1 H1 T50 ; fan 1; temperature controlled; heater 1; 50C
; Tools
M563 P0 S"Hotend" D0 H1 F0 L0 ; define tool 0
G10 P0 X0 Y0 Z0 ; set tool 0 axis offsets
G10 P0 R180 S235 ; set initial tool 0 active and standby temperatures to 0C
M572 D0 S0.05 ; linear advance
bed.g
M561 ; clear stored mesh
G28
; Bed leveling pass 1
M558 H10 ; 10mm probe dive height
; Define probe points
G30 P0 X50 Y150 Z-99999
G30 P1 X150 Y150 Z-99999
G30 P2 X250 Y150 Z-99999 S2 ; and run probe
; Home Z
G1 X150 Y150 F40000 ; move to probe point
M558 H5 F300 ; dive height, slow home speed
G30 ; home Z
; Bed leveling pass 2
G30 P0 X50 Y50 Z-99999
G30 P1 X150 Y50 Z-99999
G30 P2 X250 Y50 Z-99999
G30 P3 X250 Y150 Z-99999
G30 P4 X150 Y150 Z-99999
G30 P5 X50 Y150 Z-99999
G30 P6 X50 Y250 Z-99999
G30 P7 X150 Y250 Z-99999
G30 P8 X250 Y250 Z-99999 S2 ; and run probe
; Home Z
G1 X150 Y150 F40000 ; move to probe point
M558 H3 F300 ; dive height, slow home speed
G30 ; home Z
; Mesh bed leveling
M557 X20:280 Y20:280 P7 ; define probe grid
G29 ; run probe