1
0
mirror of https://github.com/bdring/Grbl_Esp32.git synced 2025-09-03 11:22:38 +02:00

Merge remote-tracking branch 'upstream/master'

This commit is contained in:
odaki
2020-01-28 22:00:36 +09:00
16 changed files with 154 additions and 135 deletions

View File

@@ -39,17 +39,17 @@ Some features should not be changed. See notes below.
#define config_h
#include <Arduino.h>
//#define ESP_DEBUG
// !!!! Most Important Configuration Item !!!!
// #define the CPU map you want to use
// The CPU map is the main definition of the machine/controller you want to use
// These are typically found in the cpu_map.h file.
// See Github repo wiki for more details
#define CPU_MAP_TEST_DRIVE // these are defined in cpu_map.h
#define N_AXIS 3 // Number of axes defined (valid range: 3 to 6)
// Define CPU pin map and default settings.
// NOTE: OEMs can avoid the need to maintain/update the defaults.h and cpu_map.h files and use only
// one configuration file by placing their specific defaults and pin map at the bottom of this file.
// If doing so, simply comment out these two defines and see instructions below.
#define CPU_MAP_TEST_DRIVE // these are defined in cpu_map.h
#define VERBOSE_HELP // adds addition help info, but could confuse some senders
// Serial baud rate
#define BAUD_RATE 115200

View File

