Commit 77059690 authored by MagoKimbra's avatar MagoKimbra

Fix Delta Autocalibration

parent dda444c5
......@@ -188,7 +188,6 @@
// default settings
#define DEFAULT_AXIS_STEPS_PER_UNIT {80,80,3200,625,625,625,625} // X, Y, Z, E0, E1, E2, E3 default steps per unit
#define DEFAULT_MAX_FEEDRATE {300,300,2,100,100,100,100} // X, Y, Z, E0, E1, E2, E3 (mm/sec)
#define DEFAULT_RETRACTION_MAX_FEEDRATE {110,110,110,110} // E0, E1, E2, E3 (mm/sec)
#define DEFAULT_MAX_ACCELERATION {3000,3000,50,1000,1000,1000,1000} // X, Y, Z, E0, E1, E2, E3 maximum start speed for accelerated moves.
#define DEFAULT_ACCELERATION 2500 // X, Y, Z and E max acceleration in mm/s^2 for printing moves
......
......@@ -188,7 +188,6 @@
// default settings
#define DEFAULT_AXIS_STEPS_PER_UNIT {80,80,3200,625,625,625,625} // X, Y, Z, E0, E1, E2, E3 default steps per unit
#define DEFAULT_MAX_FEEDRATE {300,300,2,100,100,100,100} // X, Y, Z, E0, E1, E2, E3 (mm/sec)
#define DEFAULT_RETRACTION_MAX_FEEDRATE {110,110,110,110} // E0, E1, E2, E3 (mm/sec)
#define DEFAULT_MAX_ACCELERATION {3000,3000,50,1000,1000,1000,1000} // X, Y, Z, E0, E1, E2, E3 maximum start speed for accelerated moves.
#define DEFAULT_ACCELERATION 2500 // X, Y, Z and E max acceleration in mm/s^2 for printing moves
......
......@@ -47,7 +47,7 @@
#define Z_PROBE_RETRACT_START_LOCATION {0, 0, 30, 0} // X, Y, Z, E start location for z-probe retract sequence
#define Z_PROBE_RETRACT_END_LOCATION {0, 0, 30, 0} // X, Y, Z, E end location for z-probe retract sequence
#define Z_RAISE_BETWEEN_PROBINGS 2 // How much the extruder will be raised when travelling from between next probing points
#define AUTOLEVEL_GRID 24 // Distance between autolevel Z probing points, should be less than print surface radius/3.
#define AUTOLEVEL_GRID 20 // Distance between autolevel Z probing points, should be less than print surface radius/3.
//===========================================================================
//=============================Mechanical Settings===========================
......@@ -139,7 +139,6 @@
// delta speeds must be the same on xyz
#define DEFAULT_AXIS_STEPS_PER_UNIT {80,80,80,451,625,625,625} // X, Y, Z, E0, E1, E2, E3
#define DEFAULT_MAX_FEEDRATE {300,300,300,45,100,100,100} // X, Y, Z, E0, E1, E2, E3 (mm/sec)
#define DEFAULT_RETRACTION_MAX_FEEDRATE {150,150,150,150} // E0, E1, E2, E3 (mm/sec)
#define DEFAULT_MAX_ACCELERATION {2000,2000,2000,1000,1000,1000,1000} // X, Y, Z, E0, E1, E2, E3 maximum start speed for accelerated moves.
#define DEFAULT_ACCELERATION 1000 // X, Y, Z and E max acceleration in mm/s^2 for printing moves
......
......@@ -210,7 +210,6 @@
// default settings
#define DEFAULT_AXIS_STEPS_PER_UNIT {103.69,103.69,200/1.25,1000,1000,1000,1000} // X, Y, Z, E0, E1, E2, E3
#define DEFAULT_MAX_FEEDRATE {300,300,4,45,45,45,45} // X, Y, Z, E0, E1, E2, E3 (mm/sec)
#define DEFAULT_RETRACTION_MAX_FEEDRATE {80,80,80,80} // E0, E1, E2, E3 (mm/sec)
#define DEFAULT_MAX_ACCELERATION {5000,5000,50,5000,5000,5000,5000} // X, Y, Z, E0, E1, E2, E3 maximum start speed for accelerated moves.
#define DEFAULT_ACCELERATION 400 // X, Y, Z and E max acceleration in mm/s^2 for printing moves
......
......@@ -51,7 +51,6 @@ typedef unsigned long millis_t;
#include "comunication.h"
void get_command();
void process_commands();
void manage_inactivity(bool ignore_stepper_queue=false);
......@@ -138,6 +137,7 @@ void manage_inactivity(bool ignore_stepper_queue=false);
* X_HEAD and Y_HEAD is used for systems that don't have a 1:1 relationship between X_AXIS and X Head movement, like CoreXY bots.
*/
enum AxisEnum {X_AXIS=0, Y_AXIS=1, A_AXIS=0, B_AXIS=1, Z_AXIS=2, E_AXIS=3, X_HEAD=4, Y_HEAD=5};
enum EndstopEnum {X_MIN=0, Y_MIN=1, Z_MIN=2, Z_PROBE=3, X_MAX=4, Y_MAX=5, Z_MAX=6};
void enable_all_steppers();
......@@ -160,9 +160,9 @@ void adjust_delta(float cartesian[3]);
void prepare_move_raw();
extern float delta[3];
extern float delta_tmp[3];
extern float delta_tower1_x,delta_tower1_y;
extern float delta_tower2_x,delta_tower2_y;
extern float delta_tower3_x,delta_tower3_y;
extern float delta_tower1_x, delta_tower1_y;
extern float delta_tower2_x, delta_tower2_y;
extern float delta_tower3_x, delta_tower3_y;
#endif
#ifdef SCARA
void calculate_delta(float cartesian[3]);
......@@ -241,6 +241,7 @@ extern float home_offset[3];
extern float tower_adj[6];
extern float delta_radius;
extern float delta_diagonal_rod;
extern float delta_segments_per_second;
#elif defined(Z_DUAL_ENDSTOPS)
extern float z_endstop_adj;
#endif
......
......@@ -336,7 +336,7 @@ bool target_direction;
float delta_diagonal_rod; // = DEFAULT_DELTA_DIAGONAL_ROD;
float delta_diagonal_rod_2;
float delta_segments_per_second = DELTA_SEGMENTS_PER_SECOND;
float ac_prec = AUTOCALIBRATION_PRECISION / 2;
float ac_prec = AUTOCALIBRATION_PRECISION;
float bed_radius = PRINTER_RADIUS;
float delta_tower1_x, delta_tower1_y;
float delta_tower2_x, delta_tower2_y;
......@@ -458,6 +458,8 @@ bool target_direction;
//================================ Functions ================================
//===========================================================================
void process_next_command();
bool setTargetedHotend(int code);
#ifdef PREVENT_DANGEROUS_EXTRUDE
......@@ -766,17 +768,17 @@ void loop() {
// Write the string from the read buffer to SD
card.write_command(command);
if (card.logging)
process_commands(); // The card is saving because it's logging
process_next_command(); // The card is saving because it's logging
else
ECHO_L(OK);
}
}
else
process_commands();
process_next_command();
#else
process_commands();
process_next_command();
#endif // SDSUPPORT
......@@ -790,6 +792,15 @@ void loop() {
lcd_update();
}
void gcode_line_error(const char *err, bool doFlush = true) {
ECHO_S(ER);
PS_PGM(err);
ECHO_EV(gcode_LastN);
//Serial.println(gcode_N);
if (doFlush) FlushSerialRequestResend();
serial_count = 0;
}
/**
* Add to the circular command queue the next command from:
* - The command-injection queue (queued_commands_P)
......@@ -810,23 +821,31 @@ void get_command() {
}
#endif
//
// Loop while serial characters are incoming and the queue is not full
//
while (MYSERIAL.available() > 0 && commands_in_queue < BUFSIZE) {
#ifdef NO_TIMEOUTS
last_command_time = ms;
#endif
serial_char = MYSERIAL.read();
if (serial_char == '\n' || serial_char == '\r' ||
serial_count >= (MAX_CMD_SIZE - 1)
) {
//
// If the character ends the line, or the line is full...
//
if (serial_char == '\n' || serial_char == '\r' || serial_count >= MAX_CMD_SIZE - 1) {
// end of line == end of comment
comment_mode = false;
if (!serial_count) return; // shortcut for empty lines
if (!serial_count) return; // empty lines just exit
char *command = command_queue[cmd_queue_index_w];
command[serial_count] = 0; // terminate string
// this item in the queue is not from sd
#ifdef SDSUPPORT
fromsd[cmd_queue_index_w] = false;
#endif
......@@ -835,9 +854,7 @@ void get_command() {
strchr_pointer = strchr(command, 'N');
gcode_N = (strtol(strchr_pointer + 1, NULL, 10));
if (gcode_N != gcode_LastN + 1 && strstr_P(command, PSTR("M110")) == NULL) {
ECHO_LMV(ER, MSG_ERR_LINE_NO, gcode_LastN);
FlushSerialRequestResend();
serial_count = 0;
gcode_line_error(PSTR(MSG_ERR_LINE_NO));
return;
}
......@@ -848,27 +865,22 @@ void get_command() {
strchr_pointer = strchr(command, '*');
if (strtol(strchr_pointer + 1, NULL, 10) != checksum) {
ECHO_LMV(ER, MSG_ERR_CHECKSUM_MISMATCH, gcode_LastN);
FlushSerialRequestResend();
serial_count = 0;
gcode_line_error(PSTR(MSG_ERR_CHECKSUM_MISMATCH));
return;
}
//if no errors, continue parsing
// if no errors, continue parsing
}
else {
ECHO_LMV(ER, MSG_ERR_NO_CHECKSUM, gcode_LastN);
FlushSerialRequestResend();
serial_count = 0;
gcode_line_error(PSTR(MSG_ERR_NO_CHECKSUM));
return;
}
gcode_LastN = gcode_N;
//if no errors, continue parsing
// if no errors, continue parsing
}
else { // if we don't receive 'N' but still see '*'
if ((strchr(command, '*') != NULL)) {
ECHO_LMV(ER, MSG_ERR_NO_LINENUMBER_WITH_CHECKSUM, gcode_LastN);
serial_count = 0;
gcode_line_error(PSTR(MSG_ERR_NO_LINENUMBER_WITH_CHECKSUM), false);
return;
}
}
......@@ -1949,8 +1961,7 @@ static void setup_for_endstop_move() {
*/
}
inline void delta_autocalibration(int iterations){
//int iterations = 100; // Maximum number of iterations
inline void delta_autocalibration(int iterations) {
int loopcount = 1;
float adj_r_target, adj_dr_target;
float adj_r_target_delta = 0, adj_dr_target_delta = 0;
......@@ -1963,25 +1974,29 @@ static void setup_for_endstop_move() {
boolean adj_dr_allowed = true;
float h_endstop = -100, l_endstop = 100;
float probe_error, ftemp;
ECHO_SMV(DB, "Starting Auto Calibration... Calibration precision: +/- ", ac_prec, 3);
ECHO_EMV("mm Total Iteration: ", iterations);
LCD_MESSAGEPGM("Auto Calibration...");
float start_prec = 0.01;
float saved_delta_diagonal_rod = delta_diagonal_rod;
if (code_seen('D')) {
delta_diagonal_rod = code_value();
adj_dr_allowed = false;
ECHO_SMV(DB, "Using diagional rod length: ", delta_diagonal_rod);
ECHO_SMV(DB, "Using diagonal rod length: ", delta_diagonal_rod);
ECHO_EM("mm (will not be adjusted)");
}
ECHO_SMV(DB, "Starting Auto Calibration... Calibration precision: +/- ", ac_prec, 3);
ECHO_MV("mm Start Precision: +/- ", start_prec, 3);
ECHO_EMV("mm Total Iteration: ", iterations);
LCD_MESSAGEPGM("Auto Calibration...");
// First Check for control endstop
ECHO_LM(DB, "First check for adjust Z-Height");
home_delta_axis();
deploy_z_probe();
//Probe all points
bed_probe_all();
//Show calibration report
calibration_report();
......@@ -2011,6 +2026,8 @@ static void setup_for_endstop_move() {
do {
ECHO_LMV(DB, "Iteration: ", loopcount);
ECHO_SMV(DB, "Precision: +/- ", start_prec, 3);
ECHO_EM("mm");
if ((bed_level_c > 3) or (bed_level_c < -3)) {
//Build height is not set correctly ..
......@@ -2020,7 +2037,7 @@ static void setup_for_endstop_move() {
ECHO_EM(" mm..");
}
else {
if ((bed_level_x < -ac_prec) or (bed_level_x > ac_prec) or (bed_level_y < -ac_prec) or (bed_level_y > ac_prec) or (bed_level_z < -ac_prec) or (bed_level_z > ac_prec)) {
if ((bed_level_x < -start_prec) or (bed_level_x > start_prec) or (bed_level_y < -start_prec) or (bed_level_y > start_prec) or (bed_level_z < -start_prec) or (bed_level_z > start_prec)) {
//Endstop req adjustment
ECHO_LM(DB, "Adjusting Endstop..");
endstop_adj[0] += bed_level_x / 1.05;
......@@ -2049,15 +2066,16 @@ static void setup_for_endstop_move() {
adj_dr_target = (bed_level_ox + bed_level_oy + bed_level_oz) / 3;
//Determine which parameters require adjustment
if ((bed_level_c >= adj_r_target - ac_prec) and (bed_level_c <= adj_r_target + ac_prec)) adj_r_done = true;
if ((bed_level_c >= adj_r_target - start_prec) and (bed_level_c <= adj_r_target + start_prec)) adj_r_done = true;
else adj_r_done = false;
if ((adj_dr_target >= adj_r_target - ac_prec) and (adj_dr_target <= adj_r_target + ac_prec)) adj_dr_done = true;
if ((adj_dr_target >= adj_r_target - start_prec) and (adj_dr_target <= adj_r_target + start_prec)) adj_dr_done = true;
else adj_dr_done = false;
if ((bed_level_x != bed_level_ox) or (bed_level_y != bed_level_oy) or (bed_level_z != bed_level_oz)) adj_tower_done = false;
else adj_tower_done = true;
if ((adj_r_done == false) or (adj_dr_done == false) or (adj_tower_done == false)) {
//delta geometry adjustment required
ECHO_LM(DB, "Adjusting Delta Geometry..");
//set initial direction and magnitude for delta radius & diagonal rod adjustment
if (adj_r == 0) {
if (adj_r_target > bed_level_c) adj_r = 1;
......@@ -2083,6 +2101,7 @@ static void setup_for_endstop_move() {
}
if (adj_dr_allowed == false) adj_dr_done = true;
if (adj_dr_done == false) {
ECHO_SMV(DB, "Adjusting Diagonal Rod Length (", delta_diagonal_rod);
ECHO_MV(" -> ", delta_diagonal_rod + adj_dr);
......@@ -2104,19 +2123,19 @@ static void setup_for_endstop_move() {
//Check to see if auto calc is complete to within limits..
if (adj_dr_allowed == true) {
if ((bed_level_x >= -ac_prec) and (bed_level_x <= ac_prec)
and (bed_level_y >= -ac_prec) and (bed_level_y <= ac_prec)
and (bed_level_z >= -ac_prec) and (bed_level_z <= ac_prec)
and (bed_level_c >= -ac_prec) and (bed_level_c <= ac_prec)
and (bed_level_ox >= -ac_prec) and (bed_level_ox <= ac_prec)
and (bed_level_oy >= -ac_prec) and (bed_level_oy <= ac_prec)
and (bed_level_oz >= -ac_prec) and (bed_level_oz <= ac_prec)) loopcount = iterations;
if ((bed_level_x >= -start_prec) and (bed_level_x <= start_prec)
and (bed_level_y >= -start_prec) and (bed_level_y <= start_prec)
and (bed_level_z >= -start_prec) and (bed_level_z <= start_prec)
and (bed_level_c >= -start_prec) and (bed_level_c <= start_prec)
and (bed_level_ox >= -start_prec) and (bed_level_ox <= start_prec)
and (bed_level_oy >= -start_prec) and (bed_level_oy <= start_prec)
and (bed_level_oz >= -start_prec) and (bed_level_oz <= start_prec)) loopcount = iterations;
}
else {
if ((bed_level_x >= -ac_prec) and (bed_level_x <= ac_prec)
and (bed_level_y >= -ac_prec) and (bed_level_y <= ac_prec)
and (bed_level_z >= -ac_prec) and (bed_level_z <= ac_prec)
and (bed_level_c >= -ac_prec) and (bed_level_c <= ac_prec)) loopcount = iterations;
if ((bed_level_x >= -start_prec) and (bed_level_x <= start_prec)
and (bed_level_y >= -start_prec) and (bed_level_y <= start_prec)
and (bed_level_z >= -start_prec) and (bed_level_z <= start_prec)
and (bed_level_c >= -start_prec) and (bed_level_c <= start_prec)) loopcount = iterations;
}
//set delta radius and diagonal rod targets
......@@ -2178,7 +2197,7 @@ static void setup_for_endstop_move() {
if (bed_level_z < bed_level_oz) adj_RadiusC = 0.5;
if (bed_level_z > bed_level_oz) adj_RadiusC = -0.5;
#ifdef DEBUG_MESSAGES
ECHO_LMV(DB, "adj_RadiusC set to ",adj_RadiusC);
ECHO_LMV(DB, "adj_RadiusC set to ", adj_RadiusC);
#endif
}
}
......@@ -2190,7 +2209,7 @@ static void setup_for_endstop_move() {
if (bed_level_x < bed_level_ox) adj_RadiusA = 0.5;
if (bed_level_x > bed_level_ox) adj_RadiusA = -0.5;
#ifdef DEBUG_MESSAGES
ECHO_LMV(DB, "adj_RadiusA set to ",adj_RadiusA);
ECHO_LMV(DB, "adj_RadiusA set to ", adj_RadiusA);
#endif
}
}
......@@ -2202,7 +2221,7 @@ static void setup_for_endstop_move() {
if (bed_level_y < bed_level_oy) adj_RadiusB = 0.5;
if (bed_level_y > bed_level_oy) adj_RadiusB = -0.5;
#ifdef DEBUG_MESSAGES
ECHO_LMV(DB, "adj_RadiusB set to ",adj_RadiusB);
ECHO_LMV(DB, "adj_RadiusB set to ", adj_RadiusB);
#endif
}
}
......@@ -2223,11 +2242,11 @@ static void setup_for_endstop_move() {
if (((adj_RadiusC > 0) and (bed_level_z > bed_level_oz)) or ((adj_RadiusC < 0) and (bed_level_z < bed_level_oz))) adj_RadiusC = -(adj_RadiusC / 2);
//Delta radius adjustment complete?
if ((bed_level_c >= (adj_r_target - ac_prec)) and (bed_level_c <= (adj_r_target + ac_prec))) adj_r_done = true;
if ((bed_level_c >= (adj_r_target - start_prec)) and (bed_level_c <= (adj_r_target + start_prec))) adj_r_done = true;
else adj_r_done = false;
//Diag Rod adjustment complete?
if ((adj_dr_target >= (adj_r_target - ac_prec)) and (adj_dr_target <= (adj_r_target + ac_prec))) adj_dr_done = true;
if ((adj_dr_target >= (adj_r_target - start_prec)) and (adj_dr_target <= (adj_r_target + start_prec))) adj_dr_done = true;
else adj_dr_done = false;
#ifdef DEBUG_MESSAGES
......@@ -2238,27 +2257,30 @@ static void setup_for_endstop_move() {
ECHO_MV(" ox: ", bed_level_ox);
ECHO_MV(" oy: ", bed_level_oy);
ECHO_EMV(" oz: ", bed_level_oz);
ECHO_EMV("radius:", delta_radius, 4);
ECHO_EMV(" diagrod:", delta_diagonal_rod, 4);
ECHO_SMV(DB, "radius:", delta_radius, 4);
ECHO_EMV(" diagonal rod:", delta_diagonal_rod, 4);
ECHO_SM(DB, "Radius Adj Complete: ");
if (adj_r_done == true) ECHO_M("Yes");
else ECHO_M("No");
ECHO_M(" DiagRod Adj Complete: ");
ECHO_M(" Diagonal Rod Adj Complete: ");
if (adj_dr_done == true) ECHO_EM("Yes");
else ECHO_EM("No");
ECHO_SMV(DB, "RadiusA Error: ",radiusErrorA);
ECHO_MV(" (adjust: ",adj_RadiusA);
ECHO_SMV(DB, "RadiusA Error: ", radiusErrorA);
ECHO_MV(" (adjust: ", adj_RadiusA);
ECHO_EM(")");
ECHO_SMV(DB, "RadiusB Error: ",radiusErrorB);
ECHO_MV(" (adjust: ",adj_RadiusB);
ECHO_SMV(DB, "RadiusB Error: ", radiusErrorB);
ECHO_MV(" (adjust: ", adj_RadiusB);
ECHO_EM(")");
ECHO_SMV(DB, "RadiusC Error: ",radiusErrorC);
ECHO_MV(" (adjust: ",adj_RadiusC);
ECHO_SMV(DB, "RadiusC Error: ", radiusErrorC);
ECHO_MV(" (adjust: ", adj_RadiusC);
ECHO_EM(")");
ECHO_LMV(DB, "DeltaAlphaA: ",adj_AlphaA);
ECHO_LMV(DB, "DeltaAlphaB: ",adj_AlphaB);
ECHO_LMV(DB, "DeltaAlphaC: ",adj_AlphaC);
ECHO_LMV(DB, "DeltaAlphaA: ", adj_AlphaA);
ECHO_LMV(DB, "DeltaAlphaB: ", adj_AlphaB);
ECHO_LMV(DB, "DeltaAlphaC: ", adj_AlphaC);
#endif
//if (start_prec < ac_prec) start_prec += 0.01;
} while (((adj_r_done == false) or (adj_dr_done = false)) and (loopcount < iterations));
}
else {
......@@ -2276,23 +2298,24 @@ static void setup_for_endstop_move() {
//Check to see if autocalc is complete to within limits..
if (adj_dr_allowed == true) {
if ((bed_level_x >= -ac_prec) and (bed_level_x <= ac_prec)
and (bed_level_y >= -ac_prec) and (bed_level_y <= ac_prec)
and (bed_level_z >= -ac_prec) and (bed_level_z <= ac_prec)
and (bed_level_c >= -ac_prec) and (bed_level_c <= ac_prec)
and (bed_level_ox >= -ac_prec) and (bed_level_ox <= ac_prec)
and (bed_level_oy >= -ac_prec) and (bed_level_oy <= ac_prec)
and (bed_level_oz >= -ac_prec) and (bed_level_oz <= ac_prec)) loopcount = iterations;
if ((bed_level_x >= -start_prec) and (bed_level_x <= start_prec)
and (bed_level_y >= -start_prec) and (bed_level_y <= start_prec)
and (bed_level_z >= -start_prec) and (bed_level_z <= start_prec)
and (bed_level_c >= -start_prec) and (bed_level_c <= start_prec)
and (bed_level_ox >= -start_prec) and (bed_level_ox <= start_prec)
and (bed_level_oy >= -start_prec) and (bed_level_oy <= start_prec)
and (bed_level_oz >= -start_prec) and (bed_level_oz <= start_prec)) loopcount = iterations;
}
else {
if ((bed_level_x >= -ac_prec) and (bed_level_x <= ac_prec)
and (bed_level_y >= -ac_prec) and (bed_level_y <= ac_prec)
and (bed_level_z >= -ac_prec) and (bed_level_z <= ac_prec)
and (bed_level_c >= -ac_prec) and (bed_level_c <= ac_prec)) loopcount = iterations;
if ((bed_level_x >= -start_prec) and (bed_level_x <= start_prec)
and (bed_level_y >= -start_prec) and (bed_level_y <= start_prec)
and (bed_level_z >= -start_prec) and (bed_level_z <= start_prec)
and (bed_level_c >= -start_prec) and (bed_level_c <= start_prec)) loopcount = iterations;
}
}
loopcount ++;
if (start_prec < ac_prec) start_prec += 0.01;
manage_heater();
manage_inactivity();
......@@ -2303,21 +2326,15 @@ static void setup_for_endstop_move() {
ECHO_LM(DB, "Auto Calibration Complete");
LCD_MESSAGEPGM("Complete");
ECHO_LM(DB, "Issue M500 Command to save calibration settings to EPROM (if enabled)");
/*
if ((abs(delta_diagonal_rod - saved_delta_diagonal_rod) > 1) and (adj_dr_allowed == true)) {
ECHO_SMV(DB, "WARNING: The length of diagonal rods specified (", saved_delta_diagonal_rod);
ECHO_EV(" mm) appears to be incorrect");
ECHO_LM(DB, "If you have measured your rods and you believe that this value is correct, this could indicate");
ECHO_LM(DB,"excessive twisting movement of carriages and/or loose screws/joints on carriages or end effector");
}
*/
retract_z_probe();
//Restore saved variables
feedrate = saved_feedrate;
feedrate_multiplier = saved_feedrate_multiplier;
return;
}
#endif //DELTA
......@@ -3542,22 +3559,10 @@ inline void gcode_G28(boolean home_x = false, boolean home_y = false) {
feedrate_multiplier = 100;
if (code_seen('A')) {
if (code_has_value()) ac_prec = (float)(code_value() / 2);
if (code_has_value()) ac_prec = code_value();
delta_autocalibration(iterations);
return;
}
home_delta_axis();
deploy_z_probe();
//Probe all points
bed_probe_all();
//Show calibration report
calibration_report();
retract_z_probe();
//reset LCD alert message
lcd_reset_alert_level();
......@@ -4484,15 +4489,16 @@ inline void gcode_M115() {
ECHO_M(MSG_M115_REPORT);
}
/**
#ifdef ULTIPANEL
/**
* M117: Set LCD Status Message
*/
inline void gcode_M117() {
char* codepos = strchr_pointer + 5;
char* starpos = strchr(codepos, '*');
if (starpos) *starpos = '\0';
lcd_setstatus(codepos);
}
inline void gcode_M117() {
lcd_setstatus(strchr_pointer + 5);
}
#endif
/**
* M119: Output endstop states to serial output
......@@ -6049,11 +6055,11 @@ inline void gcode_T() {
}
}
/*****************************************************
*** Process Commands and dispatch them to handlers ***
******************************************************/
void process_commands() {
/**
* Process Commands and dispatch them to handlers
* This is called from the main loop()
*/
void process_next_command() {
if ((debugLevel & DEBUG_ECHO)) {
ECHO_LV(DB, command_queue[cmd_queue_index_r]);
......@@ -6203,7 +6209,7 @@ void process_commands() {
gcode_M18_M84(); break;
case 85: // M85
gcode_M85(); break;
case 92: // M92
case 92: // M92 Set the steps-per-unit for one or more axes
gcode_M92(); break;
case 104: // M104
gcode_M104(); break;
......@@ -6223,17 +6229,21 @@ void process_commands() {
gcode_M111(); break;
case 112: // M112 Emergency Stop
gcode_M112(); break;
case 114: // M114
case 114: // M114 Report current position
gcode_M114(); break;
case 115: // M115
case 115: // M115 Report capabilities
gcode_M115(); break;
#ifdef ULTIPANEL
case 117: // M117 display message
gcode_M117(); break;
case 119: // M119
#endif
case 119: // M119 Report endstop states
gcode_M119(); break;
case 120: // M120
case 120: // M120 Enable endstops
gcode_M120(); break;
case 121: // M121
case 121: // M121 Disable endstops
gcode_M121(); break;
#ifdef BARICUDA
......
......@@ -14,15 +14,14 @@
*
*/
#define EEPROM_VERSION "V21"
#define EEPROM_VERSION "V22"
/**
* V21 EEPROM Layout:
* V22 EEPROM Layout:
*
* ver
* M92 XYZ E0 E1 E2 E3 axis_steps_per_unit (x7)
* M203 XYZ E0 E1 E2 E3 max_feedrate (x7)
* M??? E0 E1 E2 E3 retraction_feedrate (x4)
* M201 XYZ E0 E1 E2 E3 max_acceleration_units_per_sq_second (x7)
* M204 P acceleration
* M204 R retract_acceleration
......@@ -45,7 +44,7 @@
* M666 R delta_radius
* M666 D delta_diagonal_rod
* M666 H Z max_pos
* M666 P z_probe_offset
* M666 P XYZ XYZ probe_offset (x3)
*
* Z_DUAL_ENDSTOPS
* M666 Z z_endstop_adj
......@@ -127,17 +126,16 @@ void _EEPROM_readData(int &pos, uint8_t* value, uint8_t size) {
#define EEPROM_WRITE_VAR(pos, value) _EEPROM_writeData(pos, (uint8_t*)&value, sizeof(value))
#define EEPROM_READ_VAR(pos, value) _EEPROM_readData(pos, (uint8_t*)&value, sizeof(value))
/**
* Store Configuration Settings - M500
*/
#define DUMMY_PID_VALUE 3000.0f
#define EEPROM_OFFSET 100
#define LIFETIME_EEPROM_OFFSET 600
#define LIFETIME_MAGIC "L99"
#ifdef EEPROM_SETTINGS
/**
* Store Configuration Settings - M500
*/
void Config_StoreSettings() {
float dummy = 0.0f;
char ver[4] = "000";
......@@ -145,7 +143,6 @@ void Config_StoreSettings() {
EEPROM_WRITE_VAR(i, ver); // invalidate data first
EEPROM_WRITE_VAR(i, axis_steps_per_unit);
EEPROM_WRITE_VAR(i, max_feedrate);
EEPROM_WRITE_VAR(i, max_retraction_feedrate);
EEPROM_WRITE_VAR(i, max_acceleration_units_per_sq_second);
EEPROM_WRITE_VAR(i, acceleration);
EEPROM_WRITE_VAR(i, retract_acceleration);
......@@ -293,7 +290,6 @@ void Config_RetrieveSettings() {
// version number match
EEPROM_READ_VAR(i, axis_steps_per_unit);
EEPROM_READ_VAR(i, max_feedrate);
EEPROM_READ_VAR(i, max_retraction_feedrate);
EEPROM_READ_VAR(i, max_acceleration_units_per_sq_second);
// steps per sq second need to be updated to agree with the units per sq second (as they are what is used in the planner)
......@@ -441,36 +437,33 @@ void Config_RetrieveSettings() {
* Reset Configuration Settings - M502
*/
void Config_ResetDefault() {
float tmp1[] = DEFAULT_AXIS_STEPS_PER_UNIT;
float tmp2[] = DEFAULT_MAX_FEEDRATE;
float tmp3[] = DEFAULT_RETRACTION_MAX_FEEDRATE;
long tmp4[] = DEFAULT_MAX_ACCELERATION;
long tmp3[] = DEFAULT_MAX_ACCELERATION;
#ifdef PIDTEMP
float tmp5[] = DEFAULT_Kp;
float tmp6[] = DEFAULT_Ki;
float tmp7[] = DEFAULT_Kd;
float tmp4[] = DEFAULT_Kp;
float tmp5[] = DEFAULT_Ki;
float tmp6[] = DEFAULT_Kd;
#endif // PIDTEMP
#if defined(HOTEND_OFFSET_X) && defined(HOTEND_OFFSET_Y)
float tmp8[] = HOTEND_OFFSET_X;
float tmp9[] = HOTEND_OFFSET_Y;
float tmp7[] = HOTEND_OFFSET_X;
float tmp8[] = HOTEND_OFFSET_Y;
#else
float tmp7[] = {0,0,0,0};
float tmp8[] = {0,0,0,0};
float tmp9[] = {0,0,0,0};
#endif
for (int i = 0; i < 3 + EXTRUDERS; i++) {
axis_steps_per_unit[i] = tmp1[i];
max_feedrate[i] = tmp2[i];
max_acceleration_units_per_sq_second[i] = tmp4[i];
max_acceleration_units_per_sq_second[i] = tmp3[i];
}
for (int i = 0; i < EXTRUDERS; i++) {
max_retraction_feedrate[i] = tmp3[i];
#if HOTENDS > 1
hotend_offset[X_AXIS][i] = tmp8[i];
hotend_offset[Y_AXIS][i] = tmp9[i];
hotend_offset[X_AXIS][i] = tmp7[i];
hotend_offset[Y_AXIS][i] = tmp8[i];
#endif
#ifdef SCARA
if (i < sizeof(axis_scaling) / sizeof(*axis_scaling))
......@@ -527,9 +520,9 @@ void Config_ResetDefault() {
#ifdef PIDTEMP
for (int e = 0; e < HOTENDS; e++)
{
Kp[e] = tmp5[e];
Ki[e] = scalePID_i(tmp6[e]);
Kd[e] = scalePID_d(tmp7[e]);
Kp[e] = tmp4[e];
Ki[e] = scalePID_i(tmp5[e]);
Kd[e] = scalePID_d(tmp6[e]);
}
// call updatePID (similar to when we have processed M301)
updatePID();
......@@ -623,21 +616,6 @@ void Config_PrintSettings(bool forReplay) {
#endif //EXTRUDERS > 1
ECHO_E;
if (!forReplay) {
ECHO_LM(DB, "Retraction Steps per unit:");
}
ECHO_SMV(DB, " E0 ",max_retraction_feedrate[0]);
#if EXTRUDERS > 1
ECHO_MV(" E1 ", max_retraction_feedrate[1]);
#if EXTRUDERS > 2
ECHO_MV(" E2 ", max_retraction_feedrate[2]);
#if EXTRUDERS > 3
ECHO_MV(" E3 ", max_retraction_feedrate[3]);
#endif //EXTRUDERS > 3
#endif //EXTRUDERS > 2
#endif //EXTRUDERS > 1
ECHO_E;
if (!forReplay) {
ECHO_LM(DB, "Maximum Acceleration (mm/s2):");
}
......
......@@ -4,8 +4,6 @@
#include "Configuration.h"
void Config_ResetDefault();
void load_lifetime_stats();
void save_lifetime_stats();
#ifndef DISABLE_M503
void Config_PrintSettings(bool forReplay=false);
......
......@@ -61,7 +61,6 @@
millis_t minsegmenttime;
float max_feedrate[3 + EXTRUDERS]; // Max speeds in mm per minute
float max_retraction_feedrate[EXTRUDERS]; // set the max speeds for retraction
float axis_steps_per_unit[3 + EXTRUDERS];
unsigned long max_acceleration_units_per_sq_second[3 + EXTRUDERS]; // Use M201 to override by software
float minimumfeedrate;
......@@ -411,7 +410,6 @@ void check_axes_activity() {
#ifdef LASERBEAM
tail_laser_ttl_modulation = block_buffer[block_index].laser_ttlmodulation;
#endif
while (block_index != block_buffer_head) {
block = &block_buffer[block_index];
for (int i=0; i<NUM_AXIS; i++) if (block->steps[i]) axis_active[i]++;
......@@ -432,11 +430,12 @@ void check_axes_activity() {
#ifdef FAN_KICKSTART_TIME
static millis_t fan_kick_end;
if (tail_fan_speed) {
millis_t ms = millis();
if (fan_kick_end == 0) {
// Just starting up fan - run at full power.
fan_kick_end = millis() + FAN_KICKSTART_TIME;
fan_kick_end = ms + FAN_KICKSTART_TIME;
tail_fan_speed = 255;
} else if (fan_kick_end > millis())
} else if (fan_kick_end > ms)
// Fan still spinning up.
tail_fan_speed = 255;
} else {
......@@ -463,7 +462,6 @@ void check_axes_activity() {
#endif
#endif
// add Laser TTL Modulation(PWM) Control
#ifdef LASERBEAM
analogWrite(LASER_TTL_PIN, tail_laser_ttl_modulation);
#endif
......@@ -572,8 +570,6 @@ float junction_deviation = 0.1;
block->valve_pressure = ValvePressure;
block->e_to_p_pressure = EtoPPressure;
#endif
// Add update block variables for LASER BEAM control
#ifdef LASERBEAM
block->laser_ttlmodulation = laser_ttl_modulation;
#endif
......@@ -635,7 +631,7 @@ float junction_deviation = 0.1;
#if EXTRUDERS > 1
case 1:
enable_e1();
g_uc_extruder_last_move[1] = BLOCK_BUFFER_SIZE*2;
g_uc_extruder_last_move[1] = BLOCK_BUFFER_SIZE * 2;
if (g_uc_extruder_last_move[0] == 0) disable_e0();
#if EXTRUDERS > 2
if (g_uc_extruder_last_move[2] == 0) disable_e2();
......@@ -647,7 +643,7 @@ float junction_deviation = 0.1;
#if EXTRUDERS > 2
case 2:
enable_e2();
g_uc_extruder_last_move[2] = BLOCK_BUFFER_SIZE*2;
g_uc_extruder_last_move[2] = BLOCK_BUFFER_SIZE * 2;
if (g_uc_extruder_last_move[0] == 0) disable_e0();
if (g_uc_extruder_last_move[1] == 0) disable_e1();
#if EXTRUDERS > 3
......@@ -657,7 +653,7 @@ float junction_deviation = 0.1;
#if EXTRUDERS > 3
case 3:
enable_e3();
g_uc_extruder_last_move[3] = BLOCK_BUFFER_SIZE*2;
g_uc_extruder_last_move[3] = BLOCK_BUFFER_SIZE * 2;
if (g_uc_extruder_last_move[0] == 0) disable_e0();
if (g_uc_extruder_last_move[1] == 0) disable_e1();
if (g_uc_extruder_last_move[2] == 0) disable_e2();
......@@ -794,24 +790,12 @@ float junction_deviation = 0.1;
// Calculate and limit speed in mm/sec for each axis
float current_speed[NUM_AXIS];
float speed_factor = 1.0; //factor <=1 do decrease speed
for (int i = 0; i < 3; i++) {
for (int i = 0; i < NUM_AXIS; i++) {
current_speed[i] = delta_mm[i] * inverse_second;
float cs = fabs(current_speed[i]), mf = max_feedrate[i];
if (cs > mf) speed_factor = min(speed_factor, mf / cs);
}
current_speed[E_AXIS] = delta_mm[E_AXIS] * inverse_second;
if (target[E_AXIS] < position[E_AXIS])
{
if(fabs(current_speed[E_AXIS]) > max_retraction_feedrate[extruder])
speed_factor = min(speed_factor, max_retraction_feedrate[extruder]/ fabs(current_speed[E_AXIS]));
}
else
{
if(fabs(current_speed[E_AXIS]) > max_feedrate[E_AXIS + extruder])
speed_factor = min(speed_factor, max_feedrate[E_AXIS + extruder] / fabs(current_speed[E_AXIS]));
}
// Max segement time in us.
#ifdef XY_FREQUENCY_LIMIT
#define MAX_FREQ_TIME (1000000.0 / XY_FREQUENCY_LIMIT)
......@@ -1026,11 +1010,15 @@ float junction_deviation = 0.1;
#endif // ENABLE_AUTO_BED_LEVELING
#ifdef ENABLE_AUTO_BED_LEVELING
void plan_set_position(float x, float y, float z, const float &e) {
void plan_set_position(float x, float y, float z, const float &e)
apply_rotation_xyz(plan_bed_level_matrix, x, y, z);
#else
void plan_set_position(const float &x, const float &y, const float &z, const float &e) {
void plan_set_position(const float &x, const float &y, const float &z, const float &e)
#endif // ENABLE_AUTO_BED_LEVELING
{
#ifdef ENABLE_AUTO_BED_LEVELING
apply_rotation_xyz(plan_bed_level_matrix, x, y, z);
#endif
float nx = position[X_AXIS] = lround(x * axis_steps_per_unit[X_AXIS]),
ny = position[Y_AXIS] = lround(y * axis_steps_per_unit[Y_AXIS]),
......
......@@ -120,7 +120,6 @@ void plan_set_e_position(const float &e);
extern millis_t minsegmenttime;
extern float max_feedrate[3 + EXTRUDERS]; // set the max speeds
extern float max_retraction_feedrate[EXTRUDERS]; // set the max speeds for retraction
extern float axis_steps_per_unit[3 + EXTRUDERS];
extern unsigned long max_acceleration_units_per_sq_second[3 + EXTRUDERS]; // Use M201 to override by software
extern float minimumfeedrate;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment