mirror of
https://github.com/bdring/Grbl_Esp32.git
synced 2025-09-02 19:02:35 +02:00
Added some settings to test dymanic switcing of spindles
This commit is contained in:
@@ -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();
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
@@ -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);
|
||||
}
|
||||
|
@@ -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:
|
||||
|
@@ -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;
|
||||
|
@@ -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
|
||||
}
|
@@ -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);
|
||||
}
|
||||
|
@@ -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
|
||||
}
|
@@ -27,7 +27,6 @@
|
||||
Consider breaking into one file per class.
|
||||
|
||||
Get rid of dependance on machine definition #defines
|
||||
SPINDLE_PWM_BIT_PRECISION
|
||||
SPINDLE_PWM_PIN
|
||||
SPINDLE_ENABLE_PIN
|
||||
SPINDLE_DIR_PIN
|
||||
|
@@ -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);
|
||||
};
|
||||
|
||||
|
Reference in New Issue
Block a user