@@ -59,8 +59,6 @@
*/
#define CPU_MAP_NAME "CPU_MAP_DEFAULT - Demo Only No I/O!"
#define CONTROL_FEED_HOLD_PIN GPIO_NUM_21 // Uno A1
#define LIMIT_MASK 0 // no limit pins
#endif
@@ -99,16 +97,10 @@
#define Z_LIMIT_PIN GPIO_NUM_15
#endif
#define X_STEP_PIN GPIO_NUM_12
#define X_RMT_CHANNEL 0
// #define Y_STEP_PIN (see versions above)
#define Y_RMT_CHANNEL 1
#define X_STEP_PIN GPIO_NUM_12
#define Z_STEP_PIN GPIO_NUM_27
#define Z_DIRECTION_PIN GPIO_NUM_33
#define Z_RMT_CHANNEL 2
#define Z_DIRECTION_PIN GPIO_NUM_33
// OK to comment out to use pin for other features
#define STEPPERS_DISABLE_PIN GPIO_NUM_13
@@ -138,44 +130,44 @@
// !!!! Experimental Untested !!!!!
// This is a CPU MAP for ESPDUINO-32 Boards and Protoneer V3 boards
// Note: Probe pin is mapped, but will require a 10k external pullup to 3.3V to work.
// Rebooting...See this issue https://github.com/bdring/Grbl_Esp32/issues/314
#define CPU_MAP_NAME "CPU_MAP_ESPDUINO_32"
#define USE_RMT_STEPS
#define X_STEP_PIN GPIO_NUM_26 // Uno D2
#define X_DIRECTION_PIN GPIO_NUM_16 // Uno D5
#define X_RMT_CHANNEL 0
#define X_STEP_PIN GPIO_NUM_26
#define X_DIRECTION_PIN GPIO_NUM_16
#define Y_STEP_PIN GPIO_NUM_25 // Uno D3
#define Y_DIRECTION_PIN GPIO_NUM_27 // Uno D6
#define Y_RMT_CHANNEL 1
#define Y_STEP_PIN GPIO_NUM_25
#define Y_DIRECTION_PIN GPIO_NUM_27
#define Z_STEP_PIN GPIO_NUM_17 // Uno D4
#define Z_DIRECTION_PIN GPIO_NUM_14 // Uno D7
#define Z_RMT_CHANNEL 2
#define Z_STEP_PIN GPIO_NUM_17
#define Z_DIRECTION_PIN GPIO_NUM_14
// OK to comment out to use pin for other features
#define STEPPERS_DISABLE_PIN GPIO_NUM_12 // Uno D8
#define STEPPERS_DISABLE_PIN GPIO_NUM_12
#define SPINDLE_PWM_PIN GPIO_NUM_19 // Uno D11
#define SPINDLE_PWM_PIN GPIO_NUM_19
#define SPINDLE_PWM_CHANNEL 0
#define SPINDLE_PWM_BIT_PRECISION 8 // be sure to match this with SPINDLE_PWM_MAX_VALUE
#define SPINDLE_DIR_PIN GPIO_NUM_18 // Uno D13
#define SPINDLE_DIR_PIN GPIO_NUM_18
#define COOLANT_FLOOD_PIN GPIO_NUM_34 // Uno A3
#define COOLANT_MIST_PIN GPIO_NUM_36// Uno A4
#define COOLANT_FLOOD_PIN GPIO_NUM_34
#define COOLANT_MIST_PIN GPIO_NUM_36
#define X_LIMIT_PIN GPIO_NUM_13 // Uno D9
#define Y_LIMIT_PIN GPIO_NUM_5 // Uno D10
#define Z_LIMIT_PIN GPIO_NUM_19 // Uno D12
#define X_LIMIT_PIN GPIO_NUM_13
#define Y_LIMIT_PIN GPIO_NUM_5
#define Z_LIMIT_PIN GPIO_NUM_19
#define LIMIT_MASK B111
#define PROBE_PIN GPIO_NUM_39 // Uno A5
#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 // Uno A0
#define CONTROL_FEED_HOLD_PIN GPIO_NUM_4 // Uno A1
#define CONTROL_CYCLE_START_PIN GPIO_NUM_35 // Uno A2 ... ESP32 needs external pullup
#define CONTROL_RESET_PIN GPIO_NUM_2
#define CONTROL_FEED_HOLD_PIN GPIO_NUM_4
#define CONTROL_CYCLE_START_PIN GPIO_NUM_35 // ESP32 needs external pullup
#endif
#ifdef CPU_MAP_ESP32_ESC_SPINDLE
@@ -185,20 +177,19 @@
// https://github.com/bdring/Grbl_Esp32/wiki/BESC-Spindle-Feature
#define CPU_MAP_NAME "CPU_MAP_ESP32_ESC_SPINDLE"
#define SHOW_EXTENDED_SETTINGS
#define USE_RMT_STEPS
#define X_STEP_PIN GPIO_NUM_12
#define X_DIRECTION_PIN GPIO_NUM_14
#define X_RMT_CHANNEL 0
#define X_DIRECTION_PIN GPIO_NUM_14
#define Y_STEP_PIN GPIO_NUM_26
#define Y_DIRECTION_PIN GPIO_NUM_15// #define Y_STEP_PIN (see versions above)
#define Y_RMT_CHANNEL 1
#define Y_DIRECTION_PIN GPIO_NUM_15// #define Y_STEP_PIN (see versions above)
#define Z_STEP_PIN GPIO_NUM_27
#define Z_DIRECTION_PIN GPIO_NUM_33
#define Z_RMT_CHANNEL 2
#define Z_DIRECTION_PIN GPIO_NUM_33
// OK to comment out to use pin for other features
#define STEPPERS_DISABLE_PIN GPIO_NUM_13
@@ -209,9 +200,12 @@
// Begin RC ESC Based Spindle Information ======================
#define SPINDLE_PWM_BIT_PRECISION 16 // 16 bit recommended for ESC (don't change)
/*
Important ESC Settings
$33=50 // Hz this is the typical good frequency for an ESC
#define DEFAULT_SPINDLE_FREQ 5000.0 // $33 Hz (extended set)
Determine the typical min and max pulse length of your ESC
min_pulse is typically 1ms (0.001 sec) or less
@@ -223,10 +217,16 @@
(pulse / PWM_period)
min_pulse = (0.001 / 0.02) = 0.035 = 3.5% so ... $33 and $34 = 3.5
min_pulse = (0.001 / 0.02) = 0.05 = 5% so ... $34 and $35 = 5.0
max_pulse = (0.002 / .02) = 0.1 = 10% so ... $36=10
*/
#define DEFAULT_SPINDLE_FREQ 50.0
#define DEFAULT_SPINDLE_OFF_VALUE 5.0
#define DEFAULT_SPINDLE_MIN_VALUE 5.0
#define DEFAULT_SPINDLE_MAX_VALUE 10.0
// End RC ESC Based Spindle #defines ===========================
@@ -260,13 +260,10 @@
#define PEN_LASER_V2
#define X_STEP_PIN GPIO_NUM_12
#define X_DIRECTION_PIN GPIO_NUM_26
#define X_RMT_CHANNEL 0
#define X_DIRECTION_PIN GPIO_NUM_26
#define Y_STEP_PIN GPIO_NUM_14
#define Y_DIRECTION_PIN GPIO_NUM_25
#define Y_RMT_CHANNEL 1
#define Y_DIRECTION_PIN GPIO_NUM_25
#define STEPPERS_DISABLE_PIN GPIO_NUM_13
@@ -362,11 +359,9 @@
#define X_STEP_PIN GPIO_NUM_12
#define Y_STEP_PIN GPIO_NUM_14
#define X_RMT_CHANNEL 0
#define X_DIRECTION_PIN GPIO_NUM_26
#define Y_DIRECTION_PIN GPIO_NUM_25
#define Y_RMT_CHANNEL 1
#ifndef COREXY // maybe set in config.h
#define COREXY
@@ -827,7 +822,6 @@
#define X_DRIVER_TMC2130 // Which Driver Type?
#define X_CS_PIN GPIO_NUM_17 //chip select
#define X_RSENSE 0.11f // .11 Ohm
#define X_RMT_CHANNEL 0
#define Y_STEP_PIN GPIO_NUM_14
#define Y_DIRECTION_PIN GPIO_NUM_25
@@ -835,7 +829,6 @@
#define Y_DRIVER_TMC2130 // Which Driver Type?
#define Y_CS_PIN GPIO_NUM_16 //chip select
#define Y_RSENSE 0.11f // .11 Ohm
#define Y_RMT_CHANNEL 1
// OK to comment out to use pin for other features
#define STEPPERS_DISABLE_PIN GPIO_NUM_13
@@ -844,6 +837,7 @@
#define USE_SERVO_AXES
#endif
#define SERVO_Z_PIN GPIO_NUM_27
#define SERVO_Z_CHANNEL_NUM 5
#define SERVO_Z_RANGE_MIN 0.0
@@ -852,17 +846,13 @@
#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
// *** the flood coolant feature code is activated by defining this pins
// *** Comment it out to use the pin for other features
//#define COOLANT_FLOOD_PIN GPIO_NUM_16
//#define COOLANT_MIST_PIN GPIO_NUM_21
// 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
// Comment out servo pin and uncomment spindle pwm pin to use the servo PWM to control a spindle
/*
#define SPINDLE_PWM_PIN GPIO_NUM_27
#define SPINDLE_PWM_CHANNEL 0
#define SPINDLE_PWM_BIT_PRECISION 8 // be sure to match this with SPINDLE_PWM_MAX_VALUE
*/
// #define X_LIMIT_PIN See version section
#define Y_LIMIT_PIN GPIO_NUM_4
@@ -884,21 +874,17 @@
#define X_STEP_PIN GPIO_NUM_12
#define X_DIRECTION_PIN GPIO_NUM_26
#define X_RMT_CHANNEL 0
#define Y_STEP_PIN GPIO_NUM_14
#define Y_DIRECTION_PIN GPIO_NUM_25
#define Y_RMT_CHANNEL 1
// Z is a servo
#define A_STEP_PIN GPIO_NUM_27
#define A_DIRECTION_PIN GPIO_NUM_33
#define A_RMT_CHANNEL 2
#define B_STEP_PIN GPIO_NUM_15
#define B_DIRECTION_PIN GPIO_NUM_32
#define B_RMT_CHANNEL 3
// C is a servo
@@ -1035,7 +1021,6 @@
#define X_DRIVER_TMC2130 // Which Driver Type?
#define X_CS_PIN GPIO_NUM_17 // Daisy Chain, all share same CS pin
#define X_RSENSE 0.11f // .11 Ohm
#define X_RMT_CHANNEL 0
#define Y_STEP_PIN GPIO_NUM_27
#define Y_DIRECTION_PIN GPIO_NUM_26
@@ -1043,7 +1028,6 @@
#define Y_DRIVER_TMC2130 // Which Driver Type?
#define Y_CS_PIN X_CS_PIN // Daisy Chain, all share same CS pin
#define Y_RSENSE 0.11f // .11 Ohm
#define Y_RMT_CHANNEL 1
#define Z_STEP_PIN GPIO_NUM_15
#define Z_DIRECTION_PIN GPIO_NUM_2
@@ -1051,7 +1035,6 @@
#define Z_DRIVER_TMC2130 // Which Driver Type?
#define Z_CS_PIN X_CS_PIN // Daisy Chain, all share same CS pin
#define Z_RSENSE 0.11f // .11 Ohm
#define Z_RMT_CHANNEL 2
#define A_STEP_PIN GPIO_NUM_33
#define A_DIRECTION_PIN GPIO_NUM_32
@@ -1059,7 +1042,6 @@
#define A_DRIVER_TMC2130 // Which Driver Type?
#define A_CS_PIN X_CS_PIN // Daisy Chain, all share same CS pin
#define A_RSENSE 0.11f // .11 Ohm
#define A_RMT_CHANNEL 3
#define STEPPERS_DISABLE_PIN GPIO_NUM_13

