From 48cd2aa65596d6a5345bc55f2344d25d993ab9e7 Mon Sep 17 00:00:00 2001 From: Patrick Felixberger Date: Tue, 28 Jan 2020 20:11:40 +0100 Subject: [PATCH] ATTENTION: New config version!! Save your settings, before updating!! Added experimental support for rotary axis (5 axis) --- GRBL_Advanced.elay | 14 +++---- HAL/GPIO/GPIO.c | 2 +- HAL/GPIO/GPIO.h | 8 ++++ grbl/Config.h | 7 +++- grbl/GCode.c | 11 +++--- grbl/GCode.h | 4 +- grbl/MotionControl.c | 4 +- grbl/MotionControl.h | 2 + grbl/Planner.c | 2 + grbl/Report.c | 12 +++++- grbl/Settings.c | 23 +++++++++-- grbl/Settings.h | 2 +- grbl/Stepper.c | 92 +++++++++++++++++++++++++++++++++++++++++++- grbl/System.c | 8 ++++ grbl/defaults.h | 8 ++++ grbl/util.h | 6 ++- main.c | 2 +- 17 files changed, 179 insertions(+), 28 deletions(-) diff --git a/GRBL_Advanced.elay b/GRBL_Advanced.elay index bc69bab..1bc1f27 100644 --- a/GRBL_Advanced.elay +++ b/GRBL_Advanced.elay @@ -21,9 +21,9 @@ - + - + @@ -36,7 +36,7 @@ - + @@ -116,12 +116,12 @@ - + - + @@ -296,9 +296,9 @@ - + - + diff --git a/HAL/GPIO/GPIO.c b/HAL/GPIO/GPIO.c index a391b94..c499adc 100644 --- a/HAL/GPIO/GPIO.c +++ b/HAL/GPIO/GPIO.c @@ -83,7 +83,7 @@ static void GPIO_InitStepper(void) GPIO_Init(GPIOA, &GPIO_InitStructure); /* GPIO Configuration: A3, D3, D5, D4, D6 */ - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_10; + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_10; GPIO_Init(GPIOB, &GPIO_InitStructure); } diff --git a/HAL/GPIO/GPIO.h b/HAL/GPIO/GPIO.h index ac2fdeb..229cce4 100644 --- a/HAL/GPIO/GPIO.h +++ b/HAL/GPIO/GPIO.h @@ -26,17 +26,25 @@ #define GPIO_STEP_X_PORT GPIOA #define GPIO_STEP_Y_PORT GPIOB #define GPIO_STEP_Z_PORT GPIOB +#define GPIO_STEP_A_PORT GPIOB +#define GPIO_STEP_B_PORT GPIOB #define GPIO_STEP_X_PIN GPIO_Pin_10 #define GPIO_STEP_Y_PIN GPIO_Pin_3 #define GPIO_STEP_Z_PIN GPIO_Pin_5 +#define GPIO_STEP_A_PIN GPIO_Pin_1 +#define GPIO_STEP_B_PIN GPIO_Pin_14 // Direction Pins #define GPIO_DIR_X_PORT GPIOB #define GPIO_DIR_Y_PORT GPIOB #define GPIO_DIR_Z_PORT GPIOA +#define GPIO_DIR_A_PORT GPIOB +#define GPIO_DIR_B_PORT GPIOB #define GPIO_DIR_X_PIN GPIO_Pin_4 #define GPIO_DIR_Y_PIN GPIO_Pin_10 #define GPIO_DIR_Z_PIN GPIO_Pin_8 +#define GPIO_DIR_A_PIN GPIO_Pin_2 +#define GPIO_DIR_B_PIN GPIO_Pin_15 // Stepper Enable #define GPIO_ENABLE_PORT GPIOA diff --git a/grbl/Config.h b/grbl/Config.h index 1d5b795..9526fb6 100644 --- a/grbl/Config.h +++ b/grbl/Config.h @@ -47,6 +47,9 @@ // Uncomment to use external I2C EEPROM //#define USE_EXT_EEPROM +// Uncomment to use 4th/5th axis +//#define USE_MULTI_AXIS + // Define realtime command special characters. These characters are 'picked-off' directly from the // serial read data stream and are not passed to the grbl line execution parser. Select characters @@ -113,8 +116,8 @@ // on separate pin, but homed in one cycle. Also, it should be noted that the function of hard limits // will not be affected by pin sharing. // NOTE: Defaults are set for a traditional 3-axis CNC machine. Z-axis first to clear, followed by X & Y. -#define HOMING_CYCLE_0 (1< target_prev[i]) diff --git a/grbl/MotionControl.h b/grbl/MotionControl.h index 631dd18..4cbc056 100644 --- a/grbl/MotionControl.h +++ b/grbl/MotionControl.h @@ -33,6 +33,8 @@ #define HOMING_CYCLE_X BIT(X_AXIS) #define HOMING_CYCLE_Y BIT(Y_AXIS) #define HOMING_CYCLE_Z BIT(Z_AXIS) +#define HOMING_CYCLE_A BIT(A_AXIS) +#define HOMING_CYCLE_B BIT(B_AXIS) void MC_Init(void); diff --git a/grbl/Planner.c b/grbl/Planner.c index 1b1beb5..eea457f 100644 --- a/grbl/Planner.c +++ b/grbl/Planner.c @@ -111,6 +111,8 @@ uint8_t Planner_BufferLine(float *target, Planner_LineData_t *pl_data) position_steps[X_AXIS] = system_convert_corexy_to_x_axis_steps(sys_position); position_steps[Y_AXIS] = system_convert_corexy_to_y_axis_steps(sys_position); position_steps[Z_AXIS] = sys_position[Z_AXIS]; + position_steps[A_AXIS] = sys_position[A_AXIS]; + position_steps[B_AXIS] = sys_position[B_AXIS]; #else memcpy(position_steps, sys_position, sizeof(sys_position)); #endif diff --git a/grbl/Report.c b/grbl/Report.c index cd5a3d0..babcb04 100644 --- a/grbl/Report.c +++ b/grbl/Report.c @@ -83,11 +83,16 @@ static void report_util_gcode_modes_M(void) static void Report_AxisValue(float *axis_value) { uint8_t idx; + uint8_t axis_num = N_LINEAR_AXIS; - for(idx = 0; idx < N_AXIS; idx++) { +#ifdef USE_MULTI_AXIS + axis_num = N_AXIS; +#endif + + for(idx = 0; idx < axis_num; idx++) { PrintFloat_CoordValue(axis_value[idx]); - if(idx < (N_AXIS-1)) { + if(idx < (axis_num-1)) { Putc(','); } } @@ -574,6 +579,9 @@ void Report_BuildInfo(char *line) #ifdef ENABLE_SAFETY_DOOR_INPUT_PIN Putc('+'); #endif +#ifdef USE_MULTI_AXIS + Putc('A'); +#endif // NOTE: Compiled values, like override increments/max/min values, may be added at some point later. Putc(','); diff --git a/grbl/Settings.c b/grbl/Settings.c index a0cc1c2..f65bcfb 100644 --- a/grbl/Settings.c +++ b/grbl/Settings.c @@ -119,15 +119,26 @@ void Settings_Restore(uint8_t restore_flag) { settings.steps_per_mm[X_AXIS] = DEFAULT_X_STEPS_PER_MM; settings.steps_per_mm[Y_AXIS] = DEFAULT_Y_STEPS_PER_MM; settings.steps_per_mm[Z_AXIS] = DEFAULT_Z_STEPS_PER_MM; + settings.steps_per_mm[A_AXIS] = DEFAULT_A_STEPS_PER_DEG; + settings.steps_per_mm[B_AXIS] = DEFAULT_B_STEPS_PER_DEG; + settings.max_rate[X_AXIS] = DEFAULT_X_MAX_RATE; settings.max_rate[Y_AXIS] = DEFAULT_Y_MAX_RATE; settings.max_rate[Z_AXIS] = DEFAULT_Z_MAX_RATE; + settings.max_rate[A_AXIS] = DEFAULT_A_MAX_RATE; + settings.max_rate[B_AXIS] = DEFAULT_B_MAX_RATE; + settings.acceleration[X_AXIS] = DEFAULT_X_ACCELERATION; settings.acceleration[Y_AXIS] = DEFAULT_Y_ACCELERATION; settings.acceleration[Z_AXIS] = DEFAULT_Z_ACCELERATION; + settings.acceleration[A_AXIS] = DEFAULT_A_ACCELERATION; + settings.acceleration[B_AXIS] = DEFAULT_B_ACCELERATION; + settings.max_travel[X_AXIS] = (-DEFAULT_X_MAX_TRAVEL); settings.max_travel[Y_AXIS] = (-DEFAULT_Y_MAX_TRAVEL); settings.max_travel[Z_AXIS] = (-DEFAULT_Z_MAX_TRAVEL); + settings.max_travel[A_AXIS] = (-DEFAULT_A_MAX_TRAVEL); + settings.max_travel[B_AXIS] = (-DEFAULT_B_MAX_TRAVEL); settings.backlash[X_AXIS] = DEFAULT_X_BACKLASH; settings.backlash[Y_AXIS] = DEFAULT_Y_BACKLASH; @@ -405,8 +416,10 @@ uint8_t Settings_GetStepPinMask(uint8_t axis_idx) { if(axis_idx == X_AXIS) { return (1<step_event_count >> 1); + st.counter_x = st.counter_y = st.counter_z = st.counter_a = st.counter_b = (st.exec_block->step_event_count >> 1); } st.dir_outbits = st.exec_block->direction_bits ^ dir_port_invert_mask; @@ -416,11 +436,25 @@ void Stepper_MainISR(void) else { GPIO_ResetBits(GPIO_DIR_Z_PORT, GPIO_DIR_Z_PIN); } + if(st.dir_outbits & (1<steps[X_AXIS] >> st.exec_segment->amass_level; st.steps[Y_AXIS] = st.exec_block->steps[Y_AXIS] >> st.exec_segment->amass_level; st.steps[Z_AXIS] = st.exec_block->steps[Z_AXIS] >> st.exec_segment->amass_level; + st.steps[A_AXIS] = st.exec_block->steps[A_AXIS] >> st.exec_segment->amass_level; + st.steps[B_AXIS] = st.exec_block->steps[B_AXIS] >> st.exec_segment->amass_level; // Set real-time spindle output as segment is loaded, just prior to the first step. Spindle_SetSpeed(st.exec_segment->spindle_pwm); @@ -501,6 +535,40 @@ void Stepper_MainISR(void) } } + st.counter_a += st.steps[A_AXIS]; + + if(st.counter_a > st.exec_block->step_event_count) { + st.step_outbits |= (1<step_event_count; + + //if(st.exec_segment->backlash_motion == 0) + { + if(st.exec_block->direction_bits & (1< st.exec_block->step_event_count) { + st.step_outbits |= (1<step_event_count; + + //if(st.exec_segment->backlash_motion == 0) + { + if(st.exec_block->direction_bits & (1<