26#define DT_SEGMENT (1.0/(ACCELERATION_TICKS_PER_SECOND*60.0))
27#define REQ_MM_INCREMENT_SCALAR 1.25
31#define RAMP_DECEL_OVERRIDE 3
33#define PREP_FLAG_RECALCULATE bit(0)
34#define PREP_FLAG_HOLD_PARTIAL_BLOCK bit(1)
35#define PREP_FLAG_PARKING bit(2)
36#define PREP_FLAG_DECEL_OVERRIDE bit(3)
47#ifdef ADAPTIVE_MULTI_AXIS_STEP_SMOOTHING
48 #define MAX_AMASS_LEVEL 3
50 #define AMASS_LEVEL1 (F_CPU/8000)
51 #define AMASS_LEVEL2 (F_CPU/4000)
52 #define AMASS_LEVEL3 (F_CPU/2000)
54 #if MAX_AMASS_LEVEL <= 0
55 error
"AMASS must have 1 or more levels to operate correctly."
70 #ifdef ENABLE_DUAL_AXIS
71 uint8_t direction_bits_dual;
73 #ifdef VARIABLE_SPINDLE
87 #ifdef ADAPTIVE_MULTI_AXIS_STEP_SMOOTHING
92 #ifdef VARIABLE_SPINDLE
104 #ifdef STEP_PULSE_DELAY
112 #ifdef ENABLE_DUAL_AXIS
113 uint8_t step_outbits_dual;
114 uint8_t dir_outbits_dual;
116 #ifdef ADAPTIVE_MULTI_AXIS_STEP_SMOOTHING
135#ifdef ENABLE_DUAL_AXIS
136 static uint8_t step_port_invert_mask_dual;
137 static uint8_t dir_port_invert_mask_dual;
159 #ifdef PARKING_ENABLE
160 uint8_t last_st_block_index;
161 float last_steps_remaining;
162 float last_step_per_mm;
163 float last_dt_remainder;
175 #ifdef VARIABLE_SPINDLE
228 else { STEPPERS_DISABLE_PORT &= ~(1<<STEPPERS_DISABLE_BIT); }
234 #ifdef STEP_PULSE_DELAY
245 TIMSK1 |= (1<<OCIE1A);
253 TIMSK1 &= ~(1<<OCIE1A);
254 TCCR1B = (TCCR1B & ~((1<<CS12) | (1<<CS11))) | (1<<CS10);
258 bool pin_state =
false;
266 if (pin_state) { STEPPERS_DISABLE_PORT |= (1<<STEPPERS_DISABLE_BIT); }
267 else { STEPPERS_DISABLE_PORT &= ~(1<<STEPPERS_DISABLE_BIT); }
321 if (
busy) {
return; }
324 DIRECTION_PORT = (DIRECTION_PORT & ~DIRECTION_MASK) | (
st.
dir_outbits & DIRECTION_MASK);
325 #ifdef ENABLE_DUAL_AXIS
326 DIRECTION_PORT_DUAL = (DIRECTION_PORT_DUAL & ~DIRECTION_MASK_DUAL) | (
st.dir_outbits_dual & DIRECTION_MASK_DUAL);
330 #ifdef STEP_PULSE_DELAY
332 #ifdef ENABLE_DUAL_AXIS
333 st.step_bits_dual = (STEP_PORT_DUAL & ~STEP_MASK_DUAL) |
st.step_outbits_dual;
337 #ifdef ENABLE_DUAL_AXIS
338 STEP_PORT_DUAL = (STEP_PORT_DUAL & ~STEP_MASK_DUAL) |
st.step_outbits_dual;
358 #ifndef ADAPTIVE_MULTI_AXIS_STEP_SMOOTHING
360 TCCR1B = (TCCR1B & ~(0x07<<CS10)) | (
st.
exec_segment->prescaler<<CS10);
376 #ifdef ENABLE_DUAL_AXIS
377 st.dir_outbits_dual =
st.
exec_block->direction_bits_dual ^ dir_port_invert_mask_dual;
380 #ifdef ADAPTIVE_MULTI_AXIS_STEP_SMOOTHING
387 #ifdef VARIABLE_SPINDLE
395 #ifdef VARIABLE_SPINDLE
410 #ifdef ENABLE_DUAL_AXIS
411 st.step_outbits_dual = 0;
415 #ifdef ADAPTIVE_MULTI_AXIS_STEP_SMOOTHING
422 #if defined(ENABLE_DUAL_AXIS) && (DUAL_AXIS_SELECT == X_AXIS)
423 st.step_outbits_dual = (1<<DUAL_STEP_BIT);
429 #ifdef ADAPTIVE_MULTI_AXIS_STEP_SMOOTHING
436 #if defined(ENABLE_DUAL_AXIS) && (DUAL_AXIS_SELECT == Y_AXIS)
437 st.step_outbits_dual = (1<<DUAL_STEP_BIT);
443 #ifdef ADAPTIVE_MULTI_AXIS_STEP_SMOOTHING
458 #ifdef ENABLE_DUAL_AXIS
459 st.step_outbits_dual &=
sys.homing_axis_lock_dual;
471 #ifdef ENABLE_DUAL_AXIS
472 st.step_outbits_dual ^= step_port_invert_mask_dual;
493 #ifdef ENABLE_DUAL_AXIS
494 STEP_PORT_DUAL = (STEP_PORT_DUAL & ~STEP_MASK_DUAL) | (step_port_invert_mask_dual & STEP_MASK_DUAL);
498#ifdef STEP_PULSE_DELAY
504 ISR(TIMER0_COMPA_vect)
506 STEP_PORT =
st.step_bits;
507 #ifdef ENABLE_DUAL_AXIS
508 STEP_PORT_DUAL =
st.step_bits_dual;
520 for (idx=0; idx<
N_AXIS; idx++) {
524 #ifdef ENABLE_DUAL_AXIS
525 step_port_invert_mask_dual = 0;
526 dir_port_invert_mask_dual = 0;
557 #ifdef ENABLE_DUAL_AXIS
558 st.dir_outbits_dual = dir_port_invert_mask_dual;
559 STEP_PORT_DUAL = (STEP_PORT_DUAL & ~STEP_MASK_DUAL) | step_port_invert_mask_dual;
560 DIRECTION_PORT_DUAL = (DIRECTION_PORT_DUAL & ~DIRECTION_MASK_DUAL) | dir_port_invert_mask_dual;
569 STEP_DDR |= STEP_MASK;
570 STEPPERS_DISABLE_DDR |= 1<<STEPPERS_DISABLE_BIT;
571 DIRECTION_DDR |= DIRECTION_MASK;
573 #ifdef ENABLE_DUAL_AXIS
574 STEP_DDR_DUAL |= STEP_MASK_DUAL;
575 DIRECTION_DDR_DUAL |= DIRECTION_MASK_DUAL;
579 TCCR1B &= ~(1<<WGM13);
580 TCCR1B |= (1<<WGM12);
581 TCCR1A &= ~((1<<WGM11) | (1<<WGM10));
582 TCCR1A &= ~((1<<COM1A1) | (1<<COM1A0) | (1<<COM1B1) | (1<<COM1B0));
587 TIMSK0 &= ~((1<<OCIE0B) | (1<<OCIE0A) | (1<<TOIE0));
590 TIMSK0 |= (1<<TOIE0);
591 #ifdef STEP_PULSE_DELAY
592 TIMSK0 |= (1<<OCIE0A);
686 #ifdef PARKING_ENABLE
703 #ifdef ENABLE_DUAL_AXIS
704 #if (DUAL_AXIS_SELECT == X_AXIS)
706 #elif (DUAL_AXIS_SELECT == Y_AXIS)
709 st_prep_block->direction_bits_dual = (1<<DUAL_DIRECTION_BIT);
713 #ifndef ADAPTIVE_MULTI_AXIS_STEP_SMOOTHING
739 #ifdef VARIABLE_SPINDLE
767 if (decel_dist < 0.0) {
779 float exit_speed_sqr;
789 float nominal_speed_sqr = nominal_speed*nominal_speed;
790 float intersect_distance =
814 }
else if (intersect_distance > 0.0) {
815 if (intersect_distance < pl_block->millimeters) {
844 #ifdef VARIABLE_SPINDLE
871 float time_var = dt_max;
876 if (minimum_mm < 0.0) { minimum_mm = 0.0; }
919 mm_remaining = mm_var;
929 mm_remaining = mm_var;
940 if (dt < dt_max) { time_var = dt_max - dt; }
942 if (mm_remaining > minimum_mm) {
946 time_var = dt_max - dt;
953 #ifdef VARIABLE_SPINDLE
960 float rpm =
pl_block->spindle_speed;
987 float n_steps_remaining = ceil(step_dist_remaining);
989 prep_segment->
n_step = last_n_steps_remaining-n_steps_remaining;
992 if (prep_segment->
n_step == 0) {
997 #ifdef PARKING_ENABLE
1013 float inv_rate = dt/(last_n_steps_remaining - step_dist_remaining);
1018 #ifdef ADAPTIVE_MULTI_AXIS_STEP_SMOOTHING
1033 if (cycles < (1UL << 16)) {
1034 prep_segment->prescaler = 1;
1036 }
else if (cycles < (1UL << 19)) {
1037 prep_segment->prescaler = 2;
1040 prep_segment->prescaler = 3;
1041 if (cycles < (1UL << 22)) {
1061 if (mm_remaining > 0.0) {
1066 #ifdef PARKING_ENABLE
int32_t sys_position[N_AXIS]
volatile uint8_t sys_probe_state
volatile uint8_t sys_rt_exec_alarm
void delay_ms(uint16_t ms)
#define TICKS_PER_MICROSECOND
#define bit_istrue(x, mask)
#define bit_false(x, mask)
#define bit_true(x, mask)
void plan_discard_current_block()
plan_block_t * plan_get_current_block()
float plan_compute_profile_nominal_speed(plan_block_t *block)
float plan_get_exec_block_exit_speed_sqr()
plan_block_t * plan_get_system_motion_block()
#define PL_COND_FLAG_SPINDLE_CCW
#define PL_COND_FLAG_SPINDLE_CW
void probe_state_monitor()
uint8_t get_direction_pin_mask(uint8_t axis_idx)
uint8_t get_step_pin_mask(uint8_t axis_idx)
#define BITFLAG_INVERT_ST_ENABLE
#define BITFLAG_LASER_MODE
void spindle_set_speed(uint8_t pwm_value)
uint8_t spindle_compute_pwm_value(float rpm)
#define REQ_MM_INCREMENT_SCALAR
#define PREP_FLAG_DECEL_OVERRIDE
float st_get_realtime_rate()
static uint8_t step_port_invert_mask
static volatile uint8_t busy
#define RAMP_DECEL_OVERRIDE
#define PREP_FLAG_RECALCULATE
static uint8_t st_next_block_index(uint8_t block_index)
void st_update_plan_block_parameters()
#define PREP_FLAG_PARKING
static st_block_t * st_prep_block
static uint8_t dir_port_invert_mask
void st_generate_step_dir_invert_masks()
static volatile uint8_t segment_buffer_tail
#define PREP_FLAG_HOLD_PARTIAL_BLOCK
static uint8_t segment_next_head
static st_block_t st_block_buffer[SEGMENT_BUFFER_SIZE-1]
static plan_block_t * pl_block
static segment_t segment_buffer[SEGMENT_BUFFER_SIZE]
static uint8_t segment_buffer_head
void st_parking_restore_buffer()
#define SEGMENT_BUFFER_SIZE
void st_parking_setup_buffer()
uint32_t step_event_count
uint8_t stepper_idle_lock_time
uint8_t pulse_microseconds
uint8_t is_pwm_rate_adjusted
uint32_t step_event_count
uint8_t current_spindle_pwm
void system_set_exec_state_flag(uint8_t mask)
#define STEP_CONTROL_EXECUTE_HOLD
#define STEP_CONTROL_EXECUTE_SYS_MOTION
#define STEP_CONTROL_UPDATE_SPINDLE_PWM
#define STATE_SAFETY_DOOR
#define STEP_CONTROL_END_MOTION