Very High Pressure Advance Direct Drive

  • Hi all,

    I recently upgraded my Monoprice Ultimate a couple months ago with a DuetWifi. I love it so far. I recently have come across pressure advance and nonlinear extrusion. I followed the forum threads to calibrate both, starting with nonlinear extrusion. Nonlinear extrusion calibration came out as:


    I then calibrated my pressure advance using the script. It came up with my K value being somewhere around 0.275, which seems extremely high for a direct drive. There is some distance between the extruder drive and the hotend (~80mm), but I couldn't imagine that counting for such a significant difference between my calibration value and the value listed in the Pressure Advance wiki. I have printed a new gantry block for my printer to replace the old heavy steel one to reduce weight. When I saw my K value so high I reprinted a new block to make sure that wasn't the cause. I can't seem to figure out why that value would be so high. Any help is greatly appreciated!

  • Moderator

    Double check your PA values using the cube test print described in the wiki:

    The script seems to produce values that are very high. For long bowden setups they may be more appropriate, but for direct drive setups I don't think they are as applicable. So definitely use separate means of testing to verify.

    I would also use caution with nonlinear extrusion. It tends to only be applicable when printing at very high speeds and at the limits of the melt rate.

    It would be a good idea to identify your volumetric flow rate limit first and then stick within it. At that point nonlinear extrusion may not be required at all.

  • Thanks for your help! I use Cura for slicing and I couldn't seem to figure out how to get it to put the seam in a good spot. It always seemed to end up in the corner. I took the script I had been using for pressure advance and made it something closer to what is listed in the wiki you linked. I would like to share it and make sure that it is actually accomplishing what I intend. What is the best way to upload the Python script?

  • Moderator

    Apparently the newer versions of official cura are always forcing to a corner.

    You'd need to use either PrusaSlier which can force to the rear, or use this custom version of Cura that has a few extra features and options.

    I highly recommend it anyway.

    Either copy and paste the python script text into a codo block or add a .txt extension to the file name to be able to upload it.

  • @Phaedrux said in Very High Pressure Advance Direct Drive:

    Apparently the newer versions of official cura are always forcing to a corner.

    Is it possible to trick it? E.g. by adding to the cube model a tiny bump at the rear?

  • Moderator

    @zapta That may force the seam there but it may also mess up the way pressure advance is going to behave.

  • @Phaedrux, I was thinking a tiny 'corner' at the rear, like in the model below. Chances are it will be the same from PA perspective.

    Anybody with Cura can test if Cura can be set to have the layer change at the fold line in the middle of the face?

    // Openscad script for 40mm PA test cube with a 'corner' at the rear.
    bump = 0.2;
      polygon(points = [[-20, -20],  [20, -20], [20, 20], 
                        [0, 20+bump], [-20, 20],[-20, -20]]);


    Edit: here is an stl with a larger 2mm bump pa5-2.stl

  • Here is the modified script:

    # extrusion parameters (mm)
    extrusion_width   = 0.48 # typical: nozzleDiameter * 1.2 (f.e. a 0.4mm nozzle should be set to 0.48mm extrusion width in slicers)
    layer_height      = 0.2 # max: 50% of your extrusion_width
    filament_diameter = 1.75 # manufacturers typically sell 1.73-1.74mm filament diameter (always lower than 1.75 to prevent cloggs) tested with many brands
    # print speeds (mm/s)
    travel_speed      = 300
    first_layer_speed = 10
    speed             = 60
    cooling_fan_speed = 128 # from 0 to 255
    # calibration object dimensions (mm)
    layers        = 80
    object_width  = 100
    # pressure advance gradient (s)
    layer_multiple        = 3
    pressure_advance_step = 0.01
    # center of print bed (mm)
    # needed to position this print in the middle of your print bed
    # If you are not sure about this: Take a look into your slicer. Normally you will see the origin (center) visualized as xyz-axis
    # f.e. I have a 285x220mm bed, my printers origin is at X0, Y0 (front left corner), so the offset value you would need for X are 285/2.0 = 142.5
    offset_x = 100
    offset_y = 100
    layer0_z = layer_height
    # put your typical start.gcode here, if you use a custom start gcode via your slicing software
    # Python tipp: to type in a continuous command over multiple lines you can use a backslash '\'
    # general tipp: to output a 'new line' after your gcode command use '\n' which is the representation of the new line byte sequence
    # in short: use '\n\' after each line of your regular start.gcode command
        print('; START.gcode\n\
    M106 S0\n\
    M140 S60\n\
    M190 S60\n\
    M104 S240 T0\n\
    M109 S240 T0\n\
    G28 ; home all axes\n\
    T0 ; set active extruder to 0\n\
    M913 Y50 ; lower Y stepper torque to 50% ;if stall detection fails for protection of mechanics\n\
    G1 X300 Y5 F1600;\n\
    M913 Y100 ; raise Y stepper torque back to 100%\n\
    G1 Z0.15 F400;\n\
    G91 ; relative\n\
    ; wipe nozzle on beds edge \n\
    G1 X-20 E10 F800;\n\
    G1 X-15 Y10 E13 F1600;\n\
    G1 X-35 E15;\n\
    G92 E0; zero extruded length\n\
    G90 ; absolute\n\
    ; process _R_Multimaterial-1\n\
    ; layer 1, Z = 0.220\n\
    G92 E0.0000 ; reset extruded length \n\
        print(' !!! your start.gcode is faulty, check correct format')
    print('\nM83 ; relative extrusion for this python script\n')
    from math import sqrt
    curr_x = offset_x
    curr_y = offset_y
    curr_z = layer0_z
    def extrusion_volume_to_length(volume):
        return volume / (filament_diameter * filament_diameter * 3.14159 * 0.25)
    def extrusion_for_length(length):
        return extrusion_volume_to_length(length * extrusion_width * layer_height)
    def up():
        global curr_z
        curr_z += layer_height
        print("G1 Z%.3f" % curr_z)
    def line(x,y,speed):
        length = sqrt(x**2 + y**2)
        global curr_x, curr_y
        curr_x += x
        curr_y += y
        if speed > 0:
            print("G1 X%.3f Y%.3f E%.4f F%.0f" % (curr_x, curr_y, extrusion_for_length(length), speed * 60))
            print("G1 X%.3f Y%.3f F%.0f" % (curr_x, curr_y, travel_speed * 60))
    def goto(x,y):
        global curr_x, curr_y
        curr_x = x + offset_x
        curr_y = y + offset_y
        print("G1 X%.3f Y%.3f" %(curr_x, curr_y))
    # unused - maybe convert to a full bottom layer
    def first_layer():
        goto(-object_width/2, )
    def print_square(square_speed):    
        # start front center of cube
        goto(0, - (object_width/2))
        # line to front left corner
        line(-object_width/2, 0, square_speed)
        # line to back left corner
        line(0, object_width, square_speed)
        # line to back right corner
        line(object_width, 0, square_speed)
        # line to front right corner
        line(0, -object_width, square_speed)
        # line to start corner - extrusion width
        line(-object_width/2 + extrusion_width, 0, square_speed)
    def main():
        pressure_advance = 0    
        print("; layer %d, pressure advance: %.3f" %(0, pressure_advance))            
        print("M572 D0 S%.3f" % pressure_advance)
        # prime nozzle    
        print("G1 X%.3f Y%.3f Z%.3f E1.0 F%.0f" % (curr_x, curr_y, curr_z, travel_speed * 60))
        for l in range(layers - 1):
            if l != 0 and l % layer_multiple == 0 :
                pressure_advance += pressure_advance_step     
                print("; layer %d, pressure advance: %.3f" %(l, pressure_advance))        
                print("M291 P\"Current K: %.3f\"" % pressure_advance)              
                print("M572 D0 S%.3f" % pressure_advance)
        print('; END.gcode\n\
        G91 ; relative\n\
        G1 Z10 F450 ; bed clearance\n\
        G90 ; absolute\n\
        M106 S0 ; turn off part cooling fan\n\
        M104 S0 ; turn off extruder\n\
        M140 S0 ; turn off bed\n\
        M84 ; disable motors\n')
    if __name__ == '__main__':

    The main thing I'm worried about is the end of the square. I print up to the start of the square minus the extrusion width and then raise the head the layer height. This has resulted in a bump in my print but that might be because of not enough PA.

  • Moderator

    Can you post photos?

  • Here is the result. I'm hoping it is the script that is off. I get good prints that do not look like this. As I was trying to get this picture ready I kept getting that gap on the first few layers so I modified the script to print from center to the start here thinking that the nozzle wasn't primed enough. You can see my first layer is laid down well, but subsequent layers look terrible at the start. I'm not sure what is up with that. Maybe this script is the wrong path to take.


  • Moderator

    @guerty25 said in Very High Pressure Advance Direct Drive:

    Maybe this script is the wrong path to take.

    I would definitely try one of the more traditional tests as well.

  • I ended up trying the Marlin calculator found in this section because I couldn't figure out how to get a cube with the seam in the front. I ended up getting a K value of 0.13 which still seems high but much better than 0.28. Thanks for everyone's help.

  • @Phaedrux I'm just learning about tuning in RepRap firmware and found this post. What is special about this version of Cura?

  • Moderator

    @lael There are many changes. Best to read the read me.

  • @Phaedrux Thanks!

Log in to reply