Rough, wavy surface, motor vibrations

Dear Repetier support
Dear Forum members

I have a problem:

I have built a self-designed quite large Ultimaker-Style 3d-Printer, for the electronics, I´m using an Arduino Due with a RADDS-Shield an 1/128 RRD Silencioso stepper motor drivers.

Here is an earlier render of my printer, I´ve changed some things, for example the belt tensioners are replaced:
image

The problem that I´m having is that the motor is vibrating when moving, so i see vertical lines at straight walls and wavy patterns at curved objects (like in these photos). I´ve postet some pictures here: http://forums.reprap.org/read.php?336,393221,page=7
image
image

I can hear and feel the motor vibrating when moving, the wave patter doesn´t match with the belt weidth (GT3 3M) and it doesn´t match with the full steps of the motor.
It looks like the motor stops moving every few micro-seconds.
The motors are connected to the XY-carrier quite stiff with stiff couplings and strong tensioned belts, so the motor vibrations directly transmit to the extruder. If I decouple the motors, the mechanics are very easy to move, so the problem isn´t coming from here.

I´ve heard that Repetier uses an interrupt for reading sensor values and for communication and during this interrupt, Repetier doesn´t send stepping signals, that would explain the virbrations.
I´ve already tried to change the stepping mode from 1/128 to 1/32 and changed the motor current as well as the decay mode, same result.

There has to be a way to make the motors move smooth.