View File

@@ -20,7 +20,7 @@
// Grbl versioning system
#define GRBL_VERSION "1.1f"
#define GRBL_VERSION_BUILD "20200110"
#define GRBL_VERSION_BUILD "20200115"
//#include <sdkconfig.h>
#include <Arduino.h>

View File

@@ -134,12 +134,16 @@
void Trinamic_Init()
{
uint8_t testResult;
grbl_sendf(CLIENT_SERIAL, "[MSG:TMCStepper Init using Library Ver 0x%06x]\r\n", TMCSTEPPER_VERSION);
SPI.begin();
#ifdef X_TRINAMIC
TRINAMIC_X.begin(); // Initiate pins and registries
testResult = TRINAMIC_X.test_connection();
trinamic_test_response(testResult, "X");
TRINAMIC_X.toff(5);
TRINAMIC_X.microsteps(settings.microsteps[X_AXIS]);
TRINAMIC_X.rms_current(settings.current[X_AXIS] * 1000.0, settings.hold_current[X_AXIS]/100.0);
@@ -149,6 +153,8 @@ void Trinamic_Init()
#ifdef Y_TRINAMIC
TRINAMIC_Y.begin(); // Initiate pins and registries
testResult = TRINAMIC_Y.test_connection();
trinamic_test_response(testResult, "Y");
TRINAMIC_Y.toff(5);
TRINAMIC_Y.microsteps(settings.microsteps[Y_AXIS]);
TRINAMIC_Y.rms_current(settings.current[Y_AXIS] * 1000.0, settings.hold_current[Y_AXIS]/100.0);
@@ -158,6 +164,8 @@ void Trinamic_Init()
#ifdef Z_TRINAMIC
TRINAMIC_Z.begin(); // Initiate pins and registries
testResult = TRINAMIC_Z.test_connection();
trinamic_test_response(testResult, "Z");
TRINAMIC_Z.toff(5);
TRINAMIC_Z.microsteps(settings.microsteps[Z_AXIS]);
TRINAMIC_Z.rms_current(settings.current[Z_AXIS] * 1000.0, settings.hold_current[Z_AXIS]/100.0);
@@ -167,6 +175,8 @@ void Trinamic_Init()
#ifdef A_TRINAMIC
TRINAMIC_A.begin(); // Initiate pins and registries
testResult = TRINAMIC_A.test_connection();
trinamic_test_response(testResult, "A");
TRINAMIC_A.toff(5);
TRINAMIC_A.microsteps(settings.microsteps[A_AXIS]);
TRINAMIC_A.rms_current(settings.current[A_AXIS] * 1000.0, settings.hold_current[A_AXIS]/100.0);
@@ -176,6 +186,8 @@ void Trinamic_Init()
#ifdef B_TRINAMIC
TRINAMIC_B.begin(); // Initiate pins and registries
testResult = TRINAMIC_B.test_connection();
trinamic_test_response(testResult, "B");
TRINAMIC_B.toff(5);
TRINAMIC_B.microsteps(settings.microsteps[B_AXIS]);
TRINAMIC_B.rms_current(settings.current[B_AXIS] * 1000.0, settings.hold_current[B_AXIS]/100.0);
@@ -185,6 +197,8 @@ void Trinamic_Init()
#ifdef C_TRINAMIC
TRINAMIC_C.begin(); // Initiate pins and registries
testResult = TRINAMIC_C.test_connection();
trinamic_test_response(testResult, "C");
TRINAMIC_C.toff(5);
TRINAMIC_C.microsteps(settings.microsteps[C_AXIS]);
TRINAMIC_C.rms_current(settings.current[C_AXIS] * 1000.0, settings.hold_current[C_AXIS]/100.0);
@@ -228,4 +242,19 @@ void trinamic_change_settings()
#endif
}
void trinamic_test_response(uint8_t result, const char *axis)
{
grbl_sendf(CLIENT_SERIAL, "[MSG:%s Trinamic driver test ", axis);
if (result) {
grbl_sendf(CLIENT_SERIAL, "failed.");
switch(result) {
case 1: grbl_sendf(CLIENT_SERIAL, " Check connection]\r\n"); break;
case 2: grbl_sendf(CLIENT_SERIAL, " Check motor power]\r\n"); break;
}
}
else {
grbl_sendf(CLIENT_SERIAL, "passed]\r\n");
}
}
#endif

