/* spindle_control.c - spindle control methods Part of Grbl Copyright (c) 2012-2016 Sungeun K. Jeon for Gnea Research LLC Copyright (c) 2009-2011 Simen Svale Skogsrud Grbl is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Grbl is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 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 . */ #include "grbl.h" #ifdef SPINDLE_MINIMUM_PWM #define SPINDLE_PWM_MIN_VALUE SPINDLE_MINIMUM_PWM #else #define SPINDLE_PWM_MIN_VALUE 0.0 #endif #define SPINDLE_PWM_RANGE (SPINDLE_PWM_MAX_VALUE-SPINDLE_PWM_MIN_VALUE) #ifdef VARIABLE_SPINDLE static float pwm_gradient; // Precalulated value to speed up rpm to PWM conversions. #endif 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 >= settings.rpm_max)) { // No PWM range possible. Set simple on/off spindle control pin state. sys.spindle_speed = settings.rpm_max; return(SPINDLE_PWM_MAX_VALUE); } else if (rpm < settings.rpm_min) { if (rpm == 0.0) { sys.spindle_speed = 0.0; return(SPINDLE_PWM_OFF_VALUE); } else { sys.spindle_speed = settings.rpm_min; return(SPINDLE_PWM_MIN_VALUE); } } else { sys.spindle_speed = rpm; return(floor( (rpm-settings.rpm_min)*pwm_gradient + (SPINDLE_PWM_MIN_VALUE+0.5))); } } #endif // Immediately sets spindle running state with direction and spindle rpm via PWM, if enabled. // Called by g-code parser spindle_sync(), parking retract and restore, g-code program end, // sleep, and spindle stop override. #ifdef VARIABLE_SPINDLE void spindle_set_state(uint8_t state, float rpm) #else 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 { #ifndef USE_SPINDLE_DIR_AS_ENABLE_PIN if (state == SPINDLE_ENABLE_CW) { SPINDLE_DIRECTION_PORT &= ~(1<