From 22e0fcba1cb2c1a48ecd4eec9c3253e4949371c2 Mon Sep 17 00:00:00 2001 From: Terje Io Date: Sun, 9 Jan 2022 22:11:57 +0100 Subject: [PATCH] Added optional spindle select event to core events, for dual spindle enabled configurations (VFD + PWM spindle). Attempted fix for weird issue with VFD spindle when spindle at speed tolerance is set > 0 with $340. --- changelog.md | 20 ++++++++++++++++++++ core_handlers.h | 4 +++- driver_opts.h | 4 ++++ gcode.c | 17 ++++++++++++++++- gcode.h | 8 ++++++-- grbl.h | 2 +- grbllib.c | 5 ++++- motion_control.c | 15 +++++---------- plugins_init.h | 6 +++++- protocol.c | 11 ++++------- settings.c | 11 +++++++++-- spindle_control.c | 9 +++++---- state_machine.c | 8 +++----- 13 files changed, 85 insertions(+), 35 deletions(-) diff --git a/changelog.md b/changelog.md index a779bd0..866981a 100644 --- a/changelog.md +++ b/changelog.md @@ -1,5 +1,25 @@ ## grblHAL changelog +Build 20220109: + +Core: + +* Added optional spindle select event to core events, for dual spindle enabled configurations \(VFD + PWM spindle\). +* Attempted fix for weird issue with VFD spindle when spindle at speed tolerance is set > 0 with `$340`. + +Plugins: + +* Networking: fix for [dependency issue](https://github.com/grblHAL/core/discussions/106) with iMXRT1062 driver when lwIP library was not installed. +* Spindle: updated Huanyang VFD driver to support the new spindle select event. +Added experimental M-code for switching spindles, `M401P0` for PWM spindle, `M401P1` for VFD spindle. Only available in `DUAL_SPINDLE` configurations. +* Keypad: added many new single character commands, mostly the same as available as standard real time commands. + +Drivers: +* STM32F4xx: fixed name case for FatFs driver directory, added FatFs R0.13c source. +* iMXRT1062, STM32F4xx and SAM3X8E: added `DUAL_SPINDLE` configuration option \(for testing\). + +--- + Build 20220105: Core: diff --git a/core_handlers.h b/core_handlers.h index 4974c5b..afa3bda 100644 --- a/core_handlers.h +++ b/core_handlers.h @@ -3,7 +3,7 @@ Part of grblHAL - Copyright (c) 2020-2021 Terje Io + Copyright (c) 2020-2022 Terje Io Grbl is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -81,6 +81,7 @@ typedef void (*on_stream_changed_ptr)(stream_type_t type); typedef bool (*on_laser_ppi_enable_ptr)(uint_fast16_t ppi, uint_fast16_t pulse_length); typedef void (*on_homing_rate_set_ptr)(axes_signals_t axes, float rate, bool pulloff); typedef bool (*on_probe_fixture_ptr)(tool_data_t *tool, bool at_g59_3, bool on); +typedef bool (*on_spindle_select_ptr)(uint_fast8_t spindle_id); typedef status_code_t (*on_unknown_sys_command_ptr)(sys_state_t state, char *line); // return Status_Unhandled. typedef status_code_t (*on_user_command_ptr)(char *line); typedef sys_commands_t *(*on_get_commands_ptr)(void); @@ -110,6 +111,7 @@ typedef struct { on_homing_rate_set_ptr on_homing_rate_set; on_probe_fixture_ptr on_probe_fixture; on_laser_ppi_enable_ptr on_laser_ppi_enable; + on_spindle_select_ptr on_spindle_select; // core entry points - set up by core before driver_init() is called. enqueue_gcode_ptr enqueue_gcode; enqueue_realtime_command_ptr enqueue_realtime_command; diff --git a/driver_opts.h b/driver_opts.h index e1747ee..b3c4f5b 100644 --- a/driver_opts.h +++ b/driver_opts.h @@ -188,6 +188,10 @@ #endif #endif +#ifndef DUAL_SPINDLE +#define DUAL_SPINDLE 0 +#endif + #ifndef QEI_ENABLE #define QEI_ENABLE 0 #endif diff --git a/gcode.c b/gcode.c index 8536777..acf5c54 100644 --- a/gcode.c +++ b/gcode.c @@ -3,7 +3,7 @@ Part of grblHAL - Copyright (c) 2017-2021 Terje Io + Copyright (c) 2017-2022 Terje Io Copyright (c) 2011-2016 Sungeun K. Jeon for Gnea Research LLC Copyright (c) 2009-2011 Simen Svale Skogsrud @@ -330,6 +330,21 @@ bool gc_laser_ppi_enable (uint_fast16_t ppi, uint_fast16_t pulse_length) return grbl.on_laser_ppi_enable && grbl.on_laser_ppi_enable(ppi, pulse_length); } +void gc_spindle_off (void) +{ + gc_state.spindle.rpm = 0.0f; + gc_state.modal.spindle.value = 0; + spindle_set_state(gc_state.modal.spindle, gc_state.spindle.rpm); + sys.report.spindle = On; +} + +void gc_coolant_off (void) +{ + gc_state.modal.coolant.value = 0; + hal.coolant.set_state(gc_state.modal.coolant); + sys.report.coolant = On; +} + // Add output command to linked list static bool add_output_command (output_command_t *command) { diff --git a/gcode.h b/gcode.h index 1b4be1c..a7daef0 100644 --- a/gcode.h +++ b/gcode.h @@ -3,7 +3,7 @@ Part of grblHAL - Copyright (c) 2017-2020 Terje Io + Copyright (c) 2017-2022 Terje Io Copyright (c) 2011-2016 Sungeun K. Jeon for Gnea Research LLC Copyright (c) 2009-2011 Simen Svale Skogsrud @@ -222,7 +222,8 @@ typedef enum { Trinamic_ReportPrewarnFlags = 911, //!< 911 - M122, Marlin format Trinamic_ClearPrewarnFlags = 912, //!< 912 - M122, Marlin format Trinamic_HybridThreshold = 913, //!< 913 - M122, Marlin format - Trinamic_HomingSensitivity = 914 //!< 914 - M122, Marlin format + Trinamic_HomingSensitivity = 914, //!< 914 - M122, Marlin format + Spindle_Select = UserMCode_Generic4 //!< Value to be assigned later! } user_mcode_t; //! Data for M62, M63 and M67 commands when executed synchronized with motion. @@ -560,6 +561,9 @@ float *gc_get_scaling (void); // Get current axis offset. float gc_get_offset (uint_fast8_t idx); +void gc_spindle_off (void); +void gc_coolant_off (void); + void gc_set_tool_offset (tool_offset_mode_t mode, uint_fast8_t idx, int32_t offset); plane_t *gc_get_plane_data (plane_t *plane, plane_select_t select); diff --git a/grbl.h b/grbl.h index 09a1d28..274ed66 100644 --- a/grbl.h +++ b/grbl.h @@ -34,7 +34,7 @@ #else #define GRBL_VERSION "1.1f" #endif -#define GRBL_BUILD 20220105 +#define GRBL_BUILD 20220109 // The following symbols are set here if not already set by the compiler or in config.h // Do NOT change here! diff --git a/grbllib.c b/grbllib.c index 4c6f219..40b7e48 100644 --- a/grbllib.c +++ b/grbllib.c @@ -3,7 +3,7 @@ Part of grblHAL - Copyright (c) 2017-2021 Terje Io + Copyright (c) 2017-2022 Terje Io Copyright (c) 2011-2015 Sungeun K. Jeon Copyright (c) 2009-2011 Simen Svale Skogsrud @@ -212,6 +212,9 @@ int grbl_enter (void) driver.spindle = (!hal.driver_cap.variable_spindle || (hal.spindle.get_pwm != NULL && hal.spindle.update_pwm != NULL)); #endif + if(grbl.on_spindle_select) + grbl.on_spindle_select(hal.driver_cap.dual_spindle && settings.mode == Mode_Laser ? 0 : 1); + if(driver.ok != 0xFF) { sys.alarm = Alarm_SelftestFailed; protocol_enqueue_rt_command(report_driver_error); diff --git a/motion_control.c b/motion_control.c index c3fadbb..1448601 100644 --- a/motion_control.c +++ b/motion_control.c @@ -3,7 +3,7 @@ Part of grblHAL - Copyright (c) 2017-2021 Terje Io + Copyright (c) 2017-2022 Terje Io Copyright (c) 2011-2016 Sungeun K. Jeon for Gnea Research LLC Copyright (c) 2009-2011 Simen Svale Skogsrud @@ -787,16 +787,11 @@ status_code_t mc_homing_cycle (axes_signals_t cycle) hal.limits.enable(false, true); // Disable hard limits pin change register for cycle duration // Turn off spindle and coolant (and update parser state) - if(hal.spindle.get_state().on) { - gc_state.spindle.rpm = 0.0f; - gc_state.modal.spindle.on = gc_state.modal.spindle.ccw = Off; - spindle_set_state(gc_state.modal.spindle, 0.0f); - } + if(hal.spindle.get_state().on) + gc_spindle_off(); - if(hal.coolant.get_state().mask) { - gc_state.modal.coolant.mask = 0; - coolant_set_state(gc_state.modal.coolant); - } + if(hal.coolant.get_state().mask) + gc_coolant_off(); // --------------------------------------------------------------------------- // Perform homing routine. NOTE: Special motion case. Only system reset works. diff --git a/plugins_init.h b/plugins_init.h index 65a7640..7a3cae1 100644 --- a/plugins_init.h +++ b/plugins_init.h @@ -7,7 +7,7 @@ Part of grblHAL - Copyright (c) 2021 Terje Io + Copyright (c) 2021-2022 Terje Io Grbl is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -36,6 +36,10 @@ #if VFD_ENABLE extern void vfd_init (void); vfd_init(); +#if DUAL_SPINDLE + extern void spindle_select_init(void); + spindle_select_init(); +#endif #endif #ifndef GRBL_ESP32 // ESP32 has its own bluetooth_init diff --git a/protocol.c b/protocol.c index e09625c..d08c1bf 100644 --- a/protocol.c +++ b/protocol.c @@ -3,7 +3,7 @@ Part of grblHAL - Copyright (c) 2017-202 Terje Io + Copyright (c) 2017-2022 Terje Io Copyright (c) 2011-2016 Sungeun K. Jeon for Gnea Research LLC Copyright (c) 2009-2011 Simen Svale Skogsrud @@ -496,15 +496,12 @@ bool protocol_exec_rt_system (void) sys.override.control = gc_state.modal.override_ctrl; gc_state.tool_change = false; - gc_state.modal.coolant.value = 0; - gc_state.modal.spindle.value = 0; - gc_state.spindle.rpm = sys.spindle_rpm = 0.0f; gc_state.modal.spindle_rpm_mode = SpindleSpeedMode_RPM; // Kill spindle and coolant. TODO: Check Mach3 behaviour? - hal.spindle.set_state(gc_state.modal.spindle, 0.0f); - hal.coolant.set_state(gc_state.modal.coolant); - sys.report.spindle = sys.report.coolant = On; // Set to report change immediately + gc_spindle_off(); + gc_coolant_off(); + // Tell driver/plugins about reset. hal.driver_reset(); diff --git a/settings.c b/settings.c index b79e058..897a331 100644 --- a/settings.c +++ b/settings.c @@ -3,7 +3,7 @@ Part of grblHAL - Copyright (c) 2017-2021 Terje Io + Copyright (c) 2017-2022 Terje Io Copyright (c) 2011-2015 Sungeun K. Jeon Copyright (c) 2009-2011 Simen Svale Skogsrud @@ -2122,13 +2122,19 @@ status_code_t settings_store_setting (setting_id_t id, char *svalue) } if(status == Status_OK) { + if(set->save) set->save(); + #ifdef ENABLE_BACKLASH_COMPENSATION - mc_backlash_init(); + mc_backlash_init(); #endif + if(set->on_changed) set->on_changed(&settings); + + if(set == &setting_details && grbl.on_spindle_select) + grbl.on_spindle_select(hal.driver_cap.dual_spindle && settings.mode == Mode_Laser ? 0 : 1); } return status; @@ -2161,6 +2167,7 @@ void settings_init (void) mc_backlash_init(); #endif hal.settings_changed(&settings); + if(hal.probe.configure) // Initialize probe invert mask. hal.probe.configure(false, false); } diff --git a/spindle_control.c b/spindle_control.c index e492829..2d78db7 100644 --- a/spindle_control.c +++ b/spindle_control.c @@ -84,13 +84,14 @@ bool spindle_sync (spindle_state_t state, float rpm) // Empty planner buffer to ensure spindle is set when programmed. if((ok = protocol_buffer_synchronize()) && spindle_set_state(state, rpm) && !at_speed) { - float delay = 0.0f; + float on_delay = 0.0f; while(!(at_speed = hal.spindle.get_state().at_speed)) { - delay_sec(0.1f, DelayMode_Dwell); - delay += 0.1f; + delay_sec(0.2f, DelayMode_Dwell); + on_delay += 0.2f; if(ABORTED) break; - if(delay >= settings.safety_door.spindle_on_delay) { + if(on_delay >= settings.safety_door.spindle_on_delay) { + gc_spindle_off(); system_raise_alarm(Alarm_Spindle); break; } diff --git a/state_machine.c b/state_machine.c index 0930d53..c61c5d6 100644 --- a/state_machine.c +++ b/state_machine.c @@ -5,7 +5,7 @@ Part of grblHAL - Copyright (c) 2018-2021 Terje Io + Copyright (c) 2018-2022 Terje Io Copyright (c) 2011-2016 Sungeun K. Jeon for Gnea Research LLC Copyright (c) 2009-2011 Simen Svale Skogsrud @@ -539,10 +539,8 @@ static void state_await_resume (uint_fast16_t rt_exec) default: if (!settings.flags.restore_after_feed_hold) { - if (!hal.spindle.get_state().on) { - gc_state.spindle.rpm = 0.0f; - gc_state.modal.spindle.on = gc_state.modal.spindle.ccw = Off; - } + if (!hal.spindle.get_state().on) + gc_spindle_off(); sys.override.spindle_stop.value = 0; // Clear spindle stop override states } else {