Comments

  • Here is a part of the Config.h:
    #define NUM_EXTRUDER 1
    #define MOTHERBOARD 402

    #include "pins.h"

    // ################## EDIT THESE SETTINGS MANUALLY ################
    // ################ END MANUAL SETTINGS ##########################

    #define FAN_BOARD_PIN -1

    //#define EXTERNALSERIAL use Arduino serial library instead of build in. Requires more ram, has only 63 byte input buffer.
    // Uncomment the following line if you are using arduino compatible firmware made for Arduino version earlier then 1.0
    // If it is incompatible you will get compiler errors about write functions not beeing compatible!
    //#define COMPAT_PRE1
    #define MIXING_EXTRUDER 0

    #define DRIVE_SYSTEM 0
    #define XAXIS_STEPS_PER_MM 474.07
    #define YAXIS_STEPS_PER_MM 474.07
    #define ZAXIS_STEPS_PER_MM 12800
    #define EXTRUDER_FAN_COOL_TEMP 50
    #define PDM_FOR_EXTRUDER 0
    #define PDM_FOR_COOLER 0
    #define DECOUPLING_TEST_MAX_HOLD_VARIANCE 20
    #define DECOUPLING_TEST_MIN_TEMP_RISE 1
    #define EXT0_X_OFFSET 0
    #define EXT0_Y_OFFSET 0
    #define EXT0_STEPS_PER_MM 1299.7
    #define EXT0_TEMPSENSOR_TYPE 8
    #define EXT0_TEMPSENSOR_PIN TEMP_0_PIN
    #define EXT0_HEATER_PIN HEATER_0_PIN
    #define EXT0_STEP_PIN ORIG_E0_STEP_PIN
    #define EXT0_DIR_PIN ORIG_E0_DIR_PIN
    #define EXT0_INVERSE 1
    #define EXT0_ENABLE_PIN E0_ENABLE_PIN
    #define EXT0_ENABLE_ON 0
    #define EXT0_MAX_FEEDRATE 100
    #define EXT0_MAX_START_FEEDRATE 20
    #define EXT0_MAX_ACCELERATION 5000
    #define EXT0_HEAT_MANAGER 1
    #define EXT0_WATCHPERIOD 1
    #define EXT0_PID_INTEGRAL_DRIVE_MAX 255
    #define EXT0_PID_INTEGRAL_DRIVE_MIN 40
    #define EXT0_PID_PGAIN_OR_DEAD_TIME 41
    #define EXT0_PID_I 0.1
    #define EXT0_PID_D 260
    #define EXT0_PID_MAX 255
    #define EXT0_ADVANCE_K 0
    #define EXT0_ADVANCE_L 0
    #define EXT0_ADVANCE_BACKLASH_STEPS 0
    #define EXT0_WAIT_RETRACT_TEMP 160
    #define EXT0_WAIT_RETRACT_UNITS 5095
    #define EXT0_SELECT_COMMANDS ""
    #define EXT0_DESELECT_COMMANDS ""
    #define EXT0_EXTRUDER_COOLER_PIN -1
    #define EXT0_EXTRUDER_COOLER_SPEED 255
    #define EXT0_DECOUPLE_TEST_PERIOD 12000
    #define RETRACT_DURING_HEATUP true
    #define PID_CONTROL_RANGE 20
    #define SKIP_M109_IF_WITHIN 2
    #define SCALE_PID_TO_MAX 0
    #define TEMP_HYSTERESIS 1
    #define EXTRUDE_MAXLENGTH 160
    #define NUM_TEMPS_USERTHERMISTOR0 0
    #define USER_THERMISTORTABLE0 {}
    #define NUM_TEMPS_USERTHERMISTOR1 0
    #define USER_THERMISTORTABLE1 {}
    #define NUM_TEMPS_USERTHERMISTOR2 0
    #define USER_THERMISTORTABLE2 {}
    #define GENERIC_THERM_VREF 5
    #define GENERIC_THERM_NUM_ENTRIES 33
    #define HEATER_PWM_SPEED 0

    // ############# Heated bed configuration ########################

    #define HAVE_HEATED_BED 1
    #define HEATED_BED_MAX_TEMP 120
    #define SKIP_M190_IF_WITHIN 3
    #define HEATED_BED_SENSOR_TYPE 8
    #define HEATED_BED_SENSOR_PIN TEMP_1_PIN
    #define HEATED_BED_HEATER_PIN HEATER_1_PIN
    #define HEATED_BED_SET_INTERVAL 5000
    #define HEATED_BED_HEAT_MANAGER 0
    #define HEATED_BED_PID_INTEGRAL_DRIVE_MAX 255
    #define HEATED_BED_PID_INTEGRAL_DRIVE_MIN 80
    #define HEATED_BED_PID_PGAIN_OR_DEAD_TIME 196
    #define HEATED_BED_PID_IGAIN 33
    #define HEATED_BED_PID_DGAIN 290
    #define HEATED_BED_PID_MAX 255
    #define HEATED_BED_DECOUPLE_TEST_PERIOD 60000
    #define MIN_EXTRUDER_TEMP 150
    #define MAXTEMP 280
    #define MIN_DEFECT_TEMPERATURE -10
    #define MAX_DEFECT_TEMPERATURE 290

    // ################ Endstop configuration #####################

    #define ENDSTOP_PULLUP_X_MIN true
    #define ENDSTOP_X_MIN_INVERTING false
    #define MIN_HARDWARE_ENDSTOP_X true
    #define ENDSTOP_PULLUP_Y_MIN true
    #define ENDSTOP_Y_MIN_INVERTING false
    #define MIN_HARDWARE_ENDSTOP_Y true
    #define ENDSTOP_PULLUP_Z_MIN true
    #define ENDSTOP_Z_MIN_INVERTING false
    #define MIN_HARDWARE_ENDSTOP_Z true
    #define ENDSTOP_PULLUP_X_MAX true
    #define ENDSTOP_X_MAX_INVERTING false
    #define MAX_HARDWARE_ENDSTOP_X false
    #define ENDSTOP_PULLUP_Y_MAX true
    #define ENDSTOP_Y_MAX_INVERTING false
    #define MAX_HARDWARE_ENDSTOP_Y false
    #define ENDSTOP_PULLUP_Z_MAX true
    #define ENDSTOP_Z_MAX_INVERTING false
    #define MAX_HARDWARE_ENDSTOP_Z false
    #define max_software_endstop_r true

    #define min_software_endstop_x false
    #define min_software_endstop_y false
    #define min_software_endstop_z false
    #define max_software_endstop_x true
    #define max_software_endstop_y true
    #define max_software_endstop_z true
    #define ENDSTOP_X_BACK_MOVE 5
    #define ENDSTOP_Y_BACK_MOVE 5
    #define ENDSTOP_Z_BACK_MOVE 0.5
    #define ENDSTOP_X_RETEST_REDUCTION_FACTOR 3
    #define ENDSTOP_Y_RETEST_REDUCTION_FACTOR 3
    #define ENDSTOP_Z_RETEST_REDUCTION_FACTOR 3
    #define ENDSTOP_X_BACK_ON_HOME 1
    #define ENDSTOP_Y_BACK_ON_HOME 1
    #define ENDSTOP_Z_BACK_ON_HOME 0
    #define ALWAYS_CHECK_ENDSTOPS 0

    // ################# XYZ movements ###################

    #define X_ENABLE_ON 1
    #define Y_ENABLE_ON 1
    #define Z_ENABLE_ON 1
    #define DISABLE_X 0
    #define DISABLE_Y 0
    #define DISABLE_Z 0
    #define DISABLE_E 0
    #define INVERT_X_DIR 1
    #define INVERT_Y_DIR 0
    #define INVERT_Z_DIR 1
    #define X_HOME_DIR -1
    #define Y_HOME_DIR -1
    #define Z_HOME_DIR -1
    #define X_MAX_LENGTH 340
    #define Y_MAX_LENGTH 320
    #define Z_MAX_LENGTH 500
    #define X_MIN_POS 0
    #define Y_MIN_POS 0
    #define Z_MIN_POS 0

    // ##########################################################################################
    // ## Movement settings ##
    // ##########################################################################################

    #define FEATURE_BABYSTEPPING 1
    #define BABYSTEP_MULTIPLICATOR 1

    #define DELTA_SEGMENTS_PER_SECOND_PRINT 600 // Move accurate setting for print moves
    #define DELTA_SEGMENTS_PER_SECOND_MOVE 300 // Less accurate setting for other moves

    // Delta settings
    #define DELTA_HOME_ON_POWER 0

    #define DELTASEGMENTS_PER_PRINTLINE 24
    #define STEPPER_INACTIVE_TIME 360L
    #define MAX_INACTIVE_TIME 1200L
    #define MAX_FEEDRATE_X 400
    #define MAX_FEEDRATE_Y 400
    #define MAX_FEEDRATE_Z 5
    #define HOMING_FEEDRATE_X 40
    #define HOMING_FEEDRATE_Y 40
    #define HOMING_FEEDRATE_Z 2
    #define HOMING_ORDER HOME_ORDER_XYZ
    #define ENABLE_BACKLASH_COMPENSATION 0
    #define X_BACKLASH 0
    #define Y_BACKLASH 0
    #define Z_BACKLASH 0
    #define RAMP_ACCELERATION 1
    #define STEPPER_HIGH_DELAY 0
    #define DIRECTION_DELAY 0
    #define STEP_DOUBLER_FREQUENCY 96000
    #define ALLOW_QUADSTEPPING 1
    #define DOUBLE_STEP_DELAY 0 // time in microseconds
    #define MAX_HALFSTEP_INTERVAL 1999
    #define MAX_ACCELERATION_UNITS_PER_SQ_SECOND_X 1500
    #define MAX_ACCELERATION_UNITS_PER_SQ_SECOND_Y 1500
    #define MAX_ACCELERATION_UNITS_PER_SQ_SECOND_Z 100
    #define MAX_TRAVEL_ACCELERATION_UNITS_PER_SQ_SECOND_X 2500
    #define MAX_TRAVEL_ACCELERATION_UNITS_PER_SQ_SECOND_Y 2500
    #define MAX_TRAVEL_ACCELERATION_UNITS_PER_SQ_SECOND_Z 100
    #define MAX_JERK 25
    #define MAX_ZJERK 0.3
    #define PRINTLINE_CACHE_SIZE 32
    #define MOVE_CACHE_LOW 10
    #define LOW_TICKS_PER_MOVE 250000
    #define FEATURE_TWO_XSTEPPER 0
    #define X2_STEP_PIN ORIG_E1_STEP_PIN
    #define X2_DIR_PIN ORIG_E1_DIR_PIN
    #define X2_ENABLE_PIN ORIG_E1_ENABLE_PIN
    #define FEATURE_TWO_YSTEPPER 0
    #define Y2_STEP_PIN ORIG_E1_STEP_PIN
    #define Y2_DIR_PIN ORIG_E1_DIR_PIN
    #define Y2_ENABLE_PIN ORIG_E1_ENABLE_PIN
    #define FEATURE_TWO_ZSTEPPER 0
    #define Z2_STEP_PIN ORIG_E1_STEP_PIN
    #define Z2_DIR_PIN ORIG_E1_DIR_PIN
    #define Z2_ENABLE_PIN ORIG_E1_ENABLE_PIN
    #define FEATURE_DITTO_PRINTING 0
    #define USE_ADVANCE 0
    #define ENABLE_QUADRATIC_ADVANCE 0


    // ################# Misc. settings ##################

    #define BAUDRATE 250000
    #define ENABLE_POWER_ON_STARTUP 1
    #define POWER_INVERTING 0
    #define KILL_METHOD 1
    #define GCODE_BUFFER_SIZE 2
    #define ACK_WITH_LINENUMBER 1
    #define WAITING_IDENTIFIER "wait"
    #define ECHO_ON_EXECUTE 1
    #define EEPROM_MODE 1
    #define PS_ON_PIN -1
  • I do not think it is any interrupt. Especially on the due they are all so short, that it can not explain that pattern.

    Are you using 24V for motors? I heard tiny substeps do not work well with 12V. Try a simple slow move to see if motor is silent. At this speed interrupts have 0 relevance.
  • Hello Repetier

    Thanks for the fast response.

    I use 24V for the motors.

    I did some further investigation with this printed octagon:

    image
     Octagon

    image
    X-Side

    image
    Y-Side

    image
    X-Y-Side

    image
    X-Side with measurement

    image
    X-Y-Side with measurement

    This part is 10 mm high, print settings are 0.2 mm layer height, 3 perimeters and 25 % infill.

    Every 3 mm, the printing speed has changed:


    0-3 mm: Default 66 mm/s, Outline Underspeed 40 % (26,6 mm/s)

    3-6 mm: Default 100 mm/s, Outline Underspeed 40% (40 mm/s)

    6-10 mm: Default 133 mm/s, Outline Underspeed 40% (53,3 mm/s)

    (I use Simplify3d for slicing, so the "outline underspeed" means that the outermost perimeter is printed with 40% of the default speed, the middle perimeter is printed at 60% and the innermost perimeter is printed at 80%. )

    As you can see, the distance between the waves is longer at the higher printing speed. To be exact, a double printspeed results in a double wave length. (maybe this isn´t clearly visible at the photos, but I can definitely see it here)

    In my opinion, this shows that the waves are generated at a fixed time interval, so only the Due or the firmware can be responsible for it.

    The linear bearings I use are running absolutely free nearly without any friction or slip-stick-effect. The belts also can´t cause this problem because if so, the wave pattern would have a fixed wavelength, which isn´t the case.

    Any further ideas?
  • Ok, I have no real experience with such high printing speeds. But it looks a bit like the infill is showing through. Have you tried similar objects without infill, just to rule out negative effects from infill. I has a similar picture once and it was the infill pulling and pushing on the perimeter. 
  • I can ensure you that it isn´t the infill. It´s the same with objects without infill or with single-wall parts.

    Only for the case that the interrupt causes this problem, is there a way to modify the frequency of the interrupt (the time between the interrupt) without rewriting the whole firmware?
    I didn´t find any "#define interrupt_time" or something like that yet.


  • Interrupt time is exactly the time for the next step. So it changes between steps to be most accurate.  Since your speed is below 200mm/s every step even gets it's own timing and no double steps should occur. And in the logic analyser a have seen that timings are very good. So it might be vibration related. Have you tried with 16 microsteps instead of 128. I have no experience with silencios so far, so I don't know how good they work with motors and if they really stop at 128 substeps.
Sign In or Register to comment.