3df61e0ec5
WARNING: Bugs may still exist. This branch is a work in progress and will be pushed to the edge branch when at beta stability. Use at your own risk. - Homing freezing issue fixed. Had to do with the cycle stop flag being set incorrectly after the homing cycles and before the pull-off maneuver. Now resets the stepper motors before this can happen. - Fixed an issue with a rare feed hold failure. Had to do with feed hold ending exactly at the end of a block. The runtime protocol now sets the QUEUED and IDLE states appropriately when this occurs. Still need to clean this code up however, as it’s patched rather than written well. - Updated version build via $I command. - Forgot to comment on a new feature for the last commit. Since steps are integers and millimeters traveled are floats, the old step segment generator ignored the step fraction differences in generating the segment velocities. Didn’t see like it would be much of a big deal, but there were instances that this would be a problem, especially for very slow feed rates. The stepper algorithm now micro-adjusts the segment velocities based on the step fractions not executed from the previous segment. This ensures that Grbl generates the velocity profiles EXACTLY and noticeably improves overall acceleration performance.
93 lines
2.9 KiB
C
93 lines
2.9 KiB
C
/*
|
|
spindle_control.c - spindle control methods
|
|
Part of Grbl
|
|
|
|
Copyright (c) 2012-2014 Sungeun K. Jeon
|
|
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 <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#include "system.h"
|
|
#include "spindle_control.h"
|
|
#include "protocol.h"
|
|
|
|
|
|
void spindle_init()
|
|
{
|
|
// On the Uno, spindle enable and PWM are shared. Other CPUs have seperate enable pin.
|
|
#ifdef VARIABLE_SPINDLE
|
|
SPINDLE_PWM_DDR |= (1<<SPINDLE_PWM_BIT); // Configure as PWM output pin.
|
|
#ifndef CPU_MAP_ATMEGA328P
|
|
SPINDLE_ENABLE_DDR |= (1<<SPINDLE_ENABLE_BIT); // Configure as output pin.
|
|
#endif
|
|
#else
|
|
SPINDLE_ENABLE_DDR |= (1<<SPINDLE_ENABLE_BIT); // Configure as output pin.
|
|
#endif
|
|
SPINDLE_DIRECTION_DDR |= (1<<SPINDLE_DIRECTION_BIT); // Configure as output pin.
|
|
spindle_stop();
|
|
}
|
|
|
|
|
|
void spindle_stop()
|
|
{
|
|
// On the Uno, spindle enable and PWM are shared. Other CPUs have seperate enable pin.
|
|
#ifdef VARIABLE_SPINDLE
|
|
TCCRA_REGISTER &= ~(1<<COMB_BIT); // Disable PWM. Output voltage is zero.
|
|
#ifndef CPU_MAP_ATMEGA328P
|
|
SPINDLE_ENABLE_PORT &= ~(1<<SPINDLE_ENABLE_BIT); // Set pin to low.
|
|
#endif
|
|
#else
|
|
SPINDLE_ENABLE_PORT &= ~(1<<SPINDLE_ENABLE_BIT); // Set pin to low.
|
|
#endif
|
|
}
|
|
|
|
|
|
void spindle_run(uint8_t direction, float rpm)
|
|
{
|
|
// Empty planner buffer to ensure spindle is set when programmed.
|
|
protocol_buffer_synchronize();
|
|
|
|
// Halt or set spindle direction and rpm.
|
|
if (direction == SPINDLE_DISABLE) {
|
|
|
|
spindle_stop();
|
|
|
|
} else {
|
|
|
|
if (direction == SPINDLE_ENABLE_CW) {
|
|
SPINDLE_DIRECTION_PORT &= ~(1<<SPINDLE_DIRECTION_BIT);
|
|
} else {
|
|
SPINDLE_DIRECTION_PORT |= (1<<SPINDLE_DIRECTION_BIT);
|
|
}
|
|
|
|
#ifdef VARIABLE_SPINDLE
|
|
#define SPINDLE_RPM_RANGE (SPINDLE_MAX_RPM-SPINDLE_MIN_RPM)
|
|
TCCRA_REGISTER = (1<<COMB_BIT) | (1<<WAVE1_REGISTER) | (1<<WAVE0_REGISTER);
|
|
TCCRB_REGISTER = (TCCRB_REGISTER & 0b11111000) | 0x02; // set to 1/8 Prescaler
|
|
rpm -= SPINDLE_MIN_RPM;
|
|
if ( rpm > SPINDLE_RPM_RANGE ) { rpm = SPINDLE_RPM_RANGE; } // Prevent uint8 overflow
|
|
uint8_t current_pwm = floor( rpm*(255.0/SPINDLE_RPM_RANGE) + 0.5);
|
|
OCR_REGISTER = current_pwm;
|
|
|
|
#ifndef CPU_MAP_ATMEGA328P // On the Uno, spindle enable and PWM are shared.
|
|
SPINDLE_ENABLE_PORT |= (1<<SPINDLE_ENABLE_BIT);
|
|
#endif
|
|
#else
|
|
SPINDLE_ENABLE_PORT |= (1<<SPINDLE_ENABLE_BIT);
|
|
#endif
|
|
|
|
}
|
|
}
|