1
0
mirror of https://github.com/bdring/Grbl_Esp32.git synced 2025-09-02 02:42:36 +02:00

Added some settings to test dymanic switcing of spindles

This commit is contained in:
bdring
2020-04-10 13:58:46 -05:00
parent 129e988562
commit 35e9b4797f
13 changed files with 73 additions and 29 deletions

View File

@@ -117,8 +117,7 @@ void loop() {
// Reset Grbl primary systems.
serial_reset_read_buffer(CLIENT_ALL); // Clear serial read buffer
gc_init(); // Set g-code parser to default state
// my_spindle.init();
spindle_select(SPINDLE_TYPE_PWM);
spindle_select(settings.spindle_type);
coolant_init();
limits_init();
probe_init();

View File

@@ -51,3 +51,5 @@
#define CONTROL_RESET_PIN GPIO_NUM_34 // labeled Reset, needs external pullup
#define CONTROL_FEED_HOLD_PIN GPIO_NUM_36 // labeled Hold, needs external pullup
#define CONTROL_CYCLE_START_PIN GPIO_NUM_39 // labeled Start, needs external pullup
#define DEFAULT_SPINDLE_TYPE SPINDLE_TYPE_PWM

View File

@@ -35,7 +35,7 @@
#define SHOW_EXTENDED_SETTINGS
#define SPINDLE_PWM_BIT_PRECISION 16 // 16 bit recommended for ESC (don't change)
#define DEFAULT_SPINDLE_PWM_BIT_PRECISION 16 // 16 bit recommended for ESC (don't change)
/*
Important ESC Settings

View File

@@ -114,7 +114,18 @@
#define DEFAULT_HOMING_PULLOFF 1.0 // $27 mm
#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
#define DEFAULT_SPINDLE_FREQ 5000.0 // $33 Hz (extended set)
@@ -132,20 +143,15 @@
#define DEFAULT_SPINDLE_MAX_VALUE 100.0 // $36 Percent (extended set)
#endif
#ifndef DEFAULT_SPINDLE_RPM_MAX
#define DEFAULT_SPINDLE_RPM_MAX 1000.0 // rpm
#ifndef DEFAULT_SPINDLE_PWM_BIT_PRECISION // $37
#define DEFAULT_SPINDLE_PWM_BIT_PRECISION 8
#endif
#ifndef DEFAULT_SPINDLE_RPM_MIN
#define DEFAULT_SPINDLE_RPM_MIN 0.0 // rpm
#ifndef DEFAULT_SPINDLE_TYPE // $38
#define DEFAULT_SPINDLE_TYPE SPINDLE_TYPE_PWM
#endif
#ifndef DEFAULT_LASER_MODE
#define DEFAULT_LASER_MODE 0 // false
#endif
// user settings
// ================ user settings =====================
#ifndef DEFAULT_USER_INT_80
#define DEFAULT_USER_INT_80 0 // $80 User integer setting
#endif

View File

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

View File

@@ -318,6 +318,8 @@ void report_grbl_settings(uint8_t client, uint8_t show_extended) {
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);
sprintf(setting, "$36=%3.3f\r\n", settings.spindle_pwm_max_value); strcat(rpt, setting);
sprintf(setting, "$37=%d\r\n", settings.spindle_pwm_precision_bits); strcat(rpt, setting);
sprintf(setting, "$38=%d\r\n", settings.spindle_type); strcat(rpt, setting);
for (uint8_t index = 0; index < USER_SETTING_COUNT; index++) {
sprintf(setting, "$%d=%d\r\n", 80 + index, settings.machine_int16[index]); strcat(rpt, setting);
}

View File

@@ -64,12 +64,16 @@ void settings_restore(uint8_t restore_flag) {
settings.status_report_mask = DEFAULT_STATUS_REPORT_MASK;
settings.junction_deviation = DEFAULT_JUNCTION_DEVIATION;
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_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_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.spindle_pwm_precision_bits = MIN(8, DEFAULT_SPINDLE_PWM_BIT_PRECISION); // $37
settings.spindle_type= DEFAULT_SPINDLE_TYPE; // $38
settings.homing_dir_mask = DEFAULT_HOMING_DIR_MASK;
settings.homing_feed_rate = DEFAULT_HOMING_FEED_RATE;
settings.homing_seek_rate = DEFAULT_HOMING_SEEK_RATE;
@@ -375,10 +379,12 @@ uint8_t settings_store_global_setting(uint8_t parameter, float value) {
settings.flags &= ~BITFLAG_LASER_MODE;
my_spindle->init(); // update the spindle class
break;
case 33: settings.spindle_pwm_freq = value; my_spindle->init(); break; // Re-initialize spindle pwm calibration
case 34: settings.spindle_pwm_off_value = value; my_spindle->init(); break; // Re-initialize spindle pwm calibration
case 35: settings.spindle_pwm_min_value = value; my_spindle->init(); break; // Re-initialize spindle pwm calibration
case 36: settings.spindle_pwm_max_value = value; my_spindle->init(); break; // Re-initialize spindle pwm calibration
case 33: settings.spindle_pwm_freq = value; spindle_select(settings.spindle_type); break; // Re-initialize spindle pwm calibration
case 34: settings.spindle_pwm_off_value = value; spindle_select(settings.spindle_type); break; // Re-initialize spindle pwm calibration
case 35: settings.spindle_pwm_min_value = value; spindle_select(settings.spindle_type); break; // Re-initialize spindle pwm calibration
case 36: settings.spindle_pwm_max_value = value; spindle_select(settings.spindle_type); break; // Re-initialize spindle pwm calibration
case 37: settings.spindle_pwm_precision_bits = MIN(8, value);spindle_select(settings.spindle_type); break;
case 38: settings.spindle_type = value; spindle_select(settings.spindle_type); break;
case 80:
case 81:
case 82:

View File

@@ -107,6 +107,8 @@ typedef struct {
float spindle_pwm_off_value; // $34 Percent (extended set)
float spindle_pwm_min_value; // $35 Percent (extended set)
float spindle_pwm_max_value; // $36 Percent (extended set)
uint8_t spindle_pwm_precision_bits; // $37 PWM pwm precision in bits (extended set)
uint8_t spindle_type; // $38 The spindle class to be used (extended set)
float rpm_max;
float rpm_min;

View File

@@ -37,6 +37,6 @@ void Laser :: config_message() {
"Laser spindle on GPIO:%d, Freq:%.2fHz, Res:%dbits Laser mode:$32=%d",
_output_pin,
_pwm_freq,
SPINDLE_PWM_BIT_PRECISION,
settings.spindle_pwm_precision_bits,
isRateAdjusted()); // the current mode
}

View File

@@ -32,13 +32,13 @@ void PWMSpindle::init() {
}
_pwm_freq = settings.spindle_pwm_freq;
_pwm_period = ((1 << SPINDLE_PWM_BIT_PRECISION) - 1);
_pwm_period = ((1 << settings.spindle_pwm_precision_bits) - 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");
if ((F_TIMERS / _pwm_freq) < _pwm_period)
grbl_msg_sendf(CLIENT_SERIAL, MSG_LEVEL_INFO, "Warning spindle PWM precision (%d bits) too high for frequency (%.2f Hz)", SPINDLE_PWM_BIT_PRECISION, _pwm_freq);
grbl_msg_sendf(CLIENT_SERIAL, MSG_LEVEL_INFO, "Warning spindle PWM precision (%d bits) too high for frequency (%.2f Hz)", settings.spindle_pwm_precision_bits, _pwm_freq);
// pre-caculate some PWM count values
_pwm_off_value = (_pwm_period * settings.spindle_pwm_off_value / 100.0);
@@ -56,7 +56,7 @@ void PWMSpindle::init() {
_pwm_gradient = (_pwm_max_value - _pwm_min_value) / (_max_rpm - _min_rpm);
_spindle_pwm_chan_num = sys_get_next_PWM_chan_num();
ledcSetup(_spindle_pwm_chan_num, (double)_pwm_freq, SPINDLE_PWM_BIT_PRECISION); // setup the channel
ledcSetup(_spindle_pwm_chan_num, (double)_pwm_freq, settings.spindle_pwm_precision_bits); // setup the channel
ledcAttachPin(_output_pin, _spindle_pwm_chan_num); // attach the PWM to the pin
if (_enable_pin != UNDEFINED_PIN)
@@ -99,10 +99,13 @@ float PWMSpindle::set_rpm(float rpm) {
if (_output_pin == UNDEFINED_PIN)
return rpm;
grbl_msg_sendf(CLIENT_SERIAL, MSG_LEVEL_INFO, "Spindle RPM:%5.2f Min:%5.2f Max:%5.2f", rpm, _min_rpm, _max_rpm);
uint32_t pwm_value;
// apply overrides and limits
rpm *= (0.010 * sys.spindle_speed_ovr); // Scale by spindle speed override value (percent)
grbl_msg_sendf(CLIENT_SERIAL, MSG_LEVEL_INFO, "Spindle RPM 1:%5.2f", rpm);
// Calculate PWM register value based on rpm max/min settings and programmed rpm.
if ((_min_rpm >= _max_rpm) || (rpm >= _max_rpm)) {
@@ -115,6 +118,7 @@ float PWMSpindle::set_rpm(float rpm) {
pwm_value = _pwm_off_value;
} else { // Set minimum PWM output
rpm = _min_rpm;
grbl_msg_sendf(CLIENT_SERIAL, MSG_LEVEL_INFO, "Spindle RPM 2:%5.2f", rpm);
sys.spindle_speed = rpm;
pwm_value = _pwm_min_value;
grbl_msg_sendf(CLIENT_SERIAL, MSG_LEVEL_INFO, "Spindle RPM less than min RPM:%5.2f %d", rpm, pwm_value);
@@ -123,6 +127,7 @@ float PWMSpindle::set_rpm(float rpm) {
// 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;
grbl_msg_sendf(CLIENT_SERIAL, MSG_LEVEL_INFO, "Spindle RPM 3:%5.2f", rpm);
#ifdef ENABLE_PIECEWISE_LINEAR_SPINDLE
pwm_value = piecewise_linear_fit(rpm);
#else
@@ -134,6 +139,7 @@ float PWMSpindle::set_rpm(float rpm) {
set_enable_pin(rpm != 0);
#endif
grbl_msg_sendf(CLIENT_SERIAL, MSG_LEVEL_INFO, "Spindle RPM Final:%5.2f", rpm);
set_pwm(pwm_value);
return rpm;
@@ -179,7 +185,7 @@ void PWMSpindle::stop() {
// prints the startup message of the spindle config
void PWMSpindle :: config_message() {
grbl_msg_sendf(CLIENT_SERIAL, MSG_LEVEL_INFO, "PWM spindle on GPIO %d, freq %.2fHz, Res %d bits", _output_pin, _pwm_freq, SPINDLE_PWM_BIT_PRECISION);
grbl_msg_sendf(CLIENT_SERIAL, MSG_LEVEL_INFO, "PWM spindle on GPIO %d, freq %.2fHz, Res %d bits", _output_pin, _pwm_freq, settings.spindle_pwm_precision_bits);
}
@@ -194,7 +200,7 @@ void PWMSpindle::set_pwm(uint32_t duty) {
_current_pwm_duty = duty;
#ifdef INVERT_SPINDLE_PWM
duty = (1 << SPINDLE_PWM_BIT_PRECISION) - duty;
duty = (1 << settings.spindle_pwm_precision_bits) - duty;
#endif
ledcWrite(_spindle_pwm_chan_num, duty);
}

View File

@@ -17,7 +17,7 @@
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"
#include "SpindleClass.h"
@@ -47,9 +47,27 @@ void RelaySpindle :: config_message() {
grbl_msg_sendf(CLIENT_SERIAL, MSG_LEVEL_INFO, "Relay spindle on GPIO %d", _output_pin);
}
float RelaySpindle::set_rpm(float rpm) {
if (_output_pin == UNDEFINED_PIN)
return rpm;
sys.spindle_speed = rpm;
if (rpm == 0) {
sys.spindle_speed = 0.0;
set_pwm(0);
} else {
sys.spindle_speed = rpm;
set_pwm(1);
}
return rpm;
}
void RelaySpindle::set_pwm(uint32_t duty) {
#ifdef INVERT_SPINDLE_PWM
duty = (duty == 0); // flip duty
#endif
grbl_msg_sendf(CLIENT_SERIAL, MSG_LEVEL_INFO, "Relay output %d", duty > 0);
digitalWrite(_output_pin, duty > 0); // anything greater
}

View File

@@ -26,8 +26,7 @@
TODO
Consider breaking into one file per class.
Get rid of dependance on machine definition #defines
SPINDLE_PWM_BIT_PRECISION
Get rid of dependance on machine definition #defines
SPINDLE_PWM_PIN
SPINDLE_ENABLE_PIN
SPINDLE_DIR_PIN

View File

@@ -104,6 +104,8 @@ class RelaySpindle : public PWMSpindle {
public:
void init();
void config_message();
float set_rpm(float rpm);
protected:
void set_pwm(uint32_t duty);
};