View File

@@ -27,6 +27,7 @@
#include <TMCStepper.h> // https://github.com/teemuatlut/TMCStepper
void Trinamic_Init();
void trinamic_change_settings();
void trinamic_test_response(uint8_t result, const char *axis);
#endif
#endif

View File

@@ -33,9 +33,7 @@
#define USE_RMT_STEPS
#define X_STEP_PIN GPIO_NUM_15
#define X_RMT_CHANNEL 0
#define Y_STEP_PIN GPIO_NUM_2
#define Y_RMT_CHANNEL 1
#define X_DIRECTION_PIN GPIO_NUM_25
#define Y_DIRECTION_PIN GPIO_NUM_26

View File

@@ -275,16 +275,23 @@ void report_init_message(uint8_t client)
// Grbl help message
void report_grbl_help(uint8_t client) {
grbl_send(client,"[HLP:$$ $# $G $I $N $x=val $Nx=line $J=line $SLP $C $X $H $F ~ ! ? ctrl-x]\r\n");
grbl_send(client,"[HLP:$$ $+ $# $G $I $N $x=val $Nx=line $J=line $SLP $C $X $H $F ~ ! ? ctrl-x]\r\n");
}
// Grbl global settings print out.
// NOTE: The numbering scheme here must correlate to storing in settings.c
void report_grbl_settings(uint8_t client) {
// Extended setting will be displayed if force_extended is true or #ifdef SHOW_EXTENDED_SETTINGS
void report_grbl_settings(uint8_t client, uint8_t show_extended) {
// Print Grbl settings.
char setting[20];
char rpt[1000];
char rpt[1000];
#ifdef SHOW_EXTENDED_SETTINGS
show_extended = true;
#endif
grbl_sendf(CLIENT_SERIAL, "[MSG:Extended %d]\r\n", show_extended);
rpt[0] = '\0';
@@ -322,7 +329,7 @@ void report_grbl_settings(uint8_t client) {
strcat(rpt, "$32=0\r\n");
#endif
#ifdef SHOW_EXTENDED_SETTINGS
if (show_extended) {
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, "$35=%3.3f\r\n", settings.spindle_pwm_min_value); strcat(rpt, setting);
@@ -334,9 +341,8 @@ void report_grbl_settings(uint8_t client) {
for (uint8_t index = 0; index<USER_SETTING_COUNT; index++) {
sprintf(setting, "$%d=%5.3f\r\n", 90 + index, settings.machine_float[index]); strcat(rpt, setting);
}
#endif
}
}
// Print axis settings
uint8_t idx, set_idx;
@@ -348,12 +354,12 @@ void report_grbl_settings(uint8_t client) {
case 1: sprintf(setting, "$%d=%4.3f\r\n", val+idx, settings.max_rate[idx]); strcat(rpt, setting); break;
case 2: sprintf(setting, "$%d=%4.3f\r\n", val+idx, settings.acceleration[idx]/(60*60)); strcat(rpt, setting); break;
case 3: sprintf(setting, "$%d=%4.3f\r\n", val+idx, -settings.max_travel[idx]); strcat(rpt, setting); break;
#ifdef SHOW_EXTENDED_SETTINGS
case 4: sprintf(setting, "$%d=%4.3f\r\n", val+idx, settings.current[idx]); strcat(rpt, setting); break;
case 5: sprintf(setting, "$%d=%4.3f\r\n", val+idx, settings.hold_current[idx]); strcat(rpt, setting); break;
case 6: sprintf(setting, "$%d=%d\r\n", val+idx, settings.microsteps[idx]); strcat(rpt, setting); break;
case 7: sprintf(setting, "$%d=%d\r\n", val+idx, settings.stallguard[idx]); strcat(rpt, setting); break;
#endif
case 4: if (show_extended) {sprintf(setting, "$%d=%4.3f\r\n", val+idx, settings.current[idx]); strcat(rpt, setting);} break;
case 5: if (show_extended) {sprintf(setting, "$%d=%4.3f\r\n", val+idx, settings.hold_current[idx]); strcat(rpt, setting);} break;
case 6: if (show_extended) {sprintf(setting, "$%d=%d\r\n", val+idx, settings.microsteps[idx]); strcat(rpt, setting);} break;
case 7: if (show_extended) {sprintf(setting, "$%d=%d\r\n", val+idx, settings.stallguard[idx]); strcat(rpt, setting);} break;
}
}
val += AXIS_SETTINGS_INCREMENT;

View File

@@ -132,7 +132,7 @@ void report_init_message(uint8_t client);
void report_grbl_help(uint8_t client);
// Prints Grbl global settings
void report_grbl_settings(uint8_t client);
void report_grbl_settings(uint8_t client, uint8_t show_extended);
// Prints an echo of the pre-parsed line received right before execution.
void report_echo_line_received(char *line, uint8_t client);

View File

@@ -43,7 +43,7 @@ void settings_init()
if(!read_global_settings()) {
report_status_message(STATUS_SETTING_READ_FAIL, CLIENT_SERIAL);
settings_restore(SETTINGS_RESTORE_ALL); // Force restore all EEPROM data.
report_grbl_settings(CLIENT_SERIAL); // only the serial could be working at this point
report_grbl_settings(CLIENT_SERIAL, false); // only the serial could be working at this point
}
}

