diff --git a/README.md b/README.md index 889209a..02d983f 100644 --- a/README.md +++ b/README.md @@ -10,25 +10,25 @@ Usage notes: If it doesn't, try installing VCOM_lib/usbser.inf. * This doesn't pass the sdcard to the host. Once installed you need to use a micro sdcard adaptor to replace or change it. * Only tested with lasers with PWM. Non-PWM spindle control not ported. -* This special version supports setting PWM frequency by $33. Default is 5000 Hz. Pin can only be changes in config.h. - * Pin 2.5 - * 5 kHz - * PWM off value: 0% - * Mimimum PWM value: 0% - * Maximum PWM value: 100% * These are defaults for easy-to-change config values. + * WPos enabled for LaserWeb compatability ($10=0) * Maximum S value: 1000.0 ($30) * Minimum S value: 0.0 ($31) * Laser mode: 1 ($32) - * Laser PWM frequency: 5000 ($33) +* New configuration settings + * $33 is PWM frequency in Hz + * $34 is PWM off value in % + * $35 is PWM min value in % + * $36 is PWM max value in % + * $140 is X current (amps) + * $141 is Y current (amps) + * $142 is Z current (amps) + * Currents default to 0.0 amps to avoid burning out your motors/drivers + * Your motors will likely stall if you don't set these! + * Hard limits not yet ported * Control inputs not yet ported (e.g. Cycle Start and Safety Door switches) -New configuration settings -* $33 is PWM frequency in Hz -* $140, $141, $142 are X, Y, Z current (amps) -* Default to 0.0 A to avoid burning out your motors -* Your motors will likely stall if you don't set these! Build notes: * Include ```make``` and the ```arm-none-eabi-*``` tools in your path. diff --git a/grbl/report.c b/grbl/report.c index f748d6e..0c131fd 100644 --- a/grbl/report.c +++ b/grbl/report.c @@ -214,7 +214,10 @@ void report_grbl_settings() { #else report_util_uint8_setting(32,0); #endif - report_util_uint32_setting(33,settings.spindle_pwm_freq); + report_util_float_setting(33,settings.spindle_pwm_freq,N_DECIMAL_SETTINGVALUE); + report_util_float_setting(34,settings.spindle_pwm_off_value,N_DECIMAL_SETTINGVALUE); + report_util_float_setting(35,settings.spindle_pwm_min_value,N_DECIMAL_SETTINGVALUE); + report_util_float_setting(36,settings.spindle_pwm_max_value,N_DECIMAL_SETTINGVALUE); // Print axis settings uint8_t idx, set_idx; uint8_t val = AXIS_SETTINGS_START_VAL; diff --git a/grbl/settings.c b/grbl/settings.c index f42015c..644debb 100644 --- a/grbl/settings.c +++ b/grbl/settings.c @@ -337,6 +337,9 @@ uint8_t settings_store_global_setting(uint8_t parameter, float value) { #endif break; case 33: settings.spindle_pwm_freq = value; spindle_init(); break; // Re-initialize spindle pwm calibration + case 34: settings.spindle_pwm_off_value = value; spindle_init(); break; // Re-initialize spindle pwm calibration + case 35: settings.spindle_pwm_min_value = value; spindle_init(); break; // Re-initialize spindle pwm calibration + case 36: settings.spindle_pwm_max_value = value; spindle_init(); break; // Re-initialize spindle pwm calibration default: return(STATUS_INVALID_STATEMENT); } diff --git a/grbl/settings.h b/grbl/settings.h index e6e5abe..71e9aa0 100644 --- a/grbl/settings.h +++ b/grbl/settings.h @@ -92,10 +92,10 @@ typedef struct { float junction_deviation; float arc_tolerance; - float spindle_pwm_freq; + float spindle_pwm_freq; // Hz float spindle_pwm_off_value; // Percent float spindle_pwm_min_value; // Percent - float spindle_pwm_max_value; // Percent + float spindle_pwm_max_value; // Percent float rpm_max; float rpm_min; diff --git a/grbl/spindle_control.c b/grbl/spindle_control.c index 74a589f..b3e203f 100644 --- a/grbl/spindle_control.c +++ b/grbl/spindle_control.c @@ -142,21 +142,21 @@ void spindle_stop() rpm *= (0.010*sys.spindle_speed_ovr); // Scale by spindle speed override value. if (rpm <= 0) { sys.spindle_speed = 0; - pwm_value = spindle_pwm_off_value; //SPINDLE_PWM_OFF_VALUE + pwm_value = spindle_pwm_off_value; } else if (rpm <= settings.rpm_min) { sys.spindle_speed = settings.rpm_min; - pwm_value = spindle_pwm_min_value; //SPINDLE_PWM_MIN_VALUE + pwm_value = spindle_pwm_min_value; } else if (rpm >= settings.rpm_max) { sys.spindle_speed = settings.rpm_max; - pwm_value = spindle_pwm_max_value - 1; //SPINDLE_PWM_MAX_VALUE + pwm_value = spindle_pwm_max_value - 1; } else { sys.spindle_speed = rpm; - pwm_value = floor((rpm - settings.rpm_min) * pwm_gradient) + spindle_pwm_min_value; //SPINDLE_PWM_MIN_VALUE - if(pwm_value >= spindle_pwm_max_value) //SPINDLE_PWM_MAX_VALUE - pwm_value = spindle_pwm_max_value - 1; //SPINDLE_PWM_MAX_VALUE + pwm_value = floor((rpm - settings.rpm_min) * pwm_gradient) + spindle_pwm_min_value; + if(pwm_value >= spindle_pwm_max_value) + pwm_value = spindle_pwm_max_value - 1; } return(pwm_value); } diff --git a/grbl/spindle_control.h b/grbl/spindle_control.h index 302e2db..06c028f 100644 --- a/grbl/spindle_control.h +++ b/grbl/spindle_control.h @@ -40,6 +40,10 @@ uint8_t spindle_get_state(); // Immediately sets spindle running state with direction and spindle rpm via PWM, if enabled. // Called by spindle_sync() after sync and parking motion/spindle stop override during restore. #ifdef VARIABLE_SPINDLE + extern float spindle_pwm_period; + extern float spindle_pwm_off_value; + extern float spindle_pwm_min_value; + extern float spindle_pwm_max_value; // Called by g-code parser when setting spindle state and requires a buffer sync. void spindle_sync(uint8_t state, float rpm);