From 1bbdc1970601efe630db4afc6445886bb942abe3 Mon Sep 17 00:00:00 2001 From: Emanuele Caruso Date: Sun, 22 May 2011 19:52:00 +0200 Subject: Time for move is now correctly calculated in the XYZ space. Fixed a safety bug that caused heating management not to be performed in case DISABLE_CHECK_DURING_MOVE was enabled. Fixed a bug in the moving axis start speed checking. --- Tonokip_Firmware/Tonokip_Firmware.pde | 326 +++++++++++++++------------------- Tonokip_Firmware/configuration.h | 6 +- 2 files changed, 146 insertions(+), 186 deletions(-) diff --git a/Tonokip_Firmware/Tonokip_Firmware.pde b/Tonokip_Firmware/Tonokip_Firmware.pde index e708910..f71d6d9 100644 --- a/Tonokip_Firmware/Tonokip_Firmware.pde +++ b/Tonokip_Firmware/Tonokip_Firmware.pde @@ -57,11 +57,12 @@ //Stepper Movement Variables -bool direction_x, direction_y, direction_z, direction_e; +char axis_codes[NUM_AXIS] = {'X', 'Y', 'Z', 'E'}; +bool move_direction[NUM_AXIS]; const int STEP_PIN[NUM_AXIS] = {X_STEP_PIN, Y_STEP_PIN, Z_STEP_PIN, E_STEP_PIN}; unsigned long axis_previous_micros[NUM_AXIS]; unsigned long previous_micros = 0, previous_millis_heater, previous_millis_bed_heater; -unsigned long x_steps_to_take, y_steps_to_take, z_steps_to_take, e_steps_to_take; +unsigned long move_steps_to_take[NUM_AXIS]; #ifdef RAMP_ACCELERATION unsigned long axis_max_interval[] = {100000000.0 / (max_start_speed_units_per_second[0] * axis_steps_per_unit[0]), 100000000.0 / (max_start_speed_units_per_second[1] * axis_steps_per_unit[1]), @@ -89,15 +90,18 @@ unsigned long x_steps_to_take, y_steps_to_take, z_steps_to_take, e_steps_to_take #endif boolean acceleration_enabled = false, accelerating = false; unsigned long interval; -float destination_x = 0.0, destination_y = 0.0, destination_z = 0.0, destination_e = 0.0; -float current_x = 0.0, current_y = 0.0, current_z = 0.0, current_e = 0.0; +float destination[NUM_AXIS] = {0.0, 0.0, 0.0, 0.0}; +float current_position[NUM_AXIS] = {0.0, 0.0, 0.0, 0.0}; long axis_interval[NUM_AXIS]; // for speed delay -float feedrate = 1500, next_feedrate, z_feedrate, saved_feedrate; +float feedrate = 1500, next_feedrate, saved_feedrate; float time_for_move; long gcode_N, gcode_LastN; bool relative_mode = false; //Determines Absolute or Relative Coordinates bool relative_mode_e = false; //Determines Absolute or Relative E Codes while in Absolute Coordinates mode. E is always relative in Relative Coordinates mode. long timediff = 0; +//experimental feedrate calc +float d = 0; +float axis_diff[NUM_AXIS] = {0, 0, 0, 0}; #ifdef STEP_DELAY_RATIO long long_step_delay_ratio = STEP_DELAY_RATIO * 100; #endif @@ -442,9 +446,6 @@ inline bool code_seen(char code) strchr_pointer = strchr(cmdbuffer[bufindr], code); return (strchr_pointer != NULL); //Return True if a character was found } - //experimental feedrate calc -float d = 0; -float xdiff = 0, ydiff = 0, zdiff = 0, ediff = 0; inline void process_commands() { @@ -457,6 +458,9 @@ inline void process_commands() { case 0: // G0 -> G1 case 1: // G1 + #ifdef DISABLE_CHECK_DURING_ACC || DISABLE_CHECK_DURING_MOVE + manage_heater(); + #endif get_coordinates(); // For X Y Z E F prepare_move(); previous_millis_cmd = millis(); @@ -474,68 +478,64 @@ inline void process_commands() break; case 28: //G28 Home all Axis one at a time saved_feedrate = feedrate; - destination_x = 0; - current_x = 0; - destination_y = 0; - current_y = 0; - destination_z = 0; - current_z = 0; - destination_e = 0; - current_e = 0; + for(int i=0; i < NUM_AXIS; i++) { + destination[i] = 0; + current_position[i] = 0; + } feedrate = 0; if((X_MIN_PIN > -1 && X_HOME_DIR==-1) || (X_MAX_PIN > -1 && X_HOME_DIR==1)) { - current_x = 0; - destination_x = 1.5 * X_MAX_LENGTH * X_HOME_DIR; + current_position[0] = 0; + destination[0] = 1.5 * X_MAX_LENGTH * X_HOME_DIR; feedrate = max_start_speed_units_per_second[0] * 60; prepare_move(); - current_x = 0; - destination_x = -1 * X_HOME_DIR; + current_position[0] = 0; + destination[0] = -1 * X_HOME_DIR; prepare_move(); - destination_x = 10 * X_HOME_DIR; + destination[0] = 10 * X_HOME_DIR; prepare_move(); - current_x = 0; - destination_x = 0; + current_position[0] = 0; + destination[0] = 0; feedrate = 0; } if((Y_MIN_PIN > -1 && Y_HOME_DIR==-1) || (Y_MAX_PIN > -1 && Y_HOME_DIR==1)) { - current_y = 0; - destination_y = 1.5 * Y_MAX_LENGTH * Y_HOME_DIR; + current_position[1] = 0; + destination[1] = 1.5 * Y_MAX_LENGTH * Y_HOME_DIR; feedrate = max_start_speed_units_per_second[1] * 60; prepare_move(); - current_y = 0; - destination_y = -1 * Y_HOME_DIR; + current_position[1] = 0; + destination[1] = -1 * Y_HOME_DIR; prepare_move(); - destination_y = 10 * Y_HOME_DIR; + destination[1] = 10 * Y_HOME_DIR; prepare_move(); - current_y = 0; - destination_y = 0; + current_position[1] = 0; + destination[1] = 0; feedrate = 0; } if((Z_MIN_PIN > -1 && Z_HOME_DIR==-1) || (Z_MAX_PIN > -1 && Z_HOME_DIR==1)) { - current_z = 0; - destination_z = 1.5 * Z_MAX_LENGTH * Z_HOME_DIR; - feedrate = max_z_feedrate/2; + current_position[2] = 0; + destination[2] = 1.5 * Z_MAX_LENGTH * Z_HOME_DIR; + feedrate = max_feedrate[2]/2; prepare_move(); - current_z = 0; - destination_z = -1 * Z_HOME_DIR; + current_position[2] = 0; + destination[2] = -1 * Z_HOME_DIR; prepare_move(); - destination_z = 10 * Z_HOME_DIR; + destination[2] = 10 * Z_HOME_DIR; prepare_move(); - current_z = 0; - destination_z = 0; + current_position[2] = 0; + destination[2] = 0; feedrate = 0; } @@ -549,10 +549,9 @@ inline void process_commands() relative_mode = true; break; case 92: // G92 - if(code_seen('X')) current_x = code_value(); - if(code_seen('Y')) current_y = code_value(); - if(code_seen('Z')) current_z = code_value(); - if(code_seen('E')) current_e = code_value(); + for(int i=0; i < NUM_AXIS; i++) { + if(code_seen(axis_codes[i])) current_position[i] = code_value(); + } break; } @@ -750,10 +749,10 @@ inline void process_commands() if(PS_ON_PIN > -1) pinMode(PS_ON_PIN,INPUT); //Floating break; case 82: - relative_mode_e = false; + axis_relative_modes[3] = false; break; case 83: - relative_mode_e = true; + axis_relative_modes[3] = true; break; case 84: if(code_seen('S')){ stepper_inactive_time = code_value() * 1000; } @@ -764,10 +763,9 @@ inline void process_commands() max_inactive_time = code_value() * 1000; break; case 92: // M92 - if(code_seen('X')) axis_steps_per_unit[0] = code_value(); - if(code_seen('Y')) axis_steps_per_unit[1] = code_value(); - if(code_seen('Z')) axis_steps_per_unit[2] = code_value(); - if(code_seen('E')) axis_steps_per_unit[3] = code_value(); + for(int i=0; i < NUM_AXIS; i++) { + if(code_seen(axis_codes[i])) axis_steps_per_unit[i] = code_value(); + } //Update start speed intervals and axis order. TODO: refactor axis_max_interval[] calculation into a function, as it // should also be used in setup() as well @@ -784,27 +782,25 @@ inline void process_commands() break; case 114: // M114 Serial.print("X:"); - Serial.print(current_x); + Serial.print(current_position[0]); Serial.print("Y:"); - Serial.print(current_y); + Serial.print(current_position[1]); Serial.print("Z:"); - Serial.print(current_z); + Serial.print(current_position[2]); Serial.print("E:"); - Serial.println(current_e); + Serial.println(current_position[3]); break; #ifdef RAMP_ACCELERATION //TODO: update for all axis, use for loop case 201: // M201 - if(code_seen('X')) axis_steps_per_sqr_second[0] = code_value() * axis_steps_per_unit[0]; - if(code_seen('Y')) axis_steps_per_sqr_second[1] = code_value() * axis_steps_per_unit[1]; - if(code_seen('Z')) axis_steps_per_sqr_second[2] = code_value() * axis_steps_per_unit[2]; - if(code_seen('E')) axis_steps_per_sqr_second[3] = code_value() * axis_steps_per_unit[3]; + for(int i=0; i < NUM_AXIS; i++) { + if(code_seen(axis_codes[i])) axis_steps_per_sqr_second[i] = code_value() * axis_steps_per_unit[i]; + } break; case 202: // M202 - if(code_seen('X')) axis_travel_steps_per_sqr_second[0] = code_value() * axis_steps_per_unit[0]; - if(code_seen('Y')) axis_travel_steps_per_sqr_second[1] = code_value() * axis_steps_per_unit[1]; - if(code_seen('Z')) axis_travel_steps_per_sqr_second[2] = code_value() * axis_steps_per_unit[2]; - if(code_seen('E')) axis_travel_steps_per_sqr_second[3] = code_value() * axis_steps_per_unit[3]; + for(int i=0; i < NUM_AXIS; i++) { + if(code_seen(axis_codes[i])) axis_travel_steps_per_sqr_second[i] = code_value() * axis_steps_per_unit[i]; + } break; #endif } @@ -840,14 +836,10 @@ inline void ClearToSend() inline void get_coordinates() { - if(code_seen('X')) destination_x = (float)code_value() + relative_mode*current_x; - else destination_x = current_x; //Are these else lines really needed? - if(code_seen('Y')) destination_y = (float)code_value() + relative_mode*current_y; - else destination_y = current_y; - if(code_seen('Z')) destination_z = (float)code_value() + relative_mode*current_z; - else destination_z = current_z; - if(code_seen('E')) destination_e = (float)code_value() + (relative_mode_e || relative_mode)*current_e; - else destination_e = current_e; + for(int i=0; i < NUM_AXIS; i++) { + if(code_seen(axis_codes[i])) destination[i] = (float)code_value() + (axis_relative_modes[i] || relative_mode)*current_position[i]; + else destination[i] = current_position[i]; //Are these else lines really needed? + } if(code_seen('F')) { next_feedrate = code_value(); if(next_feedrate > 0.0) feedrate = next_feedrate; @@ -857,123 +849,91 @@ inline void get_coordinates() inline void prepare_move() { //Find direction - if(destination_x >= current_x) direction_x = 1; - else direction_x = 0; - if(destination_y >= current_y) direction_y = 1; - else direction_y = 0; - if(destination_z >= current_z) direction_z = 1; - else direction_z = 0; - if(destination_e >= current_e) direction_e = 1; - else direction_e = 0; + for(int i=0; i < NUM_AXIS; i++) { + if(destination[i] >= current_position[i]) move_direction[i] = 1; + else move_direction[i] = 0; + } if (min_software_endstops) { - if (destination_x < 0) destination_x = 0.0; - if (destination_y < 0) destination_y = 0.0; - if (destination_z < 0) destination_z = 0.0; + if (destination[0] < 0) destination[0] = 0.0; + if (destination[1] < 0) destination[1] = 0.0; + if (destination[2] < 0) destination[2] = 0.0; } if (max_software_endstops) { - if (destination_x > X_MAX_LENGTH) destination_x = X_MAX_LENGTH; - if (destination_y > Y_MAX_LENGTH) destination_y = Y_MAX_LENGTH; - if (destination_z > Z_MAX_LENGTH) destination_z = Z_MAX_LENGTH; + if (destination[0] > X_MAX_LENGTH) destination[0] = X_MAX_LENGTH; + if (destination[1] > Y_MAX_LENGTH) destination[1] = Y_MAX_LENGTH; + if (destination[2] > Z_MAX_LENGTH) destination[2] = Z_MAX_LENGTH; } - - if(feedrate > max_feedrate) feedrate = max_feedrate; - if(feedrate > max_z_feedrate) z_feedrate = max_z_feedrate; - else z_feedrate = feedrate; - - xdiff = (destination_x - current_x); - ydiff = (destination_y - current_y); - zdiff = (destination_z - current_z); - ediff = (destination_e - current_e); - x_steps_to_take = abs(xdiff) * axis_steps_per_unit[0]; - y_steps_to_take = abs(ydiff) * axis_steps_per_unit[1]; - z_steps_to_take = abs(zdiff) * axis_steps_per_unit[2]; - e_steps_to_take = abs(ediff) * axis_steps_per_unit[3]; + for(int i=0; i < NUM_AXIS; i++) { + axis_diff[i] = destination[i] - current_position[i]; + move_steps_to_take[i] = abs(axis_diff[i]) * axis_steps_per_unit[i]; + } if(feedrate < 10) feedrate = 10; - /* - //experimental feedrate calc - if(abs(xdiff) > 0.1 && abs(ydiff) > 0.1) - d = sqrt(xdiff * xdiff + ydiff * ydiff); - else if(abs(xdiff) > 0.1) - d = abs(xdiff); - else if(abs(ydiff) > 0.1) - d = abs(ydiff); - else if(abs(zdiff) > 0.05) - d = abs(zdiff); - else if(abs(ediff) > 0.1) - d = abs(ediff); - else d = 1; //extremely slow move, should be okay for moves under 0.1mm - time_for_move = (xdiff / (feedrate / 60000000) ); - //time = 60000000 * dist / feedrate - //int feedz = (60000000 * zdiff) / time_for_move; - //if(feedz > maxfeed) - */ - #define X_TIME_FOR_MOVE ((float)x_steps_to_take / (axis_steps_per_unit[0]*feedrate/60000000)) - #define Y_TIME_FOR_MOVE ((float)y_steps_to_take / (axis_steps_per_unit[1]*feedrate/60000000)) - #define Z_TIME_FOR_MOVE ((float)z_steps_to_take / (axis_steps_per_unit[2]*z_feedrate/60000000)) - #define E_TIME_FOR_MOVE ((float)e_steps_to_take / (axis_steps_per_unit[3]*feedrate/60000000)) - time_for_move = max(X_TIME_FOR_MOVE, Y_TIME_FOR_MOVE); - time_for_move = max(time_for_move, Z_TIME_FOR_MOVE); - if(time_for_move <= 0) time_for_move = max(time_for_move, E_TIME_FOR_MOVE); - - if(x_steps_to_take) axis_interval[0] = time_for_move / x_steps_to_take * 100; - if(y_steps_to_take) axis_interval[1] = time_for_move / y_steps_to_take * 100; - if(z_steps_to_take) axis_interval[2] = time_for_move / z_steps_to_take * 100; - if(e_steps_to_take && (x_steps_to_take + y_steps_to_take <= 0) ) axis_interval[3] = time_for_move / e_steps_to_take * 100; + //Feedrate calc based on XYZ travel distance + float xy_d; + if(abs(axis_diff[0]) > 0 || abs(axis_diff[1]) > 0 || abs(axis_diff[2])) { + xy_d = sqrt(axis_diff[0] * axis_diff[0] + axis_diff[1] * axis_diff[1]); + d = sqrt(xy_d * xy_d + axis_diff[2] * axis_diff[2]); + } + else if(abs(axis_diff[3]) > 0) + d = abs(axis_diff[3]); + #ifdef DEBUG_PREPARE_MOVE + else { + log_message("_PREPARE_MOVE - No steps to take!"); + } + #endif + time_for_move = (d / (feedrate / 60000000.0) ); + //Check max feedrate for each axis is not violated, update time_for_move if necessary + for(int i = 0; i < NUM_AXIS; i++) { + if(move_steps_to_take[i] && abs(axis_diff[i]) / (time_for_move / 60000000.0) > max_feedrate[i]) { + time_for_move = time_for_move / max_feedrate[i] * (abs(axis_diff[i]) / (time_for_move / 60000000.0)); + } + } + //Calculate the full speed stepper interval for each axis + for(int i=0; i < NUM_AXIS; i++) { + if(move_steps_to_take[i]) axis_interval[i] = time_for_move / move_steps_to_take[i] * 100; + } - #ifdef DEBUG_PREPARE_MOVE - Serial.print("destination_x: "); Serial.println(destination_x); - Serial.print("current_x: "); Serial.println(current_x); - Serial.print("x_steps_to_take: "); Serial.println(x_steps_to_take); - Serial.print("X_TIME_FOR_MVE: "); Serial.println(X_TIME_FOR_MOVE); - Serial.print("axis_interval[0]: "); Serial.println(axis_interval[0]); - Serial.println(""); - Serial.print("destination_y: "); Serial.println(destination_y); - Serial.print("current_y: "); Serial.println(current_y); - Serial.print("y_steps_to_take: "); Serial.println(y_steps_to_take); - Serial.print("Y_TIME_FOR_MVE: "); Serial.println(Y_TIME_FOR_MOVE); - Serial.print("axis_interval[1]: "); Serial.println(axis_interval[1]); - Serial.println(""); - Serial.print("destination_z: "); Serial.println(destination_z); - Serial.print("current_z: "); Serial.println(current_z); - Serial.print("z_steps_to_take: "); Serial.println(z_steps_to_take); - Serial.print("Z_TIME_FOR_MVE: "); Serial.println(Z_TIME_FOR_MOVE); - Serial.print("axis_interval[2]: "); Serial.println(axis_interval[2]); - Serial.println(""); - Serial.print("destination_e: "); Serial.println(destination_e); - Serial.print("current_e: "); Serial.println(current_e); - Serial.print("e_steps_to_take: "); Serial.println(e_steps_to_take); - Serial.print("E_TIME_FOR_MVE: "); Serial.println(E_TIME_FOR_MOVE); - Serial.print("axis_interval[3]: "); Serial.println(axis_interval[3]); - Serial.println(""); + #ifdef DEBUG_PREPARE_MOVE + log_float("_PREPARE_MOVE - Move distance on the XY plane", xy_d); + log_float("_PREPARE_MOVE - Move distance on the XYZ space", d); + log_float("_PREPARE_MOVE - Commanded feedrate", feedrate); + log_float("_PREPARE_MOVE - Constant full speed move time", time_for_move); + log_float_array("_PREPARE_MOVE - Destination", destination, NUM_AXIS); + log_float_array("_PREPARE_MOVE - Current position", current_position, NUM_AXIS); + log_ulong_array("_PREPARE_MOVE - Steps to take", move_steps_to_take, NUM_AXIS); + log_long_array("_PREPARE_MOVE - Axes full speed intervals", axis_interval, NUM_AXIS); #endif - unsigned long axis_steps_to_take[NUM_AXIS] = {x_steps_to_take, y_steps_to_take, z_steps_to_take, e_steps_to_take}; - linear_move(axis_steps_to_take); // make the move + + unsigned long move_steps[NUM_AXIS]; + for(int i=0; i < NUM_AXIS; i++) + move_steps[i] = move_steps_to_take[i]; + linear_move(move_steps); // make the move } void linear_move(unsigned long axis_steps_remaining[]) // make linear move with preset speeds and destinations, see G0 and G1 { //Determine direction of movement - if (destination_x > current_x) digitalWrite(X_DIR_PIN,!INVERT_X_DIR); + if (destination[0] > current_position[0]) digitalWrite(X_DIR_PIN,!INVERT_X_DIR); else digitalWrite(X_DIR_PIN,INVERT_X_DIR); - if (destination_y > current_y) digitalWrite(Y_DIR_PIN,!INVERT_Y_DIR); + if (destination[1] > current_position[1]) digitalWrite(Y_DIR_PIN,!INVERT_Y_DIR); else digitalWrite(Y_DIR_PIN,INVERT_Y_DIR); - if (destination_z > current_z) digitalWrite(Z_DIR_PIN,!INVERT_Z_DIR); + if (destination[2] > current_position[2]) digitalWrite(Z_DIR_PIN,!INVERT_Z_DIR); else digitalWrite(Z_DIR_PIN,INVERT_Z_DIR); - if (destination_e > current_e) digitalWrite(E_DIR_PIN,!INVERT_E_DIR); + if (destination[3] > current_position[3]) digitalWrite(E_DIR_PIN,!INVERT_E_DIR); else digitalWrite(E_DIR_PIN,INVERT_E_DIR); - if(X_MIN_PIN > -1) if(!direction_x) if(digitalRead(X_MIN_PIN) != ENDSTOPS_INVERTING) axis_steps_remaining[0]=0; - if(Y_MIN_PIN > -1) if(!direction_y) if(digitalRead(Y_MIN_PIN) != ENDSTOPS_INVERTING) axis_steps_remaining[1]=0; - if(Z_MIN_PIN > -1) if(!direction_z) if(digitalRead(Z_MIN_PIN) != ENDSTOPS_INVERTING) axis_steps_remaining[2]=0; - if(X_MAX_PIN > -1) if(direction_x) if(digitalRead(X_MAX_PIN) != ENDSTOPS_INVERTING) axis_steps_remaining[0]=0; - if(Y_MAX_PIN > -1) if(direction_y) if(digitalRead(Y_MAX_PIN) != ENDSTOPS_INVERTING) axis_steps_remaining[1]=0; - if(Z_MAX_PIN > -1) if(direction_z) if(digitalRead(Z_MAX_PIN) != ENDSTOPS_INVERTING) axis_steps_remaining[2]=0; + if(X_MIN_PIN > -1) if(!move_direction[0]) if(digitalRead(X_MIN_PIN) != ENDSTOPS_INVERTING) axis_steps_remaining[0]=0; + if(Y_MIN_PIN > -1) if(!move_direction[1]) if(digitalRead(Y_MIN_PIN) != ENDSTOPS_INVERTING) axis_steps_remaining[1]=0; + if(Z_MIN_PIN > -1) if(!move_direction[2]) if(digitalRead(Z_MIN_PIN) != ENDSTOPS_INVERTING) axis_steps_remaining[2]=0; + if(X_MAX_PIN > -1) if(move_direction[0]) if(digitalRead(X_MAX_PIN) != ENDSTOPS_INVERTING) axis_steps_remaining[0]=0; + if(Y_MAX_PIN > -1) if(move_direction[1]) if(digitalRead(Y_MAX_PIN) != ENDSTOPS_INVERTING) axis_steps_remaining[1]=0; + if(Z_MAX_PIN > -1) if(move_direction[2]) if(digitalRead(Z_MAX_PIN) != ENDSTOPS_INVERTING) axis_steps_remaining[2]=0; //Only enable axis that are moving. If the axis doesn't need to move then it can stay disabled depending on configuration. @@ -999,6 +959,8 @@ void linear_move(unsigned long axis_steps_remaining[]) // make linear move with #ifdef DEBUG_BRESENHAM log_int("_BRESENHAM - Primary axis", primary_axis); log_int("_BRESENHAM - Primary axis full speed interval", interval); + log_uint_array("_BRESENHAM - Deltas", delta, NUM_AXIS); + log_int_array("_BRESENHAM - Errors", axis_error, NUM_AXIS); #endif //If acceleration is enabled, do some Bresenham calculations depending on which axis will lead it. @@ -1023,20 +985,17 @@ void linear_move(unsigned long axis_steps_remaining[]) // make linear move with } for(int i = 0; i < NUM_AXIS; i++) if(axis_steps_remaining[i] >0) { - new_axis_max_intervals[i] = slowest_start_axis_max_interval * axis_steps_remaining[i] / axis_steps_remaining[slowest_start_axis]; + new_axis_max_intervals[i] = slowest_start_axis_max_interval * axis_steps_remaining[slowest_start_axis] / axis_steps_remaining[i]; if(i == primary_axis) { max_interval = new_axis_max_intervals[i]; min_speed_steps_per_second = 100000000 / max_interval; } } - #ifdef DEBUG_RAMP_ACCELERATION - log_ulong_array("_RAMP_ACCELERATION - Actual step intervals at move start", new_axis_max_intervals, NUM_AXIS); - #endif //Calculate slowest axis plateau time float slowest_axis_plateau_time = 0; for(int i=0; i < NUM_AXIS ; i++) { if(axis_steps_remaining[i] > 0) { - if(e_steps_to_take > 0 && axis_steps_remaining[i] > 0) slowest_axis_plateau_time = max(slowest_axis_plateau_time, + if(move_steps_to_take[3] > 0 && axis_steps_remaining[i] > 0) slowest_axis_plateau_time = max(slowest_axis_plateau_time, (100000000.0 / axis_interval[i] - 100000000.0 / new_axis_max_intervals[i]) / (float) axis_steps_per_sqr_second[i]); else if(axis_steps_remaining[i] > 0) slowest_axis_plateau_time = max(slowest_axis_plateau_time, (100000000.0 / axis_interval[i] - 100000000.0 / new_axis_max_intervals[i]) / (float) axis_travel_steps_per_sqr_second[i]); @@ -1045,11 +1004,16 @@ void linear_move(unsigned long axis_steps_remaining[]) // make linear move with //Now we can calculate the new primary axis acceleration, so that the slowest axis max acceleration is not violated steps_per_sqr_second = (100000000.0 / axis_interval[primary_axis] - 100000000.0 / new_axis_max_intervals[primary_axis]) / slowest_axis_plateau_time; plateau_steps = (long) ((steps_per_sqr_second / 2.0 * slowest_axis_plateau_time + min_speed_steps_per_second) * slowest_axis_plateau_time); + #ifdef DEBUG_RAMP_ACCELERATION + log_int("_RAMP_ACCELERATION - Start speed limiting axis", slowest_start_axis); + log_ulong("_RAMP_ACCELERATION - Limiting axis start interval", slowest_start_axis_max_interval); + log_ulong_array("_RAMP_ACCELERATION - Actual step intervals at move start", new_axis_max_intervals, NUM_AXIS); + #endif #endif #ifdef EXP_ACCELERATION unsigned long virtual_full_velocity_steps; unsigned long full_velocity_steps; - if(e_steps_to_take > 0) virtual_full_velocity_steps = axis_virtual_full_velocity_steps[primary_axis]; + if(move_steps_to_take[3] > 0) virtual_full_velocity_steps = axis_virtual_full_velocity_steps[primary_axis]; else virtual_full_velocity_steps = axis_travel_virtual_full_velocity_steps[primary_axis]; full_velocity_steps = min(virtual_full_velocity_steps, (delta[primary_axis] - axis_min_constant_speed_steps[primary_axis]) / 2); max_interval = axis_max_interval[primary_axis]; @@ -1163,12 +1127,12 @@ void linear_move(unsigned long axis_steps_remaining[]) // make linear move with //If there are x or y steps remaining, perform Bresenham algorithm if(axis_steps_remaining[primary_axis]) { - if(X_MIN_PIN > -1) if(!direction_x) if(digitalRead(X_MIN_PIN) != ENDSTOPS_INVERTING) break; - if(Y_MIN_PIN > -1) if(!direction_y) if(digitalRead(Y_MIN_PIN) != ENDSTOPS_INVERTING) break; - if(X_MAX_PIN > -1) if(direction_x) if(digitalRead(X_MAX_PIN) != ENDSTOPS_INVERTING) break; - if(Y_MAX_PIN > -1) if(direction_y) if(digitalRead(Y_MAX_PIN) != ENDSTOPS_INVERTING) break; - if(Z_MIN_PIN > -1) if(!direction_z) if(digitalRead(Z_MIN_PIN) != ENDSTOPS_INVERTING) break; - if(Z_MAX_PIN > -1) if(direction_z) if(digitalRead(Z_MAX_PIN) != ENDSTOPS_INVERTING) break; + if(X_MIN_PIN > -1) if(!move_direction[0]) if(digitalRead(X_MIN_PIN) != ENDSTOPS_INVERTING) break; + if(Y_MIN_PIN > -1) if(!move_direction[1]) if(digitalRead(Y_MIN_PIN) != ENDSTOPS_INVERTING) break; + if(X_MAX_PIN > -1) if(move_direction[0]) if(digitalRead(X_MAX_PIN) != ENDSTOPS_INVERTING) break; + if(Y_MAX_PIN > -1) if(move_direction[1]) if(digitalRead(Y_MAX_PIN) != ENDSTOPS_INVERTING) break; + if(Z_MIN_PIN > -1) if(!move_direction[2]) if(digitalRead(Z_MIN_PIN) != ENDSTOPS_INVERTING) break; + if(Z_MAX_PIN > -1) if(move_direction[2]) if(digitalRead(Z_MAX_PIN) != ENDSTOPS_INVERTING) break; timediff = micros() * 100 - axis_previous_micros[primary_axis]; while(timediff >= interval && axis_steps_remaining[primary_axis] > 0) { steps_done++; @@ -1201,14 +1165,10 @@ void linear_move(unsigned long axis_steps_remaining[]) // make linear move with if(DISABLE_E) disable_e(); // Update current position partly based on direction, we probably can combine this with the direction code above... - if (destination_x > current_x) current_x = current_x + x_steps_to_take / axis_steps_per_unit[0]; - else current_x = current_x - x_steps_to_take / axis_steps_per_unit[0]; - if (destination_y > current_y) current_y = current_y + y_steps_to_take / axis_steps_per_unit[1]; - else current_y = current_y - y_steps_to_take / axis_steps_per_unit[1]; - if (destination_z > current_z) current_z = current_z + z_steps_to_take / axis_steps_per_unit[2]; - else current_z = current_z - z_steps_to_take / axis_steps_per_unit[2]; - if (destination_e > current_e) current_e = current_e + e_steps_to_take / axis_steps_per_unit[3]; - else current_e = current_e - e_steps_to_take / axis_steps_per_unit[3]; + for(int i=0; i < NUM_AXIS; i++) { + if (destination[i] > current_position[i]) current_position[i] = current_position[i] + move_steps_to_take[i] / axis_steps_per_unit[i]; + else current_position[i] = current_position[i] - move_steps_to_take[i] / axis_steps_per_unit[i]; + } } inline void do_step_update_micros(int axis) { @@ -1536,7 +1496,7 @@ if( (millis()-previous_millis_cmd) > stepper_inactive_time ) if(stepper_inactiv #ifdef DEBUG void log_message(char* message) { - Serial.println(message); + Serial.print("DEBUG"); Serial.println(message); } void log_int(char* message, int value) { diff --git a/Tonokip_Firmware/configuration.h b/Tonokip_Firmware/configuration.h index 55e9872..61072dc 100644 --- a/Tonokip_Firmware/configuration.h +++ b/Tonokip_Firmware/configuration.h @@ -10,7 +10,7 @@ //Min step delay in microseconds. If you are experiencing missing steps, try to raise the delay microseconds, but be aware this // If you enable this, make sure STEP_DELAY_RATIO is disabled. -#define STEP_DELAY_MICROS 1 +//#define STEP_DELAY_MICROS 1 //Step delay over interval ratio. If you are still experiencing missing steps, try to uncomment the following line, but be aware this //If you enable this, make sure STEP_DELAY_MICROS is disabled. @@ -96,9 +96,9 @@ float min_constant_speed_units = 2; // the minimum units of an accelerated move //Calibration variables const int NUM_AXIS = 4; // The axis order in all axis related arrays is X, Y, Z, E +bool axis_relative_modes[] = {false, false, false, true}; float axis_steps_per_unit[] = {80.376,80.376,3200/1.25,16}; -float max_feedrate = 200000; // mm/min, acceleration! -float max_z_feedrate = 180; // mm/min, acceleration! +float max_feedrate[] = {200000, 200000, 240, 500000}; //mmm, acceleration! //float x_steps_per_unit = 10.047; //float y_steps_per_unit = 10.047; -- cgit v1.2.1