Fix for M7/8/9 modal group checks. Updated AMASS frequency cutoffs and code cleaned.
- Updated Grbl version to 0.9c and build number. - G-code parser was missing modal group violation checks for M7/8/9 commands. Added them. - Updated the Adaptive Multi-Axis Step Smoothing (AMASS) cutoff frequencies so that the trade between the 16-bit Timer1 accuracy and the level step smoothing are somewhat better balanced. (Smoothing isn’t free, but a higher accuracy timer would provide high cutoff frequencies.)
This commit is contained in:
parent
f10bad43b2
commit
f8dd8fa54d
1
gcode.c
1
gcode.c
@ -179,6 +179,7 @@ uint8_t gc_execute_line(char *line)
|
|||||||
switch(int_value) {
|
switch(int_value) {
|
||||||
case 0: case 1: case 2: case 30: group_number = MODAL_GROUP_4; break;
|
case 0: case 1: case 2: case 30: group_number = MODAL_GROUP_4; break;
|
||||||
case 3: case 4: case 5: group_number = MODAL_GROUP_7; break;
|
case 3: case 4: case 5: group_number = MODAL_GROUP_7; break;
|
||||||
|
case 7: case 8: case 9: group_number = MODAL_GROUP_8; break;
|
||||||
}
|
}
|
||||||
// Set 'M' commands
|
// Set 'M' commands
|
||||||
switch(int_value) {
|
switch(int_value) {
|
||||||
|
3
gcode.h
3
gcode.h
@ -38,7 +38,8 @@
|
|||||||
#define MODAL_GROUP_5 6 // [G93,G94] Feed rate mode
|
#define MODAL_GROUP_5 6 // [G93,G94] Feed rate mode
|
||||||
#define MODAL_GROUP_6 7 // [G20,G21] Units
|
#define MODAL_GROUP_6 7 // [G20,G21] Units
|
||||||
#define MODAL_GROUP_7 8 // [M3,M4,M5] Spindle turning
|
#define MODAL_GROUP_7 8 // [M3,M4,M5] Spindle turning
|
||||||
#define MODAL_GROUP_12 9 // [G54,G55,G56,G57,G58,G59] Coordinate system selection
|
#define MODAL_GROUP_8 9 // [M7,M8,M9] Coolant control
|
||||||
|
#define MODAL_GROUP_12 10 // [G54,G55,G56,G57,G58,G59] Coordinate system selection
|
||||||
|
|
||||||
// Define command actions for within execution-type modal groups (motion, stopping, non-modal). Used
|
// Define command actions for within execution-type modal groups (motion, stopping, non-modal). Used
|
||||||
// internally by the parser to know which command to execute.
|
// internally by the parser to know which command to execute.
|
||||||
|
@ -25,8 +25,8 @@
|
|||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include "nuts_bolts.h"
|
#include "nuts_bolts.h"
|
||||||
|
|
||||||
#define GRBL_VERSION "0.9b"
|
#define GRBL_VERSION "0.9c"
|
||||||
#define GRBL_VERSION_BUILD "20131210"
|
#define GRBL_VERSION_BUILD "20131231"
|
||||||
|
|
||||||
// Version of the EEPROM data. Will be used to migrate existing data from older versions of Grbl
|
// Version of the EEPROM data. Will be used to migrate existing data from older versions of Grbl
|
||||||
// when firmware is upgraded. Always stored in byte 0 of eeprom
|
// when firmware is upgraded. Always stored in byte 0 of eeprom
|
||||||
|
28
stepper.c
28
stepper.c
@ -34,11 +34,13 @@
|
|||||||
#define RAMP_CRUISE 1
|
#define RAMP_CRUISE 1
|
||||||
#define RAMP_DECEL 2
|
#define RAMP_DECEL 2
|
||||||
|
|
||||||
|
// Can't have a high of a cutoff frequency. The 16-bit timer isn't as accurate as it seems.
|
||||||
|
// There is a trade between the accuracy of the timer and the smoothness of multi-axis steps.
|
||||||
|
//
|
||||||
#define MAX_AMASS_LEVEL 3
|
#define MAX_AMASS_LEVEL 3
|
||||||
#define AMASS_LEVEL1 (F_CPU/10000)
|
#define AMASS_LEVEL1 (F_CPU/8000)
|
||||||
#define AMASS_LEVEL2 (F_CPU/5000)
|
#define AMASS_LEVEL2 (F_CPU/4000)
|
||||||
#define AMASS_LEVEL3 (F_CPU/2500)
|
#define AMASS_LEVEL3 (F_CPU/2000)
|
||||||
|
|
||||||
|
|
||||||
// Stores the planner block Bresenham algorithm execution data for the segments in the segment
|
// Stores the planner block Bresenham algorithm execution data for the segments in the segment
|
||||||
@ -134,8 +136,6 @@ typedef struct {
|
|||||||
static st_prep_t prep;
|
static st_prep_t prep;
|
||||||
|
|
||||||
|
|
||||||
static void st_config_step_timer(uint32_t cycles);
|
|
||||||
|
|
||||||
/* BLOCK VELOCITY PROFILE DEFINITION
|
/* BLOCK VELOCITY PROFILE DEFINITION
|
||||||
__________________________
|
__________________________
|
||||||
/| |\ _________________ ^
|
/| |\ _________________ ^
|
||||||
@ -727,14 +727,14 @@ void st_prep_buffer()
|
|||||||
#ifdef ADAPTIVE_MULTI_AXIS_STEP_SMOOTHING
|
#ifdef ADAPTIVE_MULTI_AXIS_STEP_SMOOTHING
|
||||||
// Compute step timing and multi-axis smoothing level.
|
// Compute step timing and multi-axis smoothing level.
|
||||||
// NOTE: Only one prescalar is required with AMASS enabled.
|
// NOTE: Only one prescalar is required with AMASS enabled.
|
||||||
if (cycles > AMASS_LEVEL1) {
|
if (cycles < AMASS_LEVEL1) { prep_segment->amass_level = 0; }
|
||||||
if (cycles > AMASS_LEVEL2) {
|
else {
|
||||||
if (cycles > AMASS_LEVEL3) { prep_segment->amass_level = 3; }
|
if (cycles < AMASS_LEVEL2) { prep_segment->amass_level = 1; }
|
||||||
else { prep_segment->amass_level = 2; }
|
else if (cycles < AMASS_LEVEL3) { prep_segment->amass_level = 2; }
|
||||||
} else { prep_segment->amass_level = 1; }
|
else { prep_segment->amass_level = 3; }
|
||||||
cycles >>= prep_segment->amass_level;
|
cycles >>= prep_segment->amass_level;
|
||||||
prep_segment->n_step <<= prep_segment->amass_level;
|
prep_segment->n_step <<= prep_segment->amass_level;
|
||||||
} else { prep_segment->amass_level = 0; }
|
}
|
||||||
if (cycles < (1UL << 16)) { prep_segment->cycles_per_tick = cycles; } // < 65536 (4.1ms @ 16MHz)
|
if (cycles < (1UL << 16)) { prep_segment->cycles_per_tick = cycles; } // < 65536 (4.1ms @ 16MHz)
|
||||||
else { prep_segment->cycles_per_tick = 0xffff; } // Just set the slowest speed possible.
|
else { prep_segment->cycles_per_tick = 0xffff; } // Just set the slowest speed possible.
|
||||||
#else
|
#else
|
||||||
@ -749,7 +749,7 @@ void st_prep_buffer()
|
|||||||
prep_segment->prescaler = 3; // prescaler: 64
|
prep_segment->prescaler = 3; // prescaler: 64
|
||||||
if (cycles < (1UL << 22)) { // < 4194304 (262ms@16MHz)
|
if (cycles < (1UL << 22)) { // < 4194304 (262ms@16MHz)
|
||||||
prep_segment->cycles_per_tick = cycles >> 6;
|
prep_segment->cycles_per_tick = cycles >> 6;
|
||||||
} else { // Just set the slowest speed possible.
|
} else { // Just set the slowest speed possible. (Around 4 step/sec.)
|
||||||
prep_segment->cycles_per_tick = 0xffff;
|
prep_segment->cycles_per_tick = 0xffff;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -778,7 +778,7 @@ void st_prep_buffer()
|
|||||||
|
|
||||||
if (sys.state == STATE_HOLD) {
|
if (sys.state == STATE_HOLD) {
|
||||||
if (prep.current_speed == 0.0) {
|
if (prep.current_speed == 0.0) {
|
||||||
// TODO: Check if the segment buffer gets initialized correctly.
|
// TODO: Check if the segment buffer gets initialized correctly.
|
||||||
plan_cycle_reinitialize();
|
plan_cycle_reinitialize();
|
||||||
sys.state = STATE_QUEUED;
|
sys.state = STATE_QUEUED;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user