/* 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" #include "pwm_driver.h" #ifdef VARIABLE_SPINDLE static float pwm_gradient; // Precalulated value to speed up rpm to PWM conversions. float spindle_pwm_period; float spindle_pwm_off_value; float spindle_pwm_min_value; float spindle_pwm_max_value; #endif void spindle_init() { #ifdef VARIABLE_SPINDLE spindle_pwm_period = (SystemCoreClock / settings.spindle_pwm_freq); spindle_pwm_off_value = (spindle_pwm_period * settings.spindle_pwm_off_value / 100); spindle_pwm_min_value = (spindle_pwm_period * settings.spindle_pwm_min_value / 100); spindle_pwm_max_value = (spindle_pwm_period * settings.spindle_pwm_max_value / 100); pwm_init(&SPINDLE_PWM_CHANNEL, SPINDLE_PWM_USE_PRIMARY_PIN, SPINDLE_PWM_USE_SECONDARY_PIN, spindle_pwm_period, 0); pwm_enable(&SPINDLE_PWM_CHANNEL); // Configure variable spindle PWM and enable pin, if requried. On the Uno, PWM and enable are // combined unless configured otherwise. #ifdef USE_SPINDLE_DIR_AS_ENABLE_PIN SPINDLE_ENABLE_DDR |= (1<= settings.rpm_max) { sys.spindle_speed = settings.rpm_max; 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; if(pwm_value >= spindle_pwm_max_value) pwm_value = spindle_pwm_max_value - 1; } return(pwm_value); } #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<