diff --git a/grbl/grbl.h b/grbl/grbl.h index 3f75e4f..2af4d40 100644 --- a/grbl/grbl.h +++ b/grbl/grbl.h @@ -56,7 +56,7 @@ #include "probe.h" #include "protocol.h" #include "report.h" -#include "serial.h" +//#include "serial.h" #include "spindle_control.h" #include "stepper.h" #include "jog.h" diff --git a/grbl/spindle_control.c b/grbl/spindle_control.c index 550b752..8b1525d 100644 --- a/grbl/spindle_control.c +++ b/grbl/spindle_control.c @@ -29,66 +29,72 @@ void spindle_init() { - #ifdef VARIABLE_SPINDLE - // Configure variable spindle PWM and enable pin, if requried. On the Uno, PWM and enable are - // combined unless configured otherwise. - SPINDLE_PWM_DDR |= (1<= settings.rpm_max) || (rpm >= RPM_MAX)) { - rpm = RPM_MAX; - pwm_value = SPINDLE_PWM_MAX_VALUE; - } else if (rpm <= RPM_MIN) { - if (rpm == 0.0) { // S0 disables spindle - pwm_value = SPINDLE_PWM_OFF_VALUE; - } else { - rpm = RPM_MIN; - pwm_value = SPINDLE_PWM_MIN_VALUE; - } - } else { - // Compute intermediate PWM value with linear spindle speed model via piecewise linear fit model. - #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); - } - } - sys.spindle_speed = rpm; - return(pwm_value); + printf("%s:%s:%d Not supported yet..\n",__FILE__,__FUNCTION__,__LINE__); + return 0; + +// uint8_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 >= RPM_MAX)) { +// rpm = RPM_MAX; +// pwm_value = SPINDLE_PWM_MAX_VALUE; +// } else if (rpm <= RPM_MIN) { +// if (rpm == 0.0) { // S0 disables spindle +// pwm_value = SPINDLE_PWM_OFF_VALUE; +// } else { +// rpm = RPM_MIN; +// pwm_value = SPINDLE_PWM_MIN_VALUE; +// } +// } else { +// // Compute intermediate PWM value with linear spindle speed model via piecewise linear fit model. +// #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); +// } +// } +// sys.spindle_speed = rpm; +// return(pwm_value); +// } +// +// #else +// +// // Called by spindle_set_state() and step segment generator. Keep routine small and efficient. +// uint8_t spindle_compute_pwm_value(float rpm) // 328p PWM register is 8-bit. +// { +// uint8_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; +// pwm_value = floor((rpm-settings.rpm_min)*pwm_gradient) + SPINDLE_PWM_MIN_VALUE; +// } +// return(pwm_value); } - #else - - // Called by spindle_set_state() and step segment generator. Keep routine small and efficient. - uint8_t spindle_compute_pwm_value(float rpm) // 328p PWM register is 8-bit. - { - uint8_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; - pwm_value = floor((rpm-settings.rpm_min)*pwm_gradient) + SPINDLE_PWM_MIN_VALUE; - } - return(pwm_value); - } - - #endif -#endif + //#endif +//#endif // Immediately sets spindle running state with direction and spindle rpm via PWM, if enabled. @@ -228,46 +241,48 @@ void spindle_stop() void _spindle_set_state(uint8_t state) #endif { - if (sys.abort) { return; } // Block during abort. - - if (state == SPINDLE_DISABLE) { // Halt or set spindle direction and rpm. - - #ifdef VARIABLE_SPINDLE - sys.spindle_speed = 0.0; - #endif - spindle_stop(); - - } else { - - #if !defined(USE_SPINDLE_DIR_AS_ENABLE_PIN) && !defined(ENABLE_DUAL_AXIS) - if (state == SPINDLE_ENABLE_CW) { - SPINDLE_DIRECTION_PORT &= ~(1<cycles_per_tick; + //OCR1A = st.exec_segment->cycles_per_tick; st.step_count = st.exec_segment->n_step; // NOTE: Can sometimes be zero when moving slow. // If the new segment starts a new planner block, initialize stepper variables and counters. // NOTE: When the segment data index changes, this indicates a new planner block. @@ -486,30 +523,30 @@ ISR(TIMER1_COMPA_vect) // This interrupt is enabled by ISR_TIMER1_COMPAREA when it sets the motor port bits to execute // a step. This ISR resets the motor port after a short period (settings.pulse_microseconds) // completing one step cycle. -ISR(TIMER0_OVF_vect) -{ - // Reset stepping pins (leave the direction pins) - STEP_PORT = (STEP_PORT & ~STEP_MASK) | (step_port_invert_mask & STEP_MASK); - #ifdef ENABLE_DUAL_AXIS - STEP_PORT_DUAL = (STEP_PORT_DUAL & ~STEP_MASK_DUAL) | (step_port_invert_mask_dual & STEP_MASK_DUAL); - #endif - TCCR0B = 0; // Disable Timer0 to prevent re-entering this interrupt when it's not needed. -} -#ifdef STEP_PULSE_DELAY - // This interrupt is used only when STEP_PULSE_DELAY is enabled. Here, the step pulse is - // initiated after the STEP_PULSE_DELAY time period has elapsed. The ISR TIMER2_OVF interrupt - // will then trigger after the appropriate settings.pulse_microseconds, as in normal operation. - // The new timing between direction, step pulse, and step complete events are setup in the - // st_wake_up() routine. - ISR(TIMER0_COMPA_vect) - { - STEP_PORT = st.step_bits; // Begin step pulse. - #ifdef ENABLE_DUAL_AXIS - STEP_PORT_DUAL = st.step_bits_dual; - #endif - } -#endif - +//ISR(TIMER0_OVF_vect) +//{ +// // Reset stepping pins (leave the direction pins) +// STEP_PORT = (STEP_PORT & ~STEP_MASK) | (step_port_invert_mask & STEP_MASK); +// #ifdef ENABLE_DUAL_AXIS +// STEP_PORT_DUAL = (STEP_PORT_DUAL & ~STEP_MASK_DUAL) | (step_port_invert_mask_dual & STEP_MASK_DUAL); +// #endif +// TCCR0B = 0; // Disable Timer0 to prevent re-entering this interrupt when it's not needed. +//} +//#ifdef STEP_PULSE_DELAY +// // This interrupt is used only when STEP_PULSE_DELAY is enabled. Here, the step pulse is +// // initiated after the STEP_PULSE_DELAY time period has elapsed. The ISR TIMER2_OVF interrupt +// // will then trigger after the appropriate settings.pulse_microseconds, as in normal operation. +// // The new timing between direction, step pulse, and step complete events are setup in the +// // st_wake_up() routine. +// ISR(TIMER0_COMPA_vect) +// { +// STEP_PORT = st.step_bits; // Begin step pulse. +// #ifdef ENABLE_DUAL_AXIS +// STEP_PORT_DUAL = st.step_bits_dual; +// #endif +// } +//#endif +// // Generates the step and direction port invert masks used in the Stepper Interrupt Driver. void st_generate_step_dir_invert_masks() @@ -575,22 +612,22 @@ void stepper_init() DIRECTION_DDR_DUAL |= DIRECTION_MASK_DUAL; #endif - // Configure Timer 1: Stepper Driver Interrupt - TCCR1B &= ~(1<