25 static float pwm_gradient;
31 SPINDLE_PWM_DDR |= (1<<SPINDLE_PWM_BIT);
32 SPINDLE_TCCRA_REGISTER = SPINDLE_TCCRA_INIT_MASK;
33 SPINDLE_TCCRB_REGISTER = SPINDLE_TCCRB_INIT_MASK;
34 SPINDLE_OCRA_REGISTER = SPINDLE_OCRA_TOP_VALUE;
35 SPINDLE_ENABLE_DDR |= (1<<SPINDLE_ENABLE_BIT);
36 SPINDLE_DIRECTION_DDR |= (1<<SPINDLE_DIRECTION_BIT);
45 #ifdef INVERT_SPINDLE_ENABLE_PIN
46 if (
bit_isfalse(SPINDLE_ENABLE_PORT,(1<<SPINDLE_ENABLE_BIT)) && (SPINDLE_TCCRA_REGISTER & (1<<SPINDLE_COMB_BIT))) {
48 if (
bit_istrue(SPINDLE_ENABLE_PORT,(1<<SPINDLE_ENABLE_BIT)) && (SPINDLE_TCCRA_REGISTER & (1<<SPINDLE_COMB_BIT))) {
50 if (SPINDLE_DIRECTION_PORT & (1<<SPINDLE_DIRECTION_BIT)) {
return(
SPINDLE_STATE_CCW); }
61 SPINDLE_TCCRA_REGISTER &= ~(1<<SPINDLE_COMB_BIT);
62 #ifdef INVERT_SPINDLE_ENABLE_PIN
63 SPINDLE_ENABLE_PORT |= (1<<SPINDLE_ENABLE_BIT);
65 SPINDLE_ENABLE_PORT &= ~(1<<SPINDLE_ENABLE_BIT);
73 SPINDLE_OCR_REGISTER = pwm_value;
74 if (pwm_value == SPINDLE_PWM_OFF_VALUE) {
75 SPINDLE_TCCRA_REGISTER &= ~(1<<SPINDLE_COMB_BIT);
77 SPINDLE_TCCRA_REGISTER |= (1<<SPINDLE_COMB_BIT);
90 pwm_value = SPINDLE_PWM_MAX_VALUE;
94 pwm_value = SPINDLE_PWM_OFF_VALUE;
97 pwm_value = SPINDLE_PWM_MIN_VALUE;
104 pwm_value = floor((rpm-
settings.
rpm_min)*pwm_gradient) + SPINDLE_PWM_MIN_VALUE;
123 SPINDLE_DIRECTION_PORT &= ~(1<<SPINDLE_DIRECTION_BIT);
125 SPINDLE_DIRECTION_PORT |= (1<<SPINDLE_DIRECTION_BIT);
135 #ifdef INVERT_SPINDLE_ENABLE_PIN
136 SPINDLE_ENABLE_PORT &= ~(1<<SPINDLE_ENABLE_BIT);
138 SPINDLE_ENABLE_PORT |= (1<<SPINDLE_ENABLE_BIT);
void spindle_set_state(uint8_t state, float rpm)
Immediately sets spindle running state with direction and spindle rpm via PWM, if enabled...
void spindle_init()
Initializes spindle pins and hardware PWM, if enabled.
#define SPINDLE_ENABLE_CCW
NOTE: Uses planner condition bit flag)
uint8_t spindle_speed_ovr
Spindle speed value in percent.
uint16_t spindle_compute_pwm_value(float rpm)
Called by spindle_set_state() and step segment generator. Keep routine small and efficient.
#define SPINDLE_STATE_DISABLE
Must be zero.
void protocol_buffer_synchronize()
Block until all buffered steps are executed or in a cycle state. Works with feed hold.
uint8_t state
Tracks the current system state of Grbl.
uint8_t spindle_get_state()
Returns current spindle output state. Overrides may alter it from programmed states.
#define BITFLAG_LASER_MODE
void spindle_stop()
Disables the spindle and sets PWM output to zero when PWM variable spindle speed is enabled...
#define SPINDLE_DISABLE
Modal Group M7: Spindle control.
uint8_t abort
System abort flag. Forces exit back to main loop for reset.
uint8_t flags
Contains default boolean settings.
#define STATE_CHECK_MODE
G-code check mode. Locks out planner and motion only.
system_t sys
Declare system global variable structure.
uint8_t report_ovr_counter
Tracks when to add override data to status reports.
void spindle_set_speed(uint16_t pwm_value)
Sets spindle speed PWM output and enable pin, if configured. Called by spindle_set_state() ...
#define SPINDLE_ENABLE_CW
M3 (.
#define bit_isfalse(x, mask)
#define SPINDLE_STATE_CCW
void spindle_sync(uint8_t state, float rpm)
G-code parser entry-point for setting spindle state. Forces a planner buffer sync and bails...
#define bit_istrue(x, mask)