1
0
mirror of https://github.com/bdring/Grbl_Esp32.git synced 2025-09-04 03:35:45 +02:00

Add Spindle Classes

This commit is contained in:
bdring
2020-05-07 17:48:45 -05:00
parent c6dd494db1
commit 8b44c6f7ce
35 changed files with 140 additions and 491 deletions

View File

@@ -21,6 +21,8 @@
#include "grbl.h" #include "grbl.h"
#include "WiFi.h" #include "WiFi.h"
#include "Spindles/SpindleClass.cpp"
// Declare system global variable structure // Declare system global variable structure
system_t sys; system_t sys;
int32_t sys_position[N_AXIS]; // Real-time machine (aka home) position vector in steps. int32_t sys_position[N_AXIS]; // Real-time machine (aka home) position vector in steps.
@@ -34,6 +36,8 @@ volatile uint8_t sys_rt_exec_accessory_override; // Global realtime executor bit
volatile uint8_t sys_rt_exec_debug; volatile uint8_t sys_rt_exec_debug;
#endif #endif
Spindle *spindle;
void setup() { void setup() {
@@ -52,7 +56,7 @@ void setup() {
#else #else
#define MACHINE_STRING MACHINE_NAME #define MACHINE_STRING MACHINE_NAME
#endif #endif
grbl_msg_sendf(CLIENT_SERIAL, MSG_LEVEL_INFO, "Using machine:%s", MACHINE_STRING); report_machine_type(CLIENT_SERIAL);
#endif #endif
settings_init(); // Load Grbl settings from EEPROM settings_init(); // Load Grbl settings from EEPROM
stepper_init(); // Configure stepper pins and interrupt timers stepper_init(); // Configure stepper pins and interrupt timers
@@ -113,7 +117,7 @@ void loop() {
// Reset Grbl primary systems. // Reset Grbl primary systems.
serial_reset_read_buffer(CLIENT_ALL); // Clear serial read buffer serial_reset_read_buffer(CLIENT_ALL); // Clear serial read buffer
gc_init(); // Set g-code parser to default state gc_init(); // Set g-code parser to default state
spindle_init(); spindle_select(SPINDLE_TYPE);
coolant_init(); coolant_init();
limits_init(); limits_init();
probe_init(); probe_init();

View File

@@ -41,7 +41,8 @@
#define STEPPERS_DISABLE_PIN GPIO_NUM_13 #define STEPPERS_DISABLE_PIN GPIO_NUM_13
#define SPINDLE_TYPE SPINDLE_TYPE_PWM #define SPINDLE_TYPE SPINDLE_TYPE_PWM
#define SPINDLE_PWM_PIN GPIO_NUM_17 // labeled SpinPWM #define SPINDLE_OUTPUT_PIN GPIO_NUM_17 // labeled SpinPWM
#define SPINDLE_ENABLE_PIN GPIO_NUM_22 // labeled SpinEnbl #define SPINDLE_ENABLE_PIN GPIO_NUM_22 // labeled SpinEnbl
#define COOLANT_MIST_PIN GPIO_NUM_21 // labeled Mist #define COOLANT_MIST_PIN GPIO_NUM_21 // labeled Mist

View File

@@ -33,7 +33,7 @@
#define Y2_DIRECTION_PIN GPIO_NUM_33 /* labeled Z */ #define Y2_DIRECTION_PIN GPIO_NUM_33 /* labeled Z */
#define SPINDLE_TYPE SPINDLE_TYPE_PWM #define SPINDLE_TYPE SPINDLE_TYPE_PWM
#define SPINDLE_PWM_PIN GPIO_NUM_2 #define SPINDLE_OUTPUT_PIN GPIO_NUM_2
#define SPINDLE_ENABLE_PIN GPIO_NUM_22 #define SPINDLE_ENABLE_PIN GPIO_NUM_22
#define LIMIT_MASK B11 #define LIMIT_MASK B11

View File

@@ -67,10 +67,6 @@
#define REED_SW_PIN GPIO_NUM_17 #define REED_SW_PIN GPIO_NUM_17
#define LIMIT_MASK 0 #define LIMIT_MASK 0
#ifdef IGNORE_CONTROL_PINS // maybe set in config.h
#undef IGNORE_CONTROL_PINS
#endif
#ifndef ENABLE_CONTROL_SW_DEBOUNCE #ifndef ENABLE_CONTROL_SW_DEBOUNCE
#define ENABLE_CONTROL_SW_DEBOUNCE #define ENABLE_CONTROL_SW_DEBOUNCE
#endif #endif

View File

@@ -40,7 +40,8 @@
#define STEPPERS_DISABLE_PIN GPIO_NUM_12 #define STEPPERS_DISABLE_PIN GPIO_NUM_12
#define SPINDLE_TYPE SPINDLE_TYPE_PWM #define SPINDLE_TYPE SPINDLE_TYPE_PWM
#define SPINDLE_PWM_PIN GPIO_NUM_19 #define SPINDLE_OUTPUT_PIN GPIO_NUM_19
#define SPINDLE_DIR_PIN GPIO_NUM_18 #define SPINDLE_DIR_PIN GPIO_NUM_18
#define COOLANT_FLOOD_PIN GPIO_NUM_34 #define COOLANT_FLOOD_PIN GPIO_NUM_34
@@ -53,7 +54,6 @@
#define PROBE_PIN GPIO_NUM_39 #define PROBE_PIN GPIO_NUM_39
// comment out #define IGNORE_CONTROL_PINS in config.h to use control pins
#define CONTROL_RESET_PIN GPIO_NUM_2 #define CONTROL_RESET_PIN GPIO_NUM_2
#define CONTROL_FEED_HOLD_PIN GPIO_NUM_4 #define CONTROL_FEED_HOLD_PIN GPIO_NUM_4
#define CONTROL_CYCLE_START_PIN GPIO_NUM_35 // ESP32 needs external pullup #define CONTROL_CYCLE_START_PIN GPIO_NUM_35 // ESP32 needs external pullup

View File

@@ -50,9 +50,11 @@
//#define USE_SPINDLE_RELAY //#define USE_SPINDLE_RELAY
#ifdef USE_SPINDLE_RELAY #ifdef USE_SPINDLE_RELAY
#define SPINDLE_PWM_PIN GPIO_NUM_2 #define SPINDLE_TYPE SPINDLE_TYPE_PWM
#define SPINDLE_OUTPUT_PIN GPIO_NUM_2
#else #else
#define SPINDLE_PWM_PIN GPIO_NUM_16 #define SPINDLE_TYPE SPINDLE_TYPE_RELAY
#define SPINDLE_OUTPUT_PIN GPIO_NUM_16
#define SPINDLE_ENABLE_PIN GPIO_NUM_32 #define SPINDLE_ENABLE_PIN GPIO_NUM_32
#endif #endif
@@ -78,7 +80,6 @@
#define INVERT_CONTROL_PIN_MASK B1110 #define INVERT_CONTROL_PIN_MASK B1110
// Note: check the #define IGNORE_CONTROL_PINS is the way you want in config.h
#define CONTROL_RESET_PIN GPIO_NUM_34 // needs external pullup #define CONTROL_RESET_PIN GPIO_NUM_34 // needs external pullup
#define CONTROL_FEED_HOLD_PIN GPIO_NUM_36 // needs external pullup #define CONTROL_FEED_HOLD_PIN GPIO_NUM_36 // needs external pullup
#define CONTROL_CYCLE_START_PIN GPIO_NUM_39 // needs external pullup #define CONTROL_CYCLE_START_PIN GPIO_NUM_39 // needs external pullup

View File

@@ -51,10 +51,6 @@
#define SERVO_Z_HOME_POS SERVO_Z_RANGE_MAX // move to max during homing #define SERVO_Z_HOME_POS SERVO_Z_RANGE_MAX // move to max during homing
#define SERVO_Z_MPOS false // will not use mpos, uses work coordinates #define SERVO_Z_MPOS false // will not use mpos, uses work coordinates
#ifndef IGNORE_CONTROL_PINS // maybe set in config.h
#define IGNORE_CONTROL_PINS
#endif
// redefine some stuff from config.h // redefine some stuff from config.h
#ifdef HOMING_CYCLE_0 #ifdef HOMING_CYCLE_0
#undef HOMING_CYCLE_0 #undef HOMING_CYCLE_0
@@ -74,6 +70,8 @@
#define SERVO_PEN_PIN GPIO_NUM_27 #define SERVO_PEN_PIN GPIO_NUM_27
#define SPINDLE_TYPE SPINDLE_TYPE_NONE
// defaults // defaults
#define DEFAULT_STEP_PULSE_MICROSECONDS 3 #define DEFAULT_STEP_PULSE_MICROSECONDS 3
#define DEFAULT_STEPPER_IDLE_LOCK_TIME 255 // stay on #define DEFAULT_STEPPER_IDLE_LOCK_TIME 255 // stay on

View File

@@ -51,10 +51,11 @@
#ifdef USE_SPINDLE_RELAY #ifdef USE_SPINDLE_RELAY
#define SPINDLE_TYPE SPINDLE_TYPE_RELAY #define SPINDLE_TYPE SPINDLE_TYPE_RELAY
#define SPINDLE_PWM_PIN GPIO_NUM_17 #define SPINDLE_OUTPUT_PIN GPIO_NUM_17
#else #else
#define SPINDLE_TYPE SPINDLE_TYPE_PWM #define SPINDLE_TYPE SPINDLE_TYPE_PWM
#define SPINDLE_PWM_PIN GPIO_NUM_16 #define SPINDLE_OUTPUT_PIN GPIO_NUM_16
#define SPINDLE_ENABLE_PIN GPIO_NUM_32 #define SPINDLE_ENABLE_PIN GPIO_NUM_32
#endif #endif
@@ -78,15 +79,6 @@
#define INVERT_CONTROL_PIN_MASK B1110 #define INVERT_CONTROL_PIN_MASK B1110
// Note: default is #define IGNORE_CONTROL_PINS in config.h
// uncomment to these lines to use them
/*
#ifdef IGNORE_CONTROL_PINS
#undef IGNORE_CONTROL_PINS
#endif
*/
#define CONTROL_RESET_PIN GPIO_NUM_34 // needs external pullup #define CONTROL_RESET_PIN GPIO_NUM_34 // needs external pullup
#define CONTROL_FEED_HOLD_PIN GPIO_NUM_36 // needs external pullup #define CONTROL_FEED_HOLD_PIN GPIO_NUM_36 // needs external pullup
#define CONTROL_CYCLE_START_PIN GPIO_NUM_39 // needs external pullup #define CONTROL_CYCLE_START_PIN GPIO_NUM_39 // needs external pullup

View File

@@ -52,10 +52,11 @@
#ifdef USE_SPINDLE_RELAY #ifdef USE_SPINDLE_RELAY
#define SPINDLE_TYPE SPINDLE_TYPE_RELAY #define SPINDLE_TYPE SPINDLE_TYPE_RELAY
#define SPINDLE_PWM_PIN GPIO_NUM_2 #define SPINDLE_OUTPUT_PIN GPIO_NUM_2
#else #else
#define SPINDLE_TYPE SPINDLE_TYPE_PWM #define SPINDLE_TYPE SPINDLE_TYPE_PWM
#define SPINDLE_PWM_PIN GPIO_NUM_16 #define SPINDLE_OUTPUT_PIN GPIO_NUM_16
#define SPINDLE_ENABLE_PIN GPIO_NUM_32 #define SPINDLE_ENABLE_PIN GPIO_NUM_32
#endif #endif
@@ -85,14 +86,6 @@
#define INVERT_CONTROL_PIN_MASK B1110 #define INVERT_CONTROL_PIN_MASK B1110
// Note: default is #define IGNORE_CONTROL_PINS in config.h
// uncomment to these lines to use them
/*
#ifdef IGNORE_CONTROL_PINS
#undef IGNORE_CONTROL_PINS
#endif
*/
#define CONTROL_RESET_PIN GPIO_NUM_34 // needs external pullup #define CONTROL_RESET_PIN GPIO_NUM_34 // needs external pullup
#define CONTROL_FEED_HOLD_PIN GPIO_NUM_36 // needs external pullup #define CONTROL_FEED_HOLD_PIN GPIO_NUM_36 // needs external pullup

View File

@@ -49,10 +49,6 @@
#define Y_LIMIT_PIN GPIO_NUM_4 #define Y_LIMIT_PIN GPIO_NUM_4
#define LIMIT_MASK B11 #define LIMIT_MASK B11
// If SPINDLE_PWM_PIN is commented out, this frees up the pin, but Grbl will still
// use a virtual spindle. Do not comment out the other parameters for the spindle.
//#define SPINDLE_PWM_PIN GPIO_NUM_17 // Laser PWM
#define USING_SERVO // uncomment to use this feature #define USING_SERVO // uncomment to use this feature
//#define USING_SOLENOID // uncomment to use this feature //#define USING_SOLENOID // uncomment to use this feature
@@ -68,6 +64,8 @@
#define SOLENOID_PEN_PIN GPIO_NUM_16 #define SOLENOID_PEN_PIN GPIO_NUM_16
#endif #endif
#define SPINDLE_TYPE SPINDLE_TYPE_NONE
// defaults // defaults
#define DEFAULT_STEP_PULSE_MICROSECONDS 3 #define DEFAULT_STEP_PULSE_MICROSECONDS 3
#define DEFAULT_STEPPER_IDLE_LOCK_TIME 250 // stay on #define DEFAULT_STEPPER_IDLE_LOCK_TIME 250 // stay on

View File

@@ -57,9 +57,7 @@
#define X_LIMIT_PIN GPIO_NUM_4 #define X_LIMIT_PIN GPIO_NUM_4
#define LIMIT_MASK B1 #define LIMIT_MASK B1
#ifdef IGNORE_CONTROL_PINS // maybe set in config.h #define SPINDLE_TYPE SPINDLE_TYPE_NONE
#undef IGNORE_CONTROL_PINS
#endif
#ifndef ENABLE_CONTROL_SW_DEBOUNCE #ifndef ENABLE_CONTROL_SW_DEBOUNCE
#define ENABLE_CONTROL_SW_DEBOUNCE #define ENABLE_CONTROL_SW_DEBOUNCE

View File

@@ -79,7 +79,7 @@
#define COOLANT_MIST_PIN GPIO_NUM_21 #define COOLANT_MIST_PIN GPIO_NUM_21
#define SPINDLE_TYPE SPINDLE_TYPE_PWM #define SPINDLE_TYPE SPINDLE_TYPE_PWM
#define SPINDLE_PWM_PIN GPIO_NUM_25 #define SPINDLE_OUTPUT_PIN GPIO_NUM_25
#define SPINDLE_ENABLE_PIN GPIO_NUM_4 #define SPINDLE_ENABLE_PIN GPIO_NUM_4
// Relay operation // Relay operation

View File

@@ -64,7 +64,7 @@
#define COOLANT_MIST_PIN GPIO_NUM_21 #define COOLANT_MIST_PIN GPIO_NUM_21
#define SPINDLE_TYPE SPINDLE_TYPE_PWM #define SPINDLE_TYPE SPINDLE_TYPE_PWM
#define SPINDLE_PWM_PIN GPIO_NUM_25 #define SPINDLE_OUTPUT_PIN GPIO_NUM_25
#define SPINDLE_ENABLE_PIN GPIO_NUM_4 #define SPINDLE_ENABLE_PIN GPIO_NUM_4
// Relay operation // Relay operation

View File

@@ -70,15 +70,20 @@
// Turn on with M7 and off with M9 // Turn on with M7 and off with M9
#define COOLANT_MIST_PIN GPIO_NUM_21 #define COOLANT_MIST_PIN GPIO_NUM_21
#define SPINDLE_PWM_PIN GPIO_NUM_25 #define SPINDLE_OUTPUT_PIN GPIO_NUM_25
#define SPINDLE_ENABLE_PIN GPIO_NUM_4 #define SPINDLE_ENABLE_PIN GPIO_NUM_4
// Relay operation // Relay operation
// Install Jumper near relay // Install Jumper near relay
// For spindle Use max RPM of 1 // For PWM remove jumper to prevent relay damage
// For PWM remove jumper and set MAX RPM to something higher ($30 setting)
// Interlock jumper along top edge needs to be installed for both versions // Interlock jumper along top edge needs to be installed for both versions
#define DEFAULT_SPINDLE_RPM_MAX 1 // Should be 1 for relay operation #define USE_RELAY // comment out to use PWM
#ifdef USE_RELAY
#define SPINDLE_TYPE SPINDLE_TYPE_RELAY
#else
#define SPINDLE_TYPE SPINDLE_TYPE_PWM
#endif
#define PROBE_PIN GPIO_NUM_22 #define PROBE_PIN GPIO_NUM_22

View File

@@ -102,7 +102,7 @@
// machine does not support one of these features, you can leave // machine does not support one of these features, you can leave
// the corresponding pin undefined. // the corresponding pin undefined.
// #define SPINDLE_PWM_PIN GPIO_NUM_2 // labeled SpinPWM // #define SPINDLE_OUTPUT_PIN GPIO_NUM_2 // labeled SpinPWM
// #define SPINDLE_ENABLE_PIN GPIO_NUM_22 // labeled SpinEnbl // #define SPINDLE_ENABLE_PIN GPIO_NUM_22 // labeled SpinEnbl
// #define COOLANT_MIST_PIN GPIO_NUM_21 // labeled Mist // #define COOLANT_MIST_PIN GPIO_NUM_21 // labeled Mist
// #define COOLANT_FLOOD_PIN GPIO_NUM_25 // labeled Flood // #define COOLANT_FLOOD_PIN GPIO_NUM_25 // labeled Flood
@@ -175,11 +175,6 @@
// === Control Pins // === Control Pins
// The control pins with names that begin with CONTROL_ are
// ignored by default, to avoid noise problems. To make them
// work, you must undefine IGNORE_CONTROL_PINS
// #undef IGNORE_CONTROL_PINS
// If some of the control pin switches are normally closed // If some of the control pin switches are normally closed
// (the default is normally open), you can invert some of them // (the default is normally open), you can invert some of them
// with INVERT_CONTROL_PIN_MASK. The bits in the mask are // with INVERT_CONTROL_PIN_MASK. The bits in the mask are

View File

@@ -70,8 +70,9 @@
#define SERVO_Z_HOME_POS SERVO_Z_RANGE_MAX // move to max during homing #define SERVO_Z_HOME_POS SERVO_Z_RANGE_MAX // move to max during homing
#define SERVO_Z_MPOS false // will not use mpos, uses work coordinates #define SERVO_Z_MPOS false // will not use mpos, uses work coordinates
#else #else
#define SPINDLE_TYPE SPINDLE_TYPE_PWM #define SPINDLE_TYPE SPINDLE_TYPE_PWM
#define SPINDLE_PWM_PIN GPIO_NUM_27 #define SPINDLE_OUTPUT_PIN GPIO_NUM_27
#endif #endif
// #define X_LIMIT_PIN See version section at beginning of file // #define X_LIMIT_PIN See version section at beginning of file

View File

@@ -32,8 +32,6 @@
*/ */
#include "SpindleClass.h" #include "SpindleClass.h"
#include "SpindleClass.h"
// don't change these // don't change these
#define BESC_PWM_FREQ 50.0f // Hz #define BESC_PWM_FREQ 50.0f // Hz
#define BESC_PWM_BIT_PRECISION 16 // bits #define BESC_PWM_BIT_PRECISION 16 // bits

View File

@@ -76,11 +76,6 @@ Some features should not be changed. See notes below.
// For example B1101 will invert the function of the Reset pin. // For example B1101 will invert the function of the Reset pin.
#define INVERT_CONTROL_PIN_MASK B1111 #define INVERT_CONTROL_PIN_MASK B1111
// This allows control pins to be ignored.
// Since these are typically used on the pins that don't have pullups, they will float and cause
// problems if not externally pulled up. Ignoring will always return not activated when read.
#define IGNORE_CONTROL_PINS
#define ENABLE_CONTROL_SW_DEBOUNCE // Default disabled. Uncomment to enable. #define ENABLE_CONTROL_SW_DEBOUNCE // Default disabled. Uncomment to enable.
#define CONTROL_SW_DEBOUNCE_PERIOD 32 // in milliseconds default 32 microseconds #define CONTROL_SW_DEBOUNCE_PERIOD 32 // in milliseconds default 32 microseconds
@@ -205,7 +200,7 @@ Some features should not be changed. See notes below.
#define CMD_RAPID_OVR_LOW 0x97 #define CMD_RAPID_OVR_LOW 0x97
// #define CMD_RAPID_OVR_EXTRA_LOW 0x98 // *NOT SUPPORTED* // #define CMD_RAPID_OVR_EXTRA_LOW 0x98 // *NOT SUPPORTED*
#define CMD_SPINDLE_OVR_RESET 0x99 // Restores spindle override value to 100%. #define CMD_SPINDLE_OVR_RESET 0x99 // Restores spindle override value to 100%.
#define CMD_SPINDLE_OVR_COARSE_PLUS 0x9A #define CMD_SPINDLE_OVR_COARSE_PLUS 0x9A // 154
#define CMD_SPINDLE_OVR_COARSE_MINUS 0x9B #define CMD_SPINDLE_OVR_COARSE_MINUS 0x9B
#define CMD_SPINDLE_OVR_FINE_PLUS 0x9C #define CMD_SPINDLE_OVR_FINE_PLUS 0x9C
#define CMD_SPINDLE_OVR_FINE_MINUS 0x9D #define CMD_SPINDLE_OVR_FINE_MINUS 0x9D
@@ -437,12 +432,6 @@ Some features should not be changed. See notes below.
// tool length offset value is subtracted from the current location. // tool length offset value is subtracted from the current location.
#define TOOL_LENGTH_OFFSET_AXIS Z_AXIS // Default z-axis. Valid values are X_AXIS, Y_AXIS, or Z_AXIS. #define TOOL_LENGTH_OFFSET_AXIS Z_AXIS // Default z-axis. Valid values are X_AXIS, Y_AXIS, or Z_AXIS.
// Enables variable spindle output voltage for different RPM values. On the Arduino Uno, the spindle
// enable pin will output 5V for maximum RPM with 256 intermediate levels and 0V when disabled.
// NOTE: IMPORTANT for Arduino Unos! When enabled, the Z-limit pin D11 and spindle enable pin D12 switch!
// The hardware PWM output on pin D11 is required for variable spindle output voltages.
#define VARIABLE_SPINDLE // Default enabled. Comment to disable.
// Alters the behavior of the spindle enable pin. By default Grbl will not disable the enable pin if // Alters the behavior of the spindle enable pin. By default Grbl will not disable the enable pin if
// spindle speed is zero and M3/4 is active, but still sets the PWM output to zero. This allows the users // spindle speed is zero and M3/4 is active, but still sets the PWM output to zero. This allows the users
// to know if the spindle is active and use it as an additional control input. // to know if the spindle is active and use it as an additional control input.

View File

@@ -114,7 +114,18 @@
#define DEFAULT_HOMING_PULLOFF 1.0 // $27 mm #define DEFAULT_HOMING_PULLOFF 1.0 // $27 mm
#endif #endif
// ======== sPINDLE STUFF ==================== // ======== SPINDLE STUFF ====================
#ifndef DEFAULT_SPINDLE_RPM_MIN // $31
#define DEFAULT_SPINDLE_RPM_MIN 0.0 // rpm
#endif
#ifndef DEFAULT_LASER_MODE // $32
#define DEFAULT_LASER_MODE 0 // false
#endif
#ifndef DEFAULT_SPINDLE_RPM_MAX // $30
#define DEFAULT_SPINDLE_RPM_MAX 1000.0 // rpm
#endif
#ifndef DEFAULT_SPINDLE_FREQ #ifndef DEFAULT_SPINDLE_FREQ
#define DEFAULT_SPINDLE_FREQ 5000.0 // $33 Hz (extended set) #define DEFAULT_SPINDLE_FREQ 5000.0 // $33 Hz (extended set)
@@ -132,20 +143,7 @@
#define DEFAULT_SPINDLE_MAX_VALUE 100.0 // $36 Percent of full period (extended set) #define DEFAULT_SPINDLE_MAX_VALUE 100.0 // $36 Percent of full period (extended set)
#endif #endif
#ifndef DEFAULT_SPINDLE_RPM_MAX // ================ user settings =====================
#define DEFAULT_SPINDLE_RPM_MAX 1000.0 // rpm
#endif
#ifndef DEFAULT_SPINDLE_RPM_MIN
#define DEFAULT_SPINDLE_RPM_MIN 0.0 // rpm
#endif
#ifndef DEFAULT_LASER_MODE
#define DEFAULT_LASER_MODE 0 // false
#endif
// user settings
#ifndef DEFAULT_USER_INT_80 #ifndef DEFAULT_USER_INT_80
#define DEFAULT_USER_INT_80 0 // $80 User integer setting #define DEFAULT_USER_INT_80 0 // $80 User integer setting
#endif #endif

View File

@@ -301,14 +301,10 @@ uint8_t gc_execute_line(char* line, uint8_t client) {
gc_block.modal.spindle = SPINDLE_ENABLE_CW; gc_block.modal.spindle = SPINDLE_ENABLE_CW;
break; break;
case 4: // Supported if SPINDLE_DIR_PIN is defined or laser mode is on. case 4: // Supported if SPINDLE_DIR_PIN is defined or laser mode is on.
#ifndef SPINDLE_DIR_PIN if (spindle->is_reversable || bit_istrue(settings.flags, BITFLAG_LASER_MODE))
// if laser mode is not on then this is an unsupported command gc_block.modal.spindle = SPINDLE_ENABLE_CCW;
if bit_isfalse(settings.flags, BITFLAG_LASER_MODE) { else
FAIL(STATUS_GCODE_UNSUPPORTED_COMMAND); FAIL(STATUS_GCODE_UNSUPPORTED_COMMAND);
break;
}
#endif
gc_block.modal.spindle = SPINDLE_ENABLE_CCW;
break; break;
case 5: case 5:
gc_block.modal.spindle = SPINDLE_DISABLE; gc_block.modal.spindle = SPINDLE_DISABLE;
@@ -1085,16 +1081,12 @@ uint8_t gc_execute_line(char* line, uint8_t client) {
// [4. Set spindle speed ]: // [4. Set spindle speed ]:
if ((gc_state.spindle_speed != gc_block.values.s) || bit_istrue(gc_parser_flags, GC_PARSER_LASER_FORCE_SYNC)) { if ((gc_state.spindle_speed != gc_block.values.s) || bit_istrue(gc_parser_flags, GC_PARSER_LASER_FORCE_SYNC)) {
if (gc_state.modal.spindle != SPINDLE_DISABLE) { if (gc_state.modal.spindle != SPINDLE_DISABLE) {
#ifdef VARIABLE_SPINDLE
if (bit_isfalse(gc_parser_flags, GC_PARSER_LASER_ISMOTION)) { if (bit_isfalse(gc_parser_flags, GC_PARSER_LASER_ISMOTION)) {
if (bit_istrue(gc_parser_flags, GC_PARSER_LASER_DISABLE)) if (bit_istrue(gc_parser_flags, GC_PARSER_LASER_DISABLE))
spindle->spindle_sync(gc_state.modal.spindle, 0); spindle->spindle_sync(gc_state.modal.spindle, 0);
else else
spindle->spindle_sync(gc_state.modal.spindle, (uint32_t)gc_block.values.s); spindle->spindle_sync(gc_state.modal.spindle, (uint32_t)gc_block.values.s);
} }
#else
spindle_sync(gc_state.modal.spindle, 0.0);
#endif
} }
gc_state.spindle_speed = gc_block.values.s; // Update spindle speed state. gc_state.spindle_speed = gc_block.values.s; // Update spindle speed state.
} }

View File

@@ -18,9 +18,11 @@
along with Grbl. If not, see <http://www.gnu.org/licenses/>. along with Grbl. If not, see <http://www.gnu.org/licenses/>.
*/ */
#pragma once
// Grbl versioning system // Grbl versioning system
#define GRBL_VERSION "1.1f"
#define GRBL_VERSION_BUILD "20200504" #define GRBL_VERSION "1.2a"
#define GRBL_VERSION_BUILD "20200428"
//#include <sdkconfig.h> //#include <sdkconfig.h>
#include <Arduino.h> #include <Arduino.h>
@@ -28,6 +30,7 @@
#include <driver/rmt.h> #include <driver/rmt.h>
#include <esp_task_wdt.h> #include <esp_task_wdt.h>
#include <freertos/task.h> #include <freertos/task.h>
#include <Preferences.h>
#include "driver/timer.h" #include "driver/timer.h"
@@ -51,7 +54,7 @@
#include "protocol.h" #include "protocol.h"
#include "report.h" #include "report.h"
#include "serial.h" #include "serial.h"
#include "spindle_control.h" #include "Spindles/SpindleClass.h"
#include "stepper.h" #include "stepper.h"
#include "jog.h" #include "jog.h"
#include "inputbuffer.h" #include "inputbuffer.h"

View File

@@ -16,18 +16,12 @@ PWM
// !!! For initial testing, start with test_drive.h which disables // !!! For initial testing, start with test_drive.h which disables
// all I/O pins // all I/O pins
#include "Machines/test_drive.h" #include "Machines/3axis_v4.h"
// !!! For actual use, change the line above to select a board // !!! For actual use, change the line above to select a board
// from Machines/, for example: // from Machines/, for example:
// #include "Machines/3axis_v4.h" // #include "Machines/3axis_v4.h"
// Some configurations use two files, the first establishing a base
// configuration and the second providing additional customization,
// for example:
// #include "Machines/3axis_v4.h"
// #include "Machines/add_esc_spindle.h"
// === OEM Single File Configuration Option // === OEM Single File Configuration Option
// OEMs that wish to publish source code that is configured for a // OEMs that wish to publish source code that is configured for a
// specific machine may put all of their configuration definitions // specific machine may put all of their configuration definitions
@@ -57,14 +51,6 @@ PWM
#include MACHINE_PATHNAME_QUOTED(MACHINE_FILENAME) #include MACHINE_PATHNAME_QUOTED(MACHINE_FILENAME)
// You can choose two-file configurations by also defining MACHINE_FILENAME2,
// for example:
// $env:PLATFORMIO_BUILD_FLAGS='-DMACHINE_FILENAME=3axis_v4.h -DMACHINE_FILENAME2=add_esc_spindle.h'; platformio run
#ifdef MACHINE_FILENAME2
#include MACHINE_PATHNAME_QUOTED(MACHINE_FILENAME2)
#endif
#endif // MACHINE_FILENAME #endif // MACHINE_FILENAME
#endif // _machine_h #endif // _machine_h

View File

@@ -1,12 +1,10 @@
#ifndef _machine_common_h #ifndef _machine_common_h
#define _machine_common_h #define _machine_common_h
#ifndef SPINDLE_PWM_BIT_PRECISION #ifndef SPINDLE_TYPE
#define SPINDLE_PWM_BIT_PRECISION 8 #define SPINDLE_TYPE SPINDLE_TYPE_PWM
#endif #endif
#define SPINDLE_PWM_MAX_VALUE ((1<<SPINDLE_PWM_BIT_PRECISION) - 1)
// Grbl setting that are common to all machines // Grbl setting that are common to all machines
// It should not be necessary to change anything herein // It should not be necessary to change anything herein

View File

@@ -424,7 +424,7 @@ void mc_reset() {
if (bit_isfalse(sys_rt_exec_state, EXEC_RESET)) { if (bit_isfalse(sys_rt_exec_state, EXEC_RESET)) {
system_set_exec_state_flag(EXEC_RESET); system_set_exec_state_flag(EXEC_RESET);
// Kill spindle and coolant. // Kill spindle and coolant.
spindle_stop(); spindle->stop();
coolant_stop(); coolant_stop();
// turn off all digital I/O // turn off all digital I/O
sys_io_control(0xFF, false); sys_io_control(0xFF, false);

View File

@@ -284,9 +284,8 @@ uint8_t plan_buffer_line(float* target, plan_line_data_t* pl_data) {
plan_block_t* block = &block_buffer[block_buffer_head]; plan_block_t* block = &block_buffer[block_buffer_head];
memset(block, 0, sizeof(plan_block_t)); // Zero all block values. memset(block, 0, sizeof(plan_block_t)); // Zero all block values.
block->condition = pl_data->condition; block->condition = pl_data->condition;
#ifdef VARIABLE_SPINDLE
block->spindle_speed = pl_data->spindle_speed; block->spindle_speed = pl_data->spindle_speed;
#endif
#ifdef USE_LINE_NUMBERS #ifdef USE_LINE_NUMBERS
block->line_number = pl_data->line_number; block->line_number = pl_data->line_number;
#endif #endif

View File

@@ -81,7 +81,7 @@ typedef struct {
float rapid_rate; // Axis-limit adjusted maximum rate for this block direction in (mm/min) float rapid_rate; // Axis-limit adjusted maximum rate for this block direction in (mm/min)
float programmed_rate; // Programmed rate of this block (mm/min). float programmed_rate; // Programmed rate of this block (mm/min).
//#ifdef VARIABLE_SPINDLE
// Stored spindle speed data used by spindle overrides and resuming methods. // Stored spindle speed data used by spindle overrides and resuming methods.
float spindle_speed; // Block spindle speed. Copied from pl_line_data. float spindle_speed; // Block spindle speed. Copied from pl_line_data.
//#endif //#endif

View File

@@ -464,7 +464,7 @@ void protocol_exec_rt_system() {
last_s_override = MIN(last_s_override, MAX_SPINDLE_SPEED_OVERRIDE); last_s_override = MIN(last_s_override, MAX_SPINDLE_SPEED_OVERRIDE);
last_s_override = MAX(last_s_override, MIN_SPINDLE_SPEED_OVERRIDE); last_s_override = MAX(last_s_override, MIN_SPINDLE_SPEED_OVERRIDE);
if (last_s_override != sys.spindle_speed_ovr) { if (last_s_override != sys.spindle_speed_ovr) {
bit_true(sys.step_control, STEP_CONTROL_UPDATE_SPINDLE_PWM); bit_true(sys.step_control, STEP_CONTROL_UPDATE_SPINDLE_RPM);
sys.spindle_speed_ovr = last_s_override; sys.spindle_speed_ovr = last_s_override;
sys.report_ovr_counter = 0; // Set to report change immediately sys.report_ovr_counter = 0; // Set to report change immediately
} }
@@ -535,7 +535,6 @@ static void protocol_exec_rt_suspend() {
#endif #endif
plan_block_t* block = plan_get_current_block(); plan_block_t* block = plan_get_current_block();
uint8_t restore_condition; uint8_t restore_condition;
#ifdef VARIABLE_SPINDLE
float restore_spindle_speed; float restore_spindle_speed;
if (block == NULL) { if (block == NULL) {
restore_condition = (gc_state.modal.spindle | gc_state.modal.coolant); restore_condition = (gc_state.modal.spindle | gc_state.modal.coolant);
@@ -548,10 +547,7 @@ static void protocol_exec_rt_suspend() {
if (bit_istrue(settings.flags, BITFLAG_LASER_MODE)) if (bit_istrue(settings.flags, BITFLAG_LASER_MODE))
system_set_exec_accessory_override_flag(EXEC_SPINDLE_OVR_STOP); system_set_exec_accessory_override_flag(EXEC_SPINDLE_OVR_STOP);
#endif #endif
#else
if (block == NULL) restore_condition = (gc_state.modal.spindle | gc_state.modal.coolant);
else restore_condition = block->condition;
#endif
while (sys.suspend) { while (sys.suspend) {
if (sys.abort) return; if (sys.abort) return;
// Block until initial hold is complete and the machine has stopped motion. // Block until initial hold is complete and the machine has stopped motion.
@@ -603,16 +599,16 @@ static void protocol_exec_rt_suspend() {
coolant_set_state(COOLANT_DISABLE); // De-energize coolant_set_state(COOLANT_DISABLE); // De-energize
// Execute fast parking retract motion to parking target location. // Execute fast parking retract motion to parking target location.
if (parking_target[PARKING_AXIS] < PARKING_TARGET) { if (parking_target[PARKING_AXIS] < PARKING_TARGET) {
parking_target[PARKING_AXIS] = PARKING_TARGET; parking_target[PARKING_AXIS] = PARKING_TARGET;
pl_data->feed_rate = PARKING_RATE; pl_data->feed_rate = PARKING_RATE;
mc_parking_motion(parking_target, pl_data); mc_parking_motion(parking_target, pl_data);
} }
} else { } else {
// Parking motion not possible. Just disable the spindle and coolant. // Parking motion not possible. Just disable the spindle and coolant.
// NOTE: Laser mode does not start a parking motion to ensure the laser stops immediately. // NOTE: Laser mode does not start a parking motion to ensure the laser stops immediately.
spindle_set_state(SPINDLE_DISABLE, 0.0); // De-energize ->set_state((SPINDLE_DISABLE, 0.0); // De-energize
coolant_set_state(COOLANT_DISABLE); // De-energize coolant_set_state(COOLANT_DISABLE); // De-energize
} }
#endif #endif
sys.suspend &= ~(SUSPEND_RESTART_RETRACT); sys.suspend &= ~(SUSPEND_RESTART_RETRACT);
sys.suspend |= SUSPEND_RETRACT_COMPLETE; sys.suspend |= SUSPEND_RETRACT_COMPLETE;
@@ -621,7 +617,6 @@ static void protocol_exec_rt_suspend() {
report_feedback_message(MESSAGE_SLEEP_MODE); report_feedback_message(MESSAGE_SLEEP_MODE);
// Spindle and coolant should already be stopped, but do it again just to be sure. // Spindle and coolant should already be stopped, but do it again just to be sure.
spindle->set_state(SPINDLE_DISABLE, 0); // De-energize spindle->set_state(SPINDLE_DISABLE, 0); // De-energize
coolant_set_state(COOLANT_DISABLE); // De-energize coolant_set_state(COOLANT_DISABLE); // De-energize
st_go_idle(); // Disable steppers st_go_idle(); // Disable steppers
while (!(sys.abort)) protocol_exec_rt_system(); // Do nothing until reset. while (!(sys.abort)) protocol_exec_rt_system(); // Do nothing until reset.
@@ -658,7 +653,7 @@ static void protocol_exec_rt_suspend() {
if (bit_isfalse(sys.suspend, SUSPEND_RESTART_RETRACT)) { if (bit_isfalse(sys.suspend, SUSPEND_RESTART_RETRACT)) {
if (bit_istrue(settings.flags, BITFLAG_LASER_MODE)) { if (bit_istrue(settings.flags, BITFLAG_LASER_MODE)) {
// When in laser mode, ignore spindle spin-up delay. Set to turn on laser when cycle starts. // When in laser mode, ignore spindle spin-up delay. Set to turn on laser when cycle starts.
bit_true(sys.step_control, STEP_CONTROL_UPDATE_SPINDLE_PWM); bit_true(sys.step_control, STEP_CONTROL_UPDATE_SPINDLE_RPM);
} else { } else {
spindle->set_state((restore_condition & (PL_COND_FLAG_SPINDLE_CW | PL_COND_FLAG_SPINDLE_CCW)), (uint32_t)restore_spindle_speed); spindle->set_state((restore_condition & (PL_COND_FLAG_SPINDLE_CW | PL_COND_FLAG_SPINDLE_CCW)), (uint32_t)restore_spindle_speed);
delay_sec(SAFETY_DOOR_SPINDLE_DELAY, DELAY_MODE_SYS_SUSPEND); delay_sec(SAFETY_DOOR_SPINDLE_DELAY, DELAY_MODE_SYS_SUSPEND);
@@ -707,7 +702,6 @@ static void protocol_exec_rt_suspend() {
if (sys.spindle_stop_ovr & SPINDLE_STOP_OVR_INITIATE) { if (sys.spindle_stop_ovr & SPINDLE_STOP_OVR_INITIATE) {
if (gc_state.modal.spindle != SPINDLE_DISABLE) { if (gc_state.modal.spindle != SPINDLE_DISABLE) {
spindle->set_state(SPINDLE_DISABLE, 0); // De-energize spindle->set_state(SPINDLE_DISABLE, 0); // De-energize
sys.spindle_stop_ovr = SPINDLE_STOP_OVR_ENABLED; // Set stop override state to enabled, if de-energized. sys.spindle_stop_ovr = SPINDLE_STOP_OVR_ENABLED; // Set stop override state to enabled, if de-energized.
} else { } else {
sys.spindle_stop_ovr = SPINDLE_STOP_OVR_DISABLED; // Clear stop override state sys.spindle_stop_ovr = SPINDLE_STOP_OVR_DISABLED; // Clear stop override state
@@ -718,7 +712,7 @@ static void protocol_exec_rt_suspend() {
report_feedback_message(MESSAGE_SPINDLE_RESTORE); report_feedback_message(MESSAGE_SPINDLE_RESTORE);
if (bit_istrue(settings.flags, BITFLAG_LASER_MODE)) { if (bit_istrue(settings.flags, BITFLAG_LASER_MODE)) {
// When in laser mode, ignore spindle spin-up delay. Set to turn on laser when cycle starts. // When in laser mode, ignore spindle spin-up delay. Set to turn on laser when cycle starts.
bit_true(sys.step_control, STEP_CONTROL_UPDATE_SPINDLE_PWM); bit_true(sys.step_control, STEP_CONTROL_UPDATE_SPINDLE_RPM);
} else } else
spindle->set_state((restore_condition & (PL_COND_FLAG_SPINDLE_CW | PL_COND_FLAG_SPINDLE_CCW)), (uint32_t)restore_spindle_speed); spindle->set_state((restore_condition & (PL_COND_FLAG_SPINDLE_CW | PL_COND_FLAG_SPINDLE_CCW)), (uint32_t)restore_spindle_speed);
} }

View File

@@ -308,11 +308,8 @@ void report_grbl_settings(uint8_t client, uint8_t show_extended) {
sprintf(setting, "$27=%4.3f\r\n", settings.homing_pulloff); strcat(rpt, setting); sprintf(setting, "$27=%4.3f\r\n", settings.homing_pulloff); strcat(rpt, setting);
sprintf(setting, "$30=%4.3f\r\n", settings.rpm_max); strcat(rpt, setting); sprintf(setting, "$30=%4.3f\r\n", settings.rpm_max); strcat(rpt, setting);
sprintf(setting, "$31=%4.3f\r\n", settings.rpm_min); strcat(rpt, setting); sprintf(setting, "$31=%4.3f\r\n", settings.rpm_min); strcat(rpt, setting);
#ifdef VARIABLE_SPINDLE
sprintf(setting, "$32=%d\r\n", bit_istrue(settings.flags, BITFLAG_LASER_MODE)); strcat(rpt, setting); sprintf(setting, "$32=%d\r\n", bit_istrue(settings.flags, BITFLAG_LASER_MODE)); strcat(rpt, setting);
#else
strcat(rpt, "$32=0\r\n");
#endif
if (show_extended) { if (show_extended) {
sprintf(setting, "$33=%5.3f\r\n", settings.spindle_pwm_freq); strcat(rpt, setting); sprintf(setting, "$33=%5.3f\r\n", settings.spindle_pwm_freq); strcat(rpt, setting);
sprintf(setting, "$34=%3.3f\r\n", settings.spindle_pwm_off_value); strcat(rpt, setting); sprintf(setting, "$34=%3.3f\r\n", settings.spindle_pwm_off_value); strcat(rpt, setting);
@@ -471,10 +468,8 @@ void report_gcode_modes(uint8_t client) {
else else
sprintf(temp, " F%.0f", gc_state.feed_rate); sprintf(temp, " F%.0f", gc_state.feed_rate);
strcat(modes_rpt, temp); strcat(modes_rpt, temp);
#ifdef VARIABLE_SPINDLE
sprintf(temp, " S%4.3f", gc_state.spindle_speed); sprintf(temp, " S%4.3f", gc_state.spindle_speed);
strcat(modes_rpt, temp); strcat(modes_rpt, temp);
#endif
strcat(modes_rpt, "]\r\n"); strcat(modes_rpt, "]\r\n");
grbl_send(client, modes_rpt); grbl_send(client, modes_rpt);
} }
@@ -497,12 +492,8 @@ void report_build_info(char* line, uint8_t client) {
strcpy(build_info, "[VER:" GRBL_VERSION "." GRBL_VERSION_BUILD ":"); strcpy(build_info, "[VER:" GRBL_VERSION "." GRBL_VERSION_BUILD ":");
strcat(build_info, line); strcat(build_info, line);
strcat(build_info, "]\r\n[OPT:"); strcat(build_info, "]\r\n[OPT:");
#ifdef VARIABLE_SPINDLE strcat(build_info, "V"); // variable spindle..always on now
strcat(build_info, "V");
#endif
#ifdef USE_LINE_NUMBERS
strcat(build_info, "N"); strcat(build_info, "N");
#endif
#ifdef COOLANT_MIST_PIN #ifdef COOLANT_MIST_PIN
strcat(build_info, "M"); // TODO Need to deal with M8...it could be disabled strcat(build_info, "M"); // TODO Need to deal with M8...it could be disabled
#endif #endif
@@ -558,6 +549,7 @@ void report_build_info(char* line, uint8_t client) {
// These will likely have a comma delimiter to separate them. // These will likely have a comma delimiter to separate them.
strcat(build_info, "]\r\n"); strcat(build_info, "]\r\n");
grbl_send(client, build_info); // ok to send to all grbl_send(client, build_info); // ok to send to all
report_machine_type(client);
#if defined (ENABLE_WIFI) #if defined (ENABLE_WIFI)
grbl_send(client, (char*)wifi_config.info()); grbl_send(client, (char*)wifi_config.info());
#endif #endif
@@ -679,19 +671,11 @@ void report_realtime_status(uint8_t client) {
#endif #endif
// Report realtime feed speed // Report realtime feed speed
#ifdef REPORT_FIELD_CURRENT_FEED_SPEED #ifdef REPORT_FIELD_CURRENT_FEED_SPEED
#ifdef VARIABLE_SPINDLE
if (bit_istrue(settings.flags, BITFLAG_REPORT_INCHES)) if (bit_istrue(settings.flags, BITFLAG_REPORT_INCHES))
sprintf(temp, "|FS:%.1f,%d", st_get_realtime_rate()/ MM_PER_INCH, sys.spindle_speed); sprintf(temp, "|FS:%.1f,%d", st_get_realtime_rate()/ MM_PER_INCH, sys.spindle_speed);
else else
sprintf(temp, "|FS:%.0f,%d", st_get_realtime_rate(), sys.spindle_speed); sprintf(temp, "|FS:%.0f,%d", st_get_realtime_rate(), sys.spindle_speed);
strcat(status, temp); strcat(status, temp);
#else
if (bit_istrue(settings.flags, BITFLAG_REPORT_INCHES))
sprintf(temp, "|F:%.1f", st_get_realtime_rate() / MM_PER_INCH);
else
sprintf(temp, "|F:%.0f", st_get_realtime_rate());
strcat(status, temp);
#endif
#endif #endif
#ifdef REPORT_FIELD_PIN_STATE #ifdef REPORT_FIELD_PIN_STATE
uint8_t lim_pin_state = limits_get_state(); uint8_t lim_pin_state = limits_get_state();
@@ -744,7 +728,7 @@ void report_realtime_status(uint8_t client) {
} else sys.report_ovr_counter = (REPORT_OVR_REFRESH_IDLE_COUNT - 1); } else sys.report_ovr_counter = (REPORT_OVR_REFRESH_IDLE_COUNT - 1);
sprintf(temp, "|Ov:%d,%d,%d", sys.f_override, sys.r_override, sys.spindle_speed_ovr); sprintf(temp, "|Ov:%d,%d,%d", sys.f_override, sys.r_override, sys.spindle_speed_ovr);
strcat(status, temp); strcat(status, temp);
uint8_t sp_state = spindle_get_state(); uint8_t sp_state = spindle->get_state();
uint8_t cl_state = coolant_get_state(); uint8_t cl_state = coolant_get_state();
if (sp_state || cl_state) { if (sp_state || cl_state) {
strcat(status, "|A:"); strcat(status, "|A:");

View File

@@ -170,6 +170,8 @@ void report_gcode_comment(char* comment);
void report_realtime_debug(); void report_realtime_debug();
#endif #endif
void report_machine_type(uint8_t client);
void report_hex_msg(char* buf, const char *prefix, int len); void report_hex_msg(char* buf, const char *prefix, int len);
char report_get_axis_letter(uint8_t axis); char report_get_axis_letter(uint8_t axis);

View File

@@ -40,7 +40,7 @@ void settings_init() {
if (!read_global_settings()) { if (!read_global_settings()) {
report_status_message(STATUS_SETTING_READ_FAIL, CLIENT_SERIAL); report_status_message(STATUS_SETTING_READ_FAIL, CLIENT_SERIAL);
settings_restore(SETTINGS_RESTORE_ALL); // Force restore all EEPROM data. settings_restore(SETTINGS_RESTORE_ALL); // Force restore all EEPROM data.
report_grbl_settings(CLIENT_SERIAL, false); // only the serial could be working at this point report_grbl_settings(CLIENT_SERIAL, false);
} }
} }
@@ -64,12 +64,14 @@ void settings_restore(uint8_t restore_flag) {
settings.status_report_mask = DEFAULT_STATUS_REPORT_MASK; settings.status_report_mask = DEFAULT_STATUS_REPORT_MASK;
settings.junction_deviation = DEFAULT_JUNCTION_DEVIATION; settings.junction_deviation = DEFAULT_JUNCTION_DEVIATION;
settings.arc_tolerance = DEFAULT_ARC_TOLERANCE; settings.arc_tolerance = DEFAULT_ARC_TOLERANCE;
settings.rpm_max = DEFAULT_SPINDLE_RPM_MAX;
settings.rpm_min = DEFAULT_SPINDLE_RPM_MIN;
settings.spindle_pwm_freq = DEFAULT_SPINDLE_FREQ; // $33 Hz (extended set) settings.spindle_pwm_freq = DEFAULT_SPINDLE_FREQ; // $33 Hz (extended set)
settings.spindle_pwm_off_value = DEFAULT_SPINDLE_OFF_VALUE; // $34 Percent (extended set) settings.spindle_pwm_off_value = DEFAULT_SPINDLE_OFF_VALUE; // $34 Percent (extended set)
settings.spindle_pwm_min_value = DEFAULT_SPINDLE_MIN_VALUE; // $35 Percent (extended set) settings.spindle_pwm_min_value = DEFAULT_SPINDLE_MIN_VALUE; // $35 Percent (extended set)
settings.spindle_pwm_max_value = DEFAULT_SPINDLE_MAX_VALUE; // $36 Percent (extended set) settings.spindle_pwm_max_value = DEFAULT_SPINDLE_MAX_VALUE; // $36 Percent (extended set)
settings.rpm_max = DEFAULT_SPINDLE_RPM_MAX;
settings.rpm_min = DEFAULT_SPINDLE_RPM_MIN;
settings.homing_dir_mask = DEFAULT_HOMING_DIR_MASK; settings.homing_dir_mask = DEFAULT_HOMING_DIR_MASK;
settings.homing_feed_rate = DEFAULT_HOMING_FEED_RATE; settings.homing_feed_rate = DEFAULT_HOMING_FEED_RATE;
settings.homing_seek_rate = DEFAULT_HOMING_SEEK_RATE; settings.homing_seek_rate = DEFAULT_HOMING_SEEK_RATE;
@@ -366,20 +368,19 @@ uint8_t settings_store_global_setting(uint8_t parameter, float value) {
case 25: settings.homing_seek_rate = value; break; case 25: settings.homing_seek_rate = value; break;
case 26: settings.homing_debounce_delay = int_value; break; case 26: settings.homing_debounce_delay = int_value; break;
case 27: settings.homing_pulloff = value; break; case 27: settings.homing_pulloff = value; break;
case 30: settings.rpm_max = value; spindle_init(); break; // Re-initialize spindle rpm calibration case 30: settings.rpm_max = std::max(value, 1.0f); spindle->init(); break; // Re-initialize spindle rpm calibration (min of 1)
case 31: settings.rpm_min = value; spindle_init(); break; // Re-initialize spindle rpm calibration case 31: settings.rpm_min = value; spindle->init(); break; // Re-initialize spindle rpm calibration
case 32: case 32:
#ifdef VARIABLE_SPINDLE if (int_value)
if (int_value) settings.flags |= BITFLAG_LASER_MODE; settings.flags |= BITFLAG_LASER_MODE;
else settings.flags &= ~BITFLAG_LASER_MODE; else
#else settings.flags &= ~BITFLAG_LASER_MODE;
return (STATUS_SETTING_DISABLED_LASER); spindle->init(); // update the spindle class
#endif
break; break;
case 33: settings.spindle_pwm_freq = value; spindle_init(); break; // Re-initialize spindle pwm calibration case 33: settings.spindle_pwm_freq = value; spindle_select(SPINDLE_TYPE); break; // Re-initialize spindle pwm calibration
case 34: settings.spindle_pwm_off_value = value; spindle_init(); break; // Re-initialize spindle pwm calibration case 34: settings.spindle_pwm_off_value = value; spindle_select(SPINDLE_TYPE); break; // Re-initialize spindle pwm calibration
case 35: settings.spindle_pwm_min_value = value; spindle_init(); break; // Re-initialize spindle pwm calibration case 35: settings.spindle_pwm_min_value = value; spindle_select(SPINDLE_TYPE); break; // Re-initialize spindle pwm calibration
case 36: settings.spindle_pwm_max_value = value; spindle_init(); break; // Re-initialize spindle pwm calibration case 36: settings.spindle_pwm_max_value = value; spindle_select(SPINDLE_TYPE); break; // Re-initialize spindle pwm calibration
case 80: case 80:
case 81: case 81:
case 82: case 82:

View File

@@ -1,226 +0,0 @@
/*
spindle_control.cpp - Header for system level commands and real-time processes
Part of Grbl
Copyright (c) 2014-2016 Sungeun K. Jeon for Gnea Research LLC
2018 - Bart Dring This file was modified for use on the ESP32
CPU. Do not use this with Grbl for atMega328P
Grbl is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Grbl is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Grbl. If not, see <http://www.gnu.org/licenses/>.
*/
#include "grbl.h"
int8_t spindle_pwm_chan_num;
#ifdef SPINDLE_PWM_PIN
static float pwm_gradient; // Precalulated value to speed up rpm to PWM conversions.
uint32_t spindle_pwm_period; // how many counts in 1 period
uint32_t spindle_pwm_off_value;
uint32_t spindle_pwm_min_value;
uint32_t spindle_pwm_max_value;
#endif
void spindle_init() {
#ifdef SPINDLE_PWM_PIN
#ifdef INVERT_SPINDLE_PWM
grbl_msg_sendf(CLIENT_SERIAL, MSG_LEVEL_INFO, "INVERT_SPINDLE_PWM");
#endif
#ifdef INVERT_SPINDLE_ENABLE_PIN
grbl_msg_sendf(CLIENT_SERIAL, MSG_LEVEL_INFO, "INVERT_SPINDLE_ENABLE_PIN");
#endif
// determine how many PWM counts are in eqach PWM cycle
spindle_pwm_period = ((1 << SPINDLE_PWM_BIT_PRECISION) - 1);
if (settings.spindle_pwm_min_value > settings.spindle_pwm_min_value)
grbl_msg_sendf(CLIENT_SERIAL, MSG_LEVEL_INFO, "Warning spindle min pwm is greater than max. Check $35 and $36");
// pre-caculate some PWM count values
spindle_pwm_off_value = (spindle_pwm_period * settings.spindle_pwm_off_value / 100.0);
spindle_pwm_min_value = (spindle_pwm_period * settings.spindle_pwm_min_value / 100.0);
spindle_pwm_max_value = (spindle_pwm_period * settings.spindle_pwm_max_value / 100.0);
// The pwm_gradient is the pwm duty cycle units per rpm
pwm_gradient = (spindle_pwm_max_value - spindle_pwm_min_value) / (settings.rpm_max - settings.rpm_min);
// Use DIR and Enable if pins are defined
#ifdef SPINDLE_ENABLE_PIN
pinMode(SPINDLE_ENABLE_PIN, OUTPUT);
#endif
#ifdef SPINDLE_DIR_PIN
pinMode(SPINDLE_DIR_PIN, OUTPUT);
#endif
// use the LED control feature to setup PWM https://docs.espressif.com/projects/esp-idf/en/latest/api-reference/peripherals/ledc.html
spindle_pwm_chan_num = 0; // spindle always uses channel 0
ledcSetup(spindle_pwm_chan_num, (double)settings.spindle_pwm_freq, SPINDLE_PWM_BIT_PRECISION); // setup the channel
ledcAttachPin(SPINDLE_PWM_PIN, spindle_pwm_chan_num); // attach the PWM to the pin
// Start with spindle off off
spindle_stop();
#endif
}
void spindle_stop() {
spindle_set_enable(false);
#ifdef SPINDLE_PWM_PIN
#ifndef INVERT_SPINDLE_PWM
grbl_analogWrite(spindle_pwm_chan_num, spindle_pwm_off_value);
#else
grbl_analogWrite(spindle_pwm_chan_num, (1 << SPINDLE_PWM_BIT_PRECISION)); // TO DO...wrong for min_pwm
#endif
#endif
}
uint8_t spindle_get_state() { // returns SPINDLE_STATE_DISABLE, SPINDLE_STATE_CW or SPINDLE_STATE_CCW
// TODO Update this when direction and enable pin are added
#ifndef SPINDLE_PWM_PIN
return (SPINDLE_STATE_DISABLE);
#else
if (ledcRead(spindle_pwm_chan_num) == 0) // Check the PWM value
return (SPINDLE_STATE_DISABLE);
else {
#ifdef SPINDLE_DIR_PIN
if (digitalRead(SPINDLE_DIR_PIN))
return (SPINDLE_STATE_CW);
else
return (SPINDLE_STATE_CCW);
#else
return (SPINDLE_STATE_CW);
#endif
}
#endif
}
void spindle_set_speed(uint32_t pwm_value) {
#ifndef SPINDLE_PWM_PIN
//grbl_sendf(CLIENT_SERIAL, "[MSG: set speed...no pin defined]\r\n");
return;
#else
#ifndef SPINDLE_ENABLE_OFF_WITH_ZERO_SPEED
spindle_set_enable(true);
#else
spindle_set_enable(pwm_value != 0);
#endif
#ifndef INVERT_SPINDLE_PWM
grbl_analogWrite(spindle_pwm_chan_num, pwm_value);
#else
grbl_analogWrite(spindle_pwm_chan_num, (1 << SPINDLE_PWM_BIT_PRECISION) - pwm_value);
#endif
#endif
}
uint32_t spindle_compute_pwm_value(float rpm) {
#ifdef SPINDLE_PWM_PIN
uint32_t pwm_value;
rpm *= (0.010 * sys.spindle_speed_ovr); // Scale by spindle speed override value.
// Calculate PWM register value based on rpm max/min settings and programmed rpm.
if ((settings.rpm_min >= settings.rpm_max) || (rpm >= settings.rpm_max)) {
// No PWM range possible. Set simple on/off spindle control pin state.
sys.spindle_speed = settings.rpm_max;
pwm_value = spindle_pwm_max_value;
} else if (rpm <= settings.rpm_min) {
if (rpm == 0.0) { // S0 disables spindle
sys.spindle_speed = 0.0;
pwm_value = spindle_pwm_off_value;
} else { // Set minimum PWM output
sys.spindle_speed = settings.rpm_min;
pwm_value = spindle_pwm_min_value;
}
} else {
// Compute intermediate PWM value with linear spindle speed model.
// NOTE: A nonlinear model could be installed here, if required, but keep it VERY light-weight.
sys.spindle_speed = rpm;
#ifdef ENABLE_PIECEWISE_LINEAR_SPINDLE
pwm_value = piecewise_linear_fit(rpm);
#else
pwm_value = floor((rpm - settings.rpm_min) * pwm_gradient) + spindle_pwm_min_value;
#endif
}
return (pwm_value);
#else
return (0); // no SPINDLE_PWM_PIN
#endif
}
// Called by spindle_set_state() and step segment generator. Keep routine small and efficient.
void spindle_set_state(uint8_t state, float rpm) {
#ifdef SPINDLE_PWM_PIN
if (sys.abort) return; // Block during abort.
if (state == SPINDLE_DISABLE) { // Halt or set spindle direction and rpm.
sys.spindle_speed = 0.0;
spindle_stop();
} else {
// TODO ESP32 Enable and direction control
#ifdef SPINDLE_DIR_PIN
digitalWrite(SPINDLE_DIR_PIN, state == SPINDLE_ENABLE_CW);
#endif
// NOTE: Assumes all calls to this function is when Grbl is not moving or must remain off.
if (settings.flags & BITFLAG_LASER_MODE) {
if (state == SPINDLE_ENABLE_CCW) rpm = 0.0; // TODO: May need to be rpm_min*(100/MAX_SPINDLE_SPEED_OVERRIDE);
}
spindle_set_speed(spindle_compute_pwm_value(rpm));
}
sys.report_ovr_counter = 0; // Set to report change immediately
#endif
}
void spindle_sync(uint8_t state, float rpm) {
if (sys.state == STATE_CHECK_MODE)
return;
protocol_buffer_synchronize(); // Empty planner buffer to ensure spindle is set when programmed.
spindle_set_state(state, rpm);
}
void grbl_analogWrite(uint8_t chan, uint32_t duty) {
// Remember the old duty cycle in memory instead of reading
// it from the I/O peripheral because I/O reads are quite
// a bit slower than memory reads.
static uint32_t old_duty = 0;
if (old_duty != duty) { // reduce unnecessary calls to ledcWrite()
old_duty = duty;
ledcWrite(chan, duty);
}
}
void spindle_set_enable(bool enable) {
#ifdef SPINDLE_ENABLE_PIN
#ifndef INVERT_SPINDLE_ENABLE_PIN
digitalWrite(SPINDLE_ENABLE_PIN, enable); // turn off (low) with zero speed
#else
digitalWrite(SPINDLE_ENABLE_PIN, !enable); // turn off (high) with zero speed
#endif
#endif
}
uint32_t piecewise_linear_fit(float rpm) {
uint32_t pwm_value;
#if (N_PIECES > 3)
if (rpm > RPM_POINT34)
pwm_value = floor(RPM_LINE_A4 * rpm - RPM_LINE_B4);
else
#endif
#if (N_PIECES > 2)
if (rpm > RPM_POINT23)
pwm_value = floor(RPM_LINE_A3 * rpm - RPM_LINE_B3);
else
#endif
#if (N_PIECES > 1)
if (rpm > RPM_POINT12)
pwm_value = floor(RPM_LINE_A2 * rpm - RPM_LINE_B2);
else
#endif
{
pwm_value = floor(RPM_LINE_A1 * rpm - RPM_LINE_B1);
}
return pwm_value;
}

View File

@@ -1,47 +0,0 @@
/*
spindle.h - Header for system level commands and real-time processes
Part of Grbl
Copyright (c) 2014-2016 Sungeun K. Jeon for Gnea Research LLC
2018 - Bart Dring This file was modified for use on the ESP32
CPU. Do not use this with Grbl for atMega328P
Grbl is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Grbl is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Grbl. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef spindle_control_h
#define spindle_control_h
#include "grbl.h"
#define SPINDLE_NO_SYNC false
#define SPINDLE_FORCE_SYNC true
#define SPINDLE_STATE_DISABLE 0 // Must be zero.
#define SPINDLE_STATE_CW bit(0)
#define SPINDLE_STATE_CCW bit(1)
extern uint32_t spindle_pwm_off_value;
void spindle_init();
void spindle_stop();
uint8_t spindle_get_state();
void spindle_set_speed(uint32_t pwm_value);
uint32_t spindle_compute_pwm_value(float rpm);
void spindle_set_state(uint8_t state, float rpm);
void spindle_sync(uint8_t state, float rpm);
void grbl_analogWrite(uint8_t chan, uint32_t duty);
void spindle_set_enable(bool enable);
uint32_t piecewise_linear_fit(float rpm);
#endif

View File

@@ -1,5 +1,3 @@
#include "grbl.h"
/* /*
stepper.c - stepper motor driver: executes motion plans using stepper motors stepper.c - stepper motor driver: executes motion plans using stepper motors
Part of Grbl Part of Grbl
@@ -37,9 +35,7 @@ typedef struct {
uint32_t steps[N_AXIS]; uint32_t steps[N_AXIS];
uint32_t step_event_count; uint32_t step_event_count;
uint8_t direction_bits; uint8_t direction_bits;
#ifdef VARIABLE_SPINDLE
uint8_t is_pwm_rate_adjusted; // Tracks motions that require constant laser power/rate uint8_t is_pwm_rate_adjusted; // Tracks motions that require constant laser power/rate
#endif
} st_block_t; } st_block_t;
static st_block_t st_block_buffer[SEGMENT_BUFFER_SIZE - 1]; static st_block_t st_block_buffer[SEGMENT_BUFFER_SIZE - 1];
@@ -56,9 +52,7 @@ typedef struct {
#else #else
uint8_t prescaler; // Without AMASS, a prescaler is required to adjust for slow timing. uint8_t prescaler; // Without AMASS, a prescaler is required to adjust for slow timing.
#endif #endif
#ifdef VARIABLE_SPINDLE uint16_t spindle_rpm; // TODO get rid of this.
uint16_t spindle_pwm;
#endif
} segment_t; } segment_t;
static segment_t segment_buffer[SEGMENT_BUFFER_SIZE]; static segment_t segment_buffer[SEGMENT_BUFFER_SIZE];
@@ -145,10 +139,11 @@ typedef struct {
float accelerate_until; // Acceleration ramp end measured from end of block (mm) float accelerate_until; // Acceleration ramp end measured from end of block (mm)
float decelerate_after; // Deceleration ramp start measured from end of block (mm) float decelerate_after; // Deceleration ramp start measured from end of block (mm)
#ifdef VARIABLE_SPINDLE
float inv_rate; // Used by PWM laser mode to speed up segment calculations. float inv_rate; // Used by PWM laser mode to speed up segment calculations.
uint16_t current_spindle_pwm; //uint16_t current_spindle_pwm; // todo remove
#endif float current_spindle_rpm;
} st_prep_t; } st_prep_t;
static st_prep_t prep; static st_prep_t prep;
@@ -294,7 +289,7 @@ void IRAM_ATTR onStepperDriverTimer(void* para) { // ISR It is time to take a st
spindle->set_rpm(0); spindle->set_rpm(0);
} }
} }
#endif
system_set_exec_state_flag(EXEC_CYCLE_STOP); // Flag main program for cycle end system_set_exec_state_flag(EXEC_CYCLE_STOP); // Flag main program for cycle end
return; // Nothing to do but exit. return; // Nothing to do but exit.
} }
@@ -686,37 +681,37 @@ void set_direction_pins_on(uint8_t onMask) {
#ifdef X_DIRECTION_PIN #ifdef X_DIRECTION_PIN
digitalWrite(X_DIRECTION_PIN, (onMask & (1 << X_AXIS))); digitalWrite(X_DIRECTION_PIN, (onMask & (1 << X_AXIS)));
#endif #endif
#ifdef X2_DIRECTION_PIN // optional ganged axis #ifdef X2_DIRECTION_PIN // optional ganged axis
digitalWrite(X2_DIRECTION_PIN, (onMask & (1 << X_AXIS))); digitalWrite(X2_DIRECTION_PIN, (onMask & (1 << X_AXIS)));
#endif #endif
#ifdef Y_DIRECTION_PIN #ifdef Y_DIRECTION_PIN
digitalWrite(Y_DIRECTION_PIN, (onMask & (1 << Y_AXIS))); digitalWrite(Y_DIRECTION_PIN, (onMask & (1 << Y_AXIS)));
#endif #endif
#ifdef Y2_DIRECTION_PIN // optional ganged axis #ifdef Y2_DIRECTION_PIN // optional ganged axis
digitalWrite(Y2_DIRECTION_PIN, (onMask & (1 << Y_AXIS))); digitalWrite(Y2_DIRECTION_PIN, (onMask & (1 << Y_AXIS)));
#endif #endif
#ifdef Z_DIRECTION_PIN #ifdef Z_DIRECTION_PIN
digitalWrite(Z_DIRECTION_PIN, (onMask & (1 << Z_AXIS))); digitalWrite(Z_DIRECTION_PIN, (onMask & (1 << Z_AXIS)));
#endif #endif
#ifdef Z2_DIRECTION_PIN // optional ganged axis #ifdef Z2_DIRECTION_PIN // optional ganged axis
digitalWrite(Z2_DIRECTION_PIN, (onMask & (1 << Z_AXIS))); digitalWrite(Z2_DIRECTION_PIN, (onMask & (1 << Z_AXIS)));
#endif #endif
#ifdef A_DIRECTION_PIN #ifdef A_DIRECTION_PIN
digitalWrite(A_DIRECTION_PIN, (onMask & (1 << A_AXIS))); digitalWrite(A_DIRECTION_PIN, (onMask & (1 << A_AXIS)));
#endif #endif
#ifdef A2_DIRECTION_PIN // optional ganged axis #ifdef A2_DIRECTION_PIN // optional ganged axis
digitalWrite(A2_DIRECTION_PIN, (onMask & (1 << A_AXIS))); digitalWrite(A2_DIRECTION_PIN, (onMask & (1 << A_AXIS)));
#endif #endif
#ifdef B_DIRECTION_PIN #ifdef B_DIRECTION_PIN
digitalWrite(B_DIRECTION_PIN, (onMask & (1 << B_AXIS))); digitalWrite(B_DIRECTION_PIN, (onMask & (1 << B_AXIS)));
#endif #endif
#ifdef B2_DIRECTION_PIN // optional ganged axis #ifdef B2_DIRECTION_PIN // optional ganged axis
digitalWrite(B2_DIRECTION_PIN, (onMask & (1 << B_AXIS))); digitalWrite(B2_DIRECTION_PIN, (onMask & (1 << B_AXIS)));
#endif #endif
#ifdef C_DIRECTION_PIN #ifdef C_DIRECTION_PIN
digitalWrite(C_DIRECTION_PIN, (onMask & (1 << C_AXIS))); digitalWrite(C_DIRECTION_PIN, (onMask & (1 << C_AXIS)));
#endif #endif
#ifdef C2_DIRECTION_PIN // optional ganged axis #ifdef C2_DIRECTION_PIN // optional ganged axis
digitalWrite(C2_DIRECTION_PIN, (onMask & (1 << C_AXIS))); digitalWrite(C2_DIRECTION_PIN, (onMask & (1 << C_AXIS)));
#endif #endif
} }
@@ -1008,18 +1003,16 @@ void st_prep_buffer() {
prep.recalculate_flag &= ~(PREP_FLAG_DECEL_OVERRIDE); prep.recalculate_flag &= ~(PREP_FLAG_DECEL_OVERRIDE);
} else } else
prep.current_speed = sqrt(pl_block->entry_speed_sqr); prep.current_speed = sqrt(pl_block->entry_speed_sqr);
#ifdef VARIABLE_SPINDLE
// Setup laser mode variables. PWM rate adjusted motions will always complete a motion with the
// spindle off. if (spindle->isRateAdjusted() ){ // settings.flags & BITFLAG_LASER_MODE) {
st_prep_block->is_pwm_rate_adjusted = false;
if (settings.flags & BITFLAG_LASER_MODE) {
if (pl_block->condition & PL_COND_FLAG_SPINDLE_CCW) { if (pl_block->condition & PL_COND_FLAG_SPINDLE_CCW) {
// Pre-compute inverse programmed rate to speed up PWM updating per step segment. // Pre-compute inverse programmed rate to speed up PWM updating per step segment.
prep.inv_rate = 1.0 / pl_block->programmed_rate; prep.inv_rate = 1.0 / pl_block->programmed_rate;
st_prep_block->is_pwm_rate_adjusted = true; st_prep_block->is_pwm_rate_adjusted = true;
} }
} }
#endif
} }
/* --------------------------------------------------------------------------------- /* ---------------------------------------------------------------------------------
Compute the velocity profile of a new planner block based on its entry and exit Compute the velocity profile of a new planner block based on its entry and exit
@@ -1105,9 +1098,9 @@ void st_prep_buffer() {
prep.maximum_speed = prep.exit_speed; prep.maximum_speed = prep.exit_speed;
} }
} }
#ifdef VARIABLE_SPINDLE
bit_true(sys.step_control, STEP_CONTROL_UPDATE_SPINDLE_PWM); // Force update whenever updating block. bit_true(sys.step_control, STEP_CONTROL_UPDATE_SPINDLE_RPM); // Force update whenever updating block.
#endif
} }
// Initialize new segment // Initialize new segment
segment_t* prep_segment = &segment_buffer[segment_buffer_head]; segment_t* prep_segment = &segment_buffer[segment_buffer_head];
@@ -1211,29 +1204,32 @@ void st_prep_buffer() {
} }
} }
} while (mm_remaining > prep.mm_complete); // **Complete** Exit loop. Profile complete. } while (mm_remaining > prep.mm_complete); // **Complete** Exit loop. Profile complete.
#ifdef VARIABLE_SPINDLE
/* ----------------------------------------------------------------------------------- /* -----------------------------------------------------------------------------------
Compute spindle speed PWM output for step segment Compute spindle speed PWM output for step segment
*/ */
if (st_prep_block->is_pwm_rate_adjusted || (sys.step_control & STEP_CONTROL_UPDATE_SPINDLE_PWM)) { if (st_prep_block->is_pwm_rate_adjusted || (sys.step_control & STEP_CONTROL_UPDATE_SPINDLE_RPM)) {
if (pl_block->condition & (PL_COND_FLAG_SPINDLE_CW | PL_COND_FLAG_SPINDLE_CCW)) { if (pl_block->condition & (PL_COND_FLAG_SPINDLE_CW | PL_COND_FLAG_SPINDLE_CCW)) {
float rpm = pl_block->spindle_speed; float rpm = pl_block->spindle_speed;
// NOTE: Feed and rapid overrides are independent of PWM value and do not alter laser power/rate. // NOTE: Feed and rapid overrides are independent of PWM value and do not alter laser power/rate.
if (st_prep_block->is_pwm_rate_adjusted) if (st_prep_block->is_pwm_rate_adjusted) {
rpm *= (prep.current_speed * prep.inv_rate); rpm *= (prep.current_speed * prep.inv_rate);
//grbl_msg_sendf(CLIENT_SERIAL, MSG_LEVEL_INFO, "RPM %.2f", rpm);
//grbl_msg_sendf(CLIENT_SERIAL, MSG_LEVEL_INFO, "Rates CV %.2f IV %.2f RPM %.2f", prep.current_speed, prep.inv_rate, rpm);
}
// If current_speed is zero, then may need to be rpm_min*(100/MAX_SPINDLE_SPEED_OVERRIDE) // If current_speed is zero, then may need to be rpm_min*(100/MAX_SPINDLE_SPEED_OVERRIDE)
// but this would be instantaneous only and during a motion. May not matter at all. // but this would be instantaneous only and during a motion. May not matter at all.
prep.current_spindle_pwm = spindle_compute_pwm_value(rpm);
prep.current_spindle_rpm = rpm;
} else { } else {
sys.spindle_speed = 0.0; sys.spindle_speed = 0.0;
#if ( (defined VARIABLE_SPINDLE) && (defined SPINDLE_PWM_PIN) ) prep.current_spindle_rpm = 0.0;
prep.current_spindle_pwm = spindle_pwm_off_value ;
#endif
} }
bit_false(sys.step_control, STEP_CONTROL_UPDATE_SPINDLE_PWM); bit_false(sys.step_control, STEP_CONTROL_UPDATE_SPINDLE_RPM);
} }
prep_segment->spindle_pwm = prep.current_spindle_pwm; // Reload segment PWM value prep_segment->spindle_rpm = prep.current_spindle_rpm; // Reload segment PWM value
#endif
/* ----------------------------------------------------------------------------------- /* -----------------------------------------------------------------------------------
Compute segment step rate, steps to execute, and apply necessary rate corrections. Compute segment step rate, steps to execute, and apply necessary rate corrections.
NOTE: Steps are computed by direct scalar conversion of the millimeter distance NOTE: Steps are computed by direct scalar conversion of the millimeter distance
@@ -1402,4 +1398,4 @@ bool get_stepper_disable() { // returns true if steppers are disabled
disabled = !disabled; // Apply pin invert. disabled = !disabled; // Apply pin invert.
} }
return disabled; return disabled;
} }

View File

@@ -26,7 +26,7 @@ bool debouncing = false; // debouncing in process
void system_ini() { // Renamed from system_init() due to conflict with esp32 files void system_ini() { // Renamed from system_init() due to conflict with esp32 files
// setup control inputs // setup control inputs
#ifndef IGNORE_CONTROL_PINS
#ifdef CONTROL_SAFETY_DOOR_PIN #ifdef CONTROL_SAFETY_DOOR_PIN
pinMode(CONTROL_SAFETY_DOOR_PIN, INPUT_PULLUP); pinMode(CONTROL_SAFETY_DOOR_PIN, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(CONTROL_SAFETY_DOOR_PIN), isr_control_inputs, CHANGE); attachInterrupt(digitalPinToInterrupt(CONTROL_SAFETY_DOOR_PIN), isr_control_inputs, CHANGE);
@@ -73,7 +73,7 @@ void system_ini() { // Renamed from system_init() due to conflict with esp32 fil
5, // priority 5, // priority
NULL); NULL);
#endif #endif
#endif
//customize pin definition if needed //customize pin definition if needed
#if (GRBL_SPI_SS != -1) || (GRBL_SPI_MISO != -1) || (GRBL_SPI_MOSI != -1) || (GRBL_SPI_SCK != -1) #if (GRBL_SPI_SS != -1) || (GRBL_SPI_MISO != -1) || (GRBL_SPI_MOSI != -1) || (GRBL_SPI_SCK != -1)
SPI.begin(GRBL_SPI_SCK, GRBL_SPI_MISO, GRBL_SPI_MOSI, GRBL_SPI_SS); SPI.begin(GRBL_SPI_SCK, GRBL_SPI_MISO, GRBL_SPI_MOSI, GRBL_SPI_SS);
@@ -453,10 +453,8 @@ uint8_t system_check_travel_limits(float* target) {
// defined by the CONTROL_PIN_INDEX in the header file. // defined by the CONTROL_PIN_INDEX in the header file.
uint8_t system_control_get_state() { uint8_t system_control_get_state() {
uint8_t defined_pin_mask = 0; // a mask of defined pins uint8_t defined_pin_mask = 0; // a mask of defined pins
#ifdef IGNORE_CONTROL_PINS
return 0;
#endif
uint8_t control_state = 0; uint8_t control_state = 0;
#ifdef CONTROL_SAFETY_DOOR_PIN #ifdef CONTROL_SAFETY_DOOR_PIN
defined_pin_mask |= CONTROL_PIN_INDEX_SAFETY_DOOR; defined_pin_mask |= CONTROL_PIN_INDEX_SAFETY_DOOR;
if (digitalRead(CONTROL_SAFETY_DOOR_PIN)) control_state |= CONTROL_PIN_INDEX_SAFETY_DOOR; if (digitalRead(CONTROL_SAFETY_DOOR_PIN)) control_state |= CONTROL_PIN_INDEX_SAFETY_DOOR;
@@ -589,11 +587,13 @@ int8_t sys_get_next_RMT_chan_num() {
} }
} }
/* /*
This returns an unused pwm channel. This returns an unused pwm channel.
The 8 channels share 4 timers, so pairs 0,1 & 2,3 , etc The 8 channels share 4 timers, so pairs 0,1 & 2,3 , etc
have to be the same frequency. The spindle always uses channel 0 have to be the same frequency. The spindle always uses channel 0
so we start counting from 2. so we start counting from 2.
There are still possible issues if requested channels use different frequencies There are still possible issues if requested channels use different frequencies
TODO: Make this more robust. TODO: Make this more robust.
*/ */

View File

@@ -74,6 +74,7 @@ extern system_t sys;
#define EXEC_ALARM_HOMING_FAIL_DOOR 7 #define EXEC_ALARM_HOMING_FAIL_DOOR 7
#define EXEC_ALARM_HOMING_FAIL_PULLOFF 8 #define EXEC_ALARM_HOMING_FAIL_PULLOFF 8
#define EXEC_ALARM_HOMING_FAIL_APPROACH 9 #define EXEC_ALARM_HOMING_FAIL_APPROACH 9
#define EXEC_ALARM_SPINDLE_CONTROL 10
// Override bit maps. Realtime bitflags to control feed, rapid, spindle, and coolant overrides. // Override bit maps. Realtime bitflags to control feed, rapid, spindle, and coolant overrides.
// Spindle/coolant and feed/rapids are separated into two controlling flag variables. // Spindle/coolant and feed/rapids are separated into two controlling flag variables.
@@ -125,7 +126,7 @@ extern system_t sys;
#define STEP_CONTROL_END_MOTION bit(0) #define STEP_CONTROL_END_MOTION bit(0)
#define STEP_CONTROL_EXECUTE_HOLD bit(1) #define STEP_CONTROL_EXECUTE_HOLD bit(1)
#define STEP_CONTROL_EXECUTE_SYS_MOTION bit(2) #define STEP_CONTROL_EXECUTE_SYS_MOTION bit(2)
#define STEP_CONTROL_UPDATE_SPINDLE_PWM bit(3) #define STEP_CONTROL_UPDATE_SPINDLE_RPM bit(3)
// Define control pin index for Grbl internal use. Pin maps may change, but these values don't. // Define control pin index for Grbl internal use. Pin maps may change, but these values don't.
//#ifdef ENABLE_SAFETY_DOOR_INPUT_PIN //#ifdef ENABLE_SAFETY_DOOR_INPUT_PIN
@@ -152,8 +153,7 @@ extern system_t sys;
#define SPINDLE_STOP_OVR_RESTORE bit(2) #define SPINDLE_STOP_OVR_RESTORE bit(2)
#define SPINDLE_STOP_OVR_RESTORE_CYCLE bit(3) #define SPINDLE_STOP_OVR_RESTORE_CYCLE bit(3)
#define UNDEFINED_PIN 255 // Can be used to show a pin has no i/O assigned
// NOTE: These position variables may need to be declared as volatiles, if problems arise. // NOTE: These position variables may need to be declared as volatiles, if problems arise.
extern int32_t sys_position[N_AXIS]; // Real-time machine (aka home) position vector in steps. extern int32_t sys_position[N_AXIS]; // Real-time machine (aka home) position vector in steps.