View File

@@ -75,11 +75,8 @@
// #define SETTING_INDEX_G92 N_COORDINATE_SYSTEM+2 // Coordinate offset (G92.2,G92.3 not supported)
// Define Grbl axis settings numbering scheme. Starts at START_VAL, every INCREMENT, over N_SETTINGS.
#ifndef SHOW_EXTENDED_SETTINGS
#define AXIS_N_SETTINGS 4
#else
#define AXIS_N_SETTINGS 8
#endif
#define AXIS_N_SETTINGS 8 // includes extended settings
#define AXIS_SETTINGS_START_VAL 100 // NOTE: Reserving settings values >= 100 for axis settings. Up to 255.
#define AXIS_SETTINGS_INCREMENT 10 // Must be greater than the number of axis settings

View File

@@ -22,17 +22,17 @@
#ifdef SPINDLE_PWM_PIN
static float pwm_gradient; // Precalulated value to speed up rpm to PWM conversions.
float spindle_pwm_period;
float spindle_pwm_off_value;
float spindle_pwm_min_value;
float spindle_pwm_max_value;
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
grbl_sendf(CLIENT_SERIAL, "[MSG:Spindle init on pin %d]\r\n", SPINDLE_PWM_PIN);
#ifdef INVERT_SPINDLE_PWM
grbl_send(CLIENT_SERIAL, "[MSG: INVERT_SPINDLE_PWM]\r\n");
#endif
@@ -41,27 +41,21 @@ void spindle_init()
grbl_send(CLIENT_SERIAL, "[MSG: INVERT_SPINDLE_ENABLE_PIN]\r\n");
#endif
spindle_pwm_period = SPINDLE_PULSE_RES_COUNT;
spindle_pwm_off_value = (spindle_pwm_period * settings.spindle_pwm_off_value / 100);
spindle_pwm_min_value = (spindle_pwm_period * settings.spindle_pwm_min_value / 100);
spindle_pwm_max_value = (spindle_pwm_period * settings.spindle_pwm_max_value / 100);
//pwm_gradient = (settings.spindle_pwm_max_value - settings.spindle_pwm_min_value)/(settings.rpm_max-settings.rpm_min);
pwm_gradient = (spindle_pwm_max_value-spindle_pwm_min_value)/(settings.rpm_max-settings.rpm_min);
if ( (F_TIMERS / (uint32_t)settings.spindle_pwm_freq) < spindle_pwm_max_value) {
/*
PWM Generator is based on 80,000,000 Hz counter
Therefor the freq determines the resolution 80,000,000 / freq = max resolution
For 5000 that is 80,000,000 / 5000 = 16000
Round down to nearest bit count for SPINDLE_PWM_MAX_VALUE = 13bits (8192)
*/
grbl_sendf(CLIENT_SERIAL, "[MSG: Warning! Spindle freq %5.0f too high for requested PWM max %5.2f%% (%5.0f)]\r\n", settings.spindle_pwm_freq, settings.spindle_pwm_max_value, spindle_pwm_max_value);
// 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_sendf(CLIENT_SERIAL, "[MSG: Warning spindle min pwm is greater than max. Check $35 and $36]\r\n", pwm_gradient);
}
// 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);
@@ -73,15 +67,15 @@ void spindle_init()
// use the LED control feature to setup PWM https://docs.espressif.com/projects/esp-idf/en/latest/api-reference/peripherals/ledc.html
ledcSetup(SPINDLE_PWM_CHANNEL, (double)settings.spindle_pwm_freq, SPINDLE_PWM_BIT_PRECISION); // setup the channel
ledcAttachPin(SPINDLE_PWM_PIN, SPINDLE_PWM_CHANNEL); // attach the PWM to the pin
ledcAttachPin(SPINDLE_PWM_PIN, SPINDLE_PWM_CHANNEL); // attach the PWM to the pin
// Start with spindle off off
spindle_stop();
spindle_stop();
#endif
}
void spindle_stop()
{
{
spindle_set_enable(false);
#ifdef SPINDLE_PWM_PIN
@@ -119,6 +113,7 @@ uint8_t spindle_get_state() // returns SPINDLE_STATE_DISABLE, SPINDLE_STATE_CW
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
@@ -160,7 +155,7 @@ uint32_t spindle_compute_pwm_value(float rpm){
#ifdef ENABLE_PIECEWISE_LINEAR_SPINDLE
pwm_value = piecewise_linear_fit(rpm);
#else
pwm_value = floor((rpm - settings.rpm_min)*pwm_gradient) + settings.spindle_pwm_min_value;
pwm_value = floor((rpm - settings.rpm_min)*pwm_gradient) + spindle_pwm_min_value;
#endif
}
return(pwm_value);
@@ -211,9 +206,7 @@ void spindle_sync(uint8_t state, float rpm)
void grbl_analogWrite(uint8_t chan, uint32_t duty)
{
if (ledcRead(chan) != duty) // reduce unnecessary calls to ledcWrite()
{
// Useful for debug, but too many messages in laser mode
// grbl_sendf(CLIENT_SERIAL, "[MSG: grbl_analogWrite %d]\r\n", duty);
{
ledcWrite(chan, duty);
}
}

View File

@@ -31,7 +31,7 @@
#define SPINDLE_STATE_CW bit(0)
#define SPINDLE_STATE_CCW bit(1)
#define SPINDLE_PULSE_RES_COUNT ((1<<SPINDLE_PWM_BIT_PRECISION) -1) //(don't change)
extern uint32_t spindle_pwm_off_value;
void spindle_init();
void spindle_stop();

View File

@@ -294,7 +294,7 @@ void IRAM_ATTR onStepperDriverTimer(void *para) // ISR It is time to take a ste
if (!(sys.state & STATE_JOG)) { // added to prevent ... jog after probing crash
// Ensure pwm is set properly upon completion of rate-controlled motion.
if (st.exec_block->is_pwm_rate_adjusted) {
spindle_set_speed(settings.spindle_pwm_off_value);
spindle_set_speed(spindle_pwm_off_value);
}
}
@@ -1325,7 +1325,7 @@ void st_prep_buffer()
} else {
sys.spindle_speed = 0.0;
#if ( (defined VARIABLE_SPINDLE) && (defined SPINDLE_PWM_PIN) )
prep.current_spindle_pwm = settings.spindle_pwm_off_value;
prep.current_spindle_pwm = spindle_pwm_off_value ;
#endif
}

View File

@@ -47,6 +47,14 @@
#define PREP_FLAG_PARKING bit(2)
#define PREP_FLAG_DECEL_OVERRIDE bit(3)
// which RMT channels to use with the axes
#define X_RMT_CHANNEL 0
#define Y_RMT_CHANNEL 1
#define Z_RMT_CHANNEL 2
#define A_RMT_CHANNEL 3
#define B_RMT_CHANNEL 4
#define C_RMT_CHANNEL 5
// Define Adaptive Multi-Axis Step-Smoothing(AMASS) levels and cutoff frequencies. The highest level
// frequency bin starts at 0Hz and ends at its cutoff frequency. The next lower level frequency bin
// starts at the next higher cutoff frequency, and so on. The cutoff frequencies for each level must

View File

@@ -183,13 +183,18 @@ uint8_t system_execute_line(char *line, uint8_t client)
if(line[2] != '=') { return(STATUS_INVALID_STATEMENT); }
return(gc_execute_line(line, client)); // NOTE: $J= is ignored inside g-code parser and used to detect jog motions.
break;
case '$': case 'G': case 'C': case 'X':
case '$': case 'G': case 'C': case 'X': case '+':
if ( line[2] != 0 ) { return(STATUS_INVALID_STATEMENT); }
switch( line[1] ) {
case '$' : // Prints Grbl settings
case '$': case '+' : // Prints Grbl settings
if ( sys.state & (STATE_CYCLE | STATE_HOLD) ) { return(STATUS_IDLE_ERROR); } // Block during cycle. Takes too long to print.
else { report_grbl_settings(client); }
break;
else {
if (line[1] == '$')
report_grbl_settings(client, false); // entended settings depend on SHOW_EXTENDED_SETTINGS
else
report_grbl_settings(client, true); // force display of extended settings
}
break;
case 'G' : // Prints gcode parser state
// TODO: Move this to realtime commands for GUIs to request this data during suspend-state.
report_gcode_modes(client);

View File

@@ -21,10 +21,10 @@
"30","Maximum spindle speed","RPM","Maximum spindle speed. Sets PWM to 100% duty cycle."
"31","Minimum spindle speed","RPM","Minimum spindle speed. Sets PWM to 0.4% or lowest duty cycle."
"32","Laser-mode enable","boolean","Enables laser mode. Consecutive G1/2/3 commands will not halt when spindle speed is changed."
"33","Spindle PWM Freq","16-bit","Spindle PWM Freq"
"34","Spindle PWM Off Value","16-bit","Spindle PWM Off Value"
"35","Spindle PWM Min Value","16-bit","Spindle PWM Min Value"
"36","Spindle PWM Max Value","16-bit","Spindle PWM Max Value"
"33","Spindle PWM Freq","16-bit","Spindle PWM Freq (reboot to take effect)"
"34","Spindle PWM Off Value","16-bit","Spindle PWM Off Value (reboot to take effect)"
"35","Spindle PWM Min Value","16-bit","Spindle PWM Min Value (reboot to take effect)"
"36","Spindle PWM Max Value","16-bit","Spindle PWM Max Value (reboot to take effect)"
"80-84","User integer Values","unsigned 16-bit","Reserved for custom machine use"
"90-94","User Floating point value","float","Reserved for custom machine use"
"100","X-axis travel resolution","step/mm","X-axis travel resolution in steps per millimeter."
1 $-Code Setting Units Setting Description
21 30 Maximum spindle speed RPM Maximum spindle speed. Sets PWM to 100% duty cycle.
22 31 Minimum spindle speed RPM Minimum spindle speed. Sets PWM to 0.4% or lowest duty cycle.
23 32 Laser-mode enable boolean Enables laser mode. Consecutive G1/2/3 commands will not halt when spindle speed is changed.
24 33 Spindle PWM Freq 16-bit Spindle PWM Freq Spindle PWM Freq (reboot to take effect)
25 34 Spindle PWM Off Value 16-bit Spindle PWM Off Value Spindle PWM Off Value (reboot to take effect)
26 35 Spindle PWM Min Value 16-bit Spindle PWM Min Value Spindle PWM Min Value (reboot to take effect)
27 36 Spindle PWM Max Value 16-bit Spindle PWM Max Value Spindle PWM Max Value (reboot to take effect)
28 80-84 User integer Values unsigned 16-bit Reserved for custom machine use
29 90-94 User Floating point value float Reserved for custom machine use
30 100 X-axis travel resolution step/mm X-axis travel resolution in steps per millimeter.