Testing and tweaks

This commit is contained in:
Alden Hart
2017-01-14 11:49:23 -05:00
parent 59c4cbad7e
commit 65eeab7ac7
7 changed files with 160 additions and 224 deletions
+2 -2
View File
@@ -1353,8 +1353,8 @@ static void _exec_feed_override(const bool m48_enable, const bool m50_enable, co
* cm_m48_enable() - M48, M49
*
* M48 is the master enable for manual feedrate override and spindle override
* If M48 is asserted M50 (mfo), M50.1 (mto) and M51 (sso) settings are in effect
* If M49 is asserted M50 (mfo), M501. (mto) and M51 (sso) settings are in ignored
* If M48 is asserted M50 (mfo), M50.1 (mto) and M51 (spo) settings are in effect
* If M49 is asserted M50 (mfo), M501. (mto) and M51 (spo) settings are in ignored
*
* See http://linuxcnc.org/docs/html/gcode/m-code.html#sec:M48,-M49-Speed-and-Feed-Override-Control
*/
+1 -1
View File
@@ -432,7 +432,7 @@ void cm_reset_overrides(void);
stat_t cm_m48_enable(uint8_t enable); // M48, M49
stat_t cm_mfo_control(const float P_word, const bool P_flag); // M50
stat_t cm_mto_control(const float P_word, const bool P_flag); // M50.1
// See spindle.cpp for cm_sso_control() // M51
// See spindle.cpp for cm_spo_control() // M51
// Program Functions (4.3.10)
void cm_cycle_start(void); // (no Gcode)
+2 -2
View File
@@ -532,13 +532,13 @@ void nv_get_nvObj(nvObj_t *nv)
// special processing for system groups and stripping tokens for groups
if (nv->group[0] != NUL) {
if (GET_TABLE_BYTE(flags) & F_NOSTRIP) {
if (cfgArray[nv->index].flags & F_NOSTRIP) {
nv->group[0] = NUL;
} else {
strcpy(nv->token, &nv->token[strlen(nv->group)]); // strip group from the token
}
}
((fptrCmd)GET_TABLE_WORD(get))(nv); // populate the value
((fptrCmd)cfgArray[nv->index].get)(nv); // populate the value
}
nvObj_t *nv_reset_nv(nvObj_t *nv) // clear a single nvObj structure
+22 -21
View File
@@ -835,6 +835,28 @@ const cfgItem_t cfgArray[] = {
{ "jid","jidc",_f0, 0, tx_print_nul, get_data, set_data, (float *)&cfg.job_id[2], 0},
{ "jid","jidd",_f0, 0, tx_print_nul, get_data, set_data, (float *)&cfg.job_id[3], 0},
// Spindle functions
{ "sp","spmo", _fip, 0, sp_print_spmo, sp_get_spmo, sp_set_spmo, (float *)&cs.null, SPINDLE_MODE },
{ "sp","spph", _fip, 0, sp_print_spph, sp_get_spph, sp_set_spph, (float *)&cs.null, SPINDLE_PAUSE_ON_HOLD },
{ "sp","spde", _fip, 2, sp_print_spde, sp_get_spde, sp_set_spde, (float *)&cs.null, SPINDLE_DWELL_TIME }, // spinup delay
// { "sp","spds", _fip, 2, sp_print_spds, sp_get_spds, sp_set_spds, (float *)&cs.null, SPINDLE_DWELL_TIME }, // spindown delay
// { "sp","spdr", _fip, 2, sp_print_spdr, sp_get_spdr, sp_set_spdr, (float *)&cs.null, SPINDLE_DWELL_TIME }, // direction reversal delay
{ "sp","spsn", _fip, 2, sp_print_spsn, sp_get_spsn, sp_set_spsn, (float *)&cs.null, SPINDLE_SPEED_MIN},
{ "sp","spsm", _fip, 2, sp_print_spsm, sp_get_spsm, sp_set_spsm, (float *)&cs.null, SPINDLE_SPEED_MAX},
{ "sp","spep", _fip, 0, sp_print_spep, sp_get_spep, sp_set_spep, (float *)&cs.null, SPINDLE_ENABLE_POLARITY },
{ "sp","spdp", _fip, 0, sp_print_spdp, sp_get_spdp, sp_set_spdp, (float *)&cs.null, SPINDLE_DIR_POLARITY },
{ "sp","spoe", _fip, 0, sp_print_spoe, sp_get_spoe, sp_set_spoe, (float *)&cs.null, SPINDLE_OVERRIDE_ENABLE},
{ "sp","spo", _fip, 3, sp_print_spo, sp_get_spo, sp_set_spo, (float *)&cs.null, SPINDLE_OVERRIDE_FACTOR},
{ "sp","spc", _f0, 0, sp_print_spc, sp_get_spc, sp_set_spc, (float *)&cs.null, 0 }, // spindle state
{ "sp","sps", _f0, 0, sp_print_sps, sp_get_sps, sp_set_sps, (float *)&cs.null, 0 }, // spindle speed
// Coolant functions
{ "sys","cofp",_fipn,0, cm_print_cofp,get_ui8, set_01, (float *)&coolant.flood_polarity, COOLANT_FLOOD_POLARITY },
{ "sys","comp",_fipn,0, cm_print_comp,get_ui8, set_01, (float *)&coolant.mist_polarity, COOLANT_MIST_POLARITY },
{ "sys","coph",_fipn,0, cm_print_coph,get_ui8, set_01, (float *)&coolant.pause_on_hold, COOLANT_PAUSE_ON_HOLD },
{ "", "com", _fiz, 0, cm_print_com, get_ui8, set_nul, (float *)&coolant.mist_enable, 0 }, // get mist coolant enable
{ "", "cof", _fiz, 0, cm_print_cof, get_ui8, set_nul, (float *)&coolant.flood_enable, 0 }, // get flood coolant enable
// General system parameters
{ "sys","jt", _fipn, 2, cm_print_jt, cm_get_jt, cm_set_jt, (float *)&cs.null, JUNCTION_INTEGRATION_TIME },
{ "sys","ct", _fipnc,4, cm_print_ct, cm_get_ct, cm_set_ct, (float *)&cs.null, CHORDAL_TOLERANCE },
@@ -851,27 +873,6 @@ const cfgItem_t cfgArray[] = {
{ "", "me", _f0, 0, st_print_me, get_nul, st_set_me, (float *)&cs.null, 0 }, // SET to enable motors
{ "", "md", _f0, 0, st_print_md, get_nul, st_set_md, (float *)&cs.null, 0 }, // SET to disable motors
// Spindle functions
{ "sp","spmo",_fipn, 0, sp_print_spmo, sp_get_spmo, sp_set_spmo, (float *)&cs.null, SPINDLE_MODE },
{ "sp","spep",_fipn, 0, sp_print_spep, sp_get_spep, sp_set_spep, (float *)&cs.null, SPINDLE_ENABLE_POLARITY },
{ "sp","spdp",_fipn, 0, sp_print_spdp, sp_get_spdp, sp_set_spdp, (float *)&cs.null, SPINDLE_DIR_POLARITY },
{ "sp","spph",_fipn, 0, sp_print_spph, sp_get_spph, sp_set_spph, (float *)&cs.null, SPINDLE_PAUSE_ON_HOLD },
{ "sp","spdw",_fipn, 2, sp_print_spdw, sp_get_spdw, sp_set_spdw, (float *)&cs.null, SPINDLE_DWELL_TIME },
{ "sp","spsn",_fipn, 2, sp_print_spsn, sp_get_spsn, sp_set_spsn, (float *)&cs.null, SPINDLE_SPEED_MIN},
{ "sp","spsm",_fipn, 2, sp_print_spsm, sp_get_spsm, sp_set_spsm, (float *)&cs.null, SPINDLE_SPEED_MAX},
{ "sp","ssoe",_fipn, 0, sp_print_ssoe, sp_get_spep, sp_set_spep, (float *)&cs.null, SPINDLE_OVERRIDE_ENABLE},
{ "sp","sso", _fipn, 3, sp_print_sso, sp_get_sso, sp_set_sso, (float *)&cs.null, SPINDLE_OVERRIDE_FACTOR},
{ "", "sps", _fiz, 0, sp_print_sps, sp_get_sps, sp_set_sps, (float *)&cs.null, 0 }, // get spindle speed
{ "", "spe", _fiz, 0, sp_print_spe, sp_get_spe, set_nul, (float *)&cs.null, 0 }, // get spindle enable state
{ "", "spd", _fiz, 0, sp_print_spd, sp_get_spd, sp_set_spd, (float *)&cs.null, 0 }, // get spindle direction
// Coolant functions
{ "sys","cofp",_fipn,0, cm_print_cofp,get_ui8, set_01, (float *)&coolant.flood_polarity, COOLANT_FLOOD_POLARITY },
{ "sys","comp",_fipn,0, cm_print_comp,get_ui8, set_01, (float *)&coolant.mist_polarity, COOLANT_MIST_POLARITY },
{ "sys","coph",_fipn,0, cm_print_coph,get_ui8, set_01, (float *)&coolant.pause_on_hold, COOLANT_PAUSE_ON_HOLD },
{ "", "com", _fiz, 0, cm_print_com, get_ui8, set_nul, (float *)&coolant.mist_enable, 0 }, // get mist coolant enable
{ "", "cof", _fiz, 0, cm_print_cof, get_ui8, set_nul, (float *)&coolant.flood_enable, 0 }, // get flood coolant enable
// Communications and reporting parameters
#ifdef __TEXT_MODE
{ "sys","tv", _fipn, 0, tx_print_tv, txt_get_tv, txt_set_tv, (float *)&cs.null, TEXT_VERBOSITY },
+1 -1
View File
@@ -743,7 +743,7 @@ static stat_t _execute_gcode_block(char *active_comment)
EXEC_FUNC(cm_change_tool, tool_change); // M6
if (gf.spindle_control) { // spindle OFF, CW, CCW
ritorno(spindle_control_sync((spState)gv.spindle_control));
ritorno(spindle_control_sync((spControl)gv.spindle_control));
}
EXEC_FUNC(cm_mist_coolant_control, mist_coolant); // M7, M9
+88 -139
View File
@@ -45,7 +45,7 @@ spSpindle_t spindle;
static void _exec_spindle_speed(float *value, bool *flag);
//static void _exec_spindle_control(float *value, bool *flag);
static float _get_spindle_pwm (spState state, spState direction);
static float _get_spindle_pwm (spControl state, spControl direction);
/***********************************************************************************
* spindle_init()
@@ -87,36 +87,45 @@ void spindle_reset()
* In this case spindle.state is SPINDLE_WAIT until move is "played", and dwell completes.
* spindle_control_immediate() has no dwell behavior.
*
* - SPINDLE_PAUSE, when in CW or CCW state, turns spindle OFF and preserves PAUSE in spindle.state.
* If PAUSE is received when not in CW or CCW state it is ignored.
* - SPINDLE_PAUSE is only applicable to CW and CCW states. It forces the spindle OFF and
* sets spindle.state to PAUSE. If PAUSE is received when not in CW or CCW state it is ignored.
*
* - SPINDLE_RESUME, if in a PAUSE state, reverts to previous SPINDLE_CW or SPINDLE_CCW.
* If RESUME is received from spindle_control_sync() the same dwell and WAIT behavior occurs.
* If RESUME is received when not in a PAUSED state it is ignored.
* The SPEED is not changed, and if it were changed in the interim the "new" speed is used.
* If RESUME is received from spindle_control_sync() the usual dwell and WAIT behavior occurs.
* If RESUME is received when not in a PAUSED state it is ignored. This recognizes that the main
* reason an immediate command would be issued - either manually by the user or by an alarm or
* some other program function - is to stop a spindle. So the Resume should be ignored for safety.
*
* Notes:
* - Changes to polarities and other setup parameters take effect on the next spindle action.
* There is no reason to make these occur instantly.
*
* - Since it's possible to queue a sync'd control, then set any control value with an
* immediate() before the queued command is reached, _exec_spindle_control() must gracefully
* handle any arbitrary state transition (not just the "legal" ones)
*
* - Do we need a spin-down for direction reversal?
* - Should the JSON be able to pause and resume?
*/
#define _set_spindle_enable_bit_hi() spindle_enable_pin.set()
#define _set_spindle_enable_bit_lo() spindle_enable_pin.clear()
#define _set_spindle_direction_bit_hi() spindle_dir_pin.set()
#define _set_spindle_direction_bit_lo() spindle_dir_pin.clear()
static void _exec_spindle_control(float *value, bool *flag)
{
spState control = (spState)value[0];
if (control > SPINDLE_RESUME) {
spControl control = (spControl)value[0];
if (control >= SPINDLE_ACTION_MAX) {
return;
}
uint8_t on_bit = SPINDLE_OFF;
int8_t dir_bit = -1; // use this value to skip setting the direction
spindle.state = control; // record spindle state
if ((control == SPINDLE_RESUME) && (spindle.state != SPINDLE_PAUSE)) {
return;
}
spindle.state = control; // record new spindle state
uint8_t on_bit = SPINDLE_OFF; // default to off
int8_t dir_bit = -1; // -1 will skip setting the direction
if ((control == SPINDLE_CW) || (control == SPINDLE_CCW)) {
on_bit = 1; // use 1 (not true) to indicate this is a bitmask
dir_bit = control-1; // adjust direction so it can be used as a bitmask
spindle.direction = control;
// spindle.state = control;
}
else if (control == SPINDLE_RESUME) {
on_bit = 1;
@@ -127,97 +136,46 @@ static void _exec_spindle_control(float *value, bool *flag)
// set the direction first
if (dir_bit >= 0) {
if (dir_bit ^ spindle.dir_polarity) {
_set_spindle_direction_bit_hi();
spindle_dir_pin.set(); // drive pin HI
} else {
_set_spindle_direction_bit_lo();
spindle_dir_pin.clear(); // drive pin LO
}
}
// set on/off
if (on_bit ^ spindle.enable_polarity) {
_set_spindle_enable_bit_lo();
spindle_enable_pin.clear(); // drive pin LO
} else {
_set_spindle_enable_bit_hi();
spindle_enable_pin.set(); // drive pin HI
}
// if (flag[2]) { // set pause
// spindle.state = SPINDLE_PAUSE;
// }
pwm_set_duty(PWM_1, _get_spindle_pwm(spindle.state, spindle.direction));
}
stat_t spindle_control_immediate(spState control)
stat_t spindle_control_immediate(spControl control)
{
// bool pause = (control == SPINDLE_PAUSE) ? true : false;
// float value[] = { (float)control, 0,0,0,0,0 };
float value[] = { (float)control };
// bool flags[] = { 1,0, pause, 0,0,0 };
// if (control != SPINDLE_CONTROL_OFF) {
// value[0] = SPINDLE_ON;
// value[1] = control;
// flags[1] = true;
// }
_exec_spindle_control(value, nullptr);
return(STAT_OK);
}
stat_t spindle_control_sync(spState control) // uses spControl arg: OFF, CW, CCW
stat_t spindle_control_sync(spControl control) // uses spControl arg: OFF, CW, CCW
{
/*
bool pause = (control == SPINDLE_PAUSE) ? true : false;
float value[] = { (float)SPINDLE_OFF, 0,0,0,0,0 };
bool flags[] = { 1,0, pause, 0,0,0 };
if (control != SPINDLE_CONTROL_OFF) {
value[0] = SPINDLE_ON;
value[1] = control;
flags[1] = true;
}
*/
float value[] = { (float)control, 0,0,0,0,0 };
// float value[] = { (float)control, 0,0,0,0,0 };
float value[] = { (float)control };
mp_queue_command(_exec_spindle_control, value, nullptr);
if (fp_NOT_ZERO(spindle.dwell_seconds)) {
if (fp_NOT_ZERO(spindle.spinup_delay)) {
// mp_queue_command(dwell);
}
return(STAT_OK);
}
/***********************************************************************************
* spindle_queue_speed() - queue the S parameter to the planner buffer
* _exec_spindle_speed() - spindle speed callback from planner queue
* spindle_speed_immediate() - execute spindle speed change immediately
* spindle_speed_sync() - queue a spindle speed change to the planner buffer
* _exec_spindle_speed() - actually execute the spindle speed command
*/
stat_t spindle_speed_immediate(float speed)
{
if (speed < spindle.speed_min) {
return (STAT_SPINDLE_SPEED_BELOW_MINIMUM);
}
if (speed > spindle.speed_max) {
return (STAT_SPINDLE_SPEED_MAX_EXCEEDED);
}
float value[AXES] = { speed, 0,0,0,0,0 };
// bool flags[] = { 1,0,0,0,0,0 };
_exec_spindle_speed(value, nullptr);
return (STAT_OK);
}
stat_t spindle_speed_sync(float speed)
{
if (speed < spindle.speed_min) {
return (STAT_SPINDLE_SPEED_BELOW_MINIMUM);
}
if (speed > spindle.speed_max) {
return (STAT_SPINDLE_SPEED_MAX_EXCEEDED);
}
float value[AXES] = { speed, 0,0,0,0,0 };
// bool flags[] = { 1,0,0,0,0,0 };
mp_queue_command(_exec_spindle_speed, value, nullptr);
return (STAT_OK);
}
static void _exec_spindle_speed(float *value, bool *flag)
{
spindle.speed = value[0];
@@ -230,6 +188,29 @@ static void _exec_spindle_speed(float *value, bool *flag)
pwm_set_duty(PWM_1, _get_spindle_pwm(spindle.state, spindle.direction));
}
static stat_t _casey_jones(float speed)
{
if (speed < spindle.speed_min) { return (STAT_SPINDLE_SPEED_BELOW_MINIMUM); }
if (speed > spindle.speed_max) { return (STAT_SPINDLE_SPEED_MAX_EXCEEDED); }
return (STAT_OK);
}
stat_t spindle_speed_immediate(float speed)
{
ritorno(_casey_jones(speed));
float value[] = { speed };
_exec_spindle_speed(value, nullptr);
return (STAT_OK);
}
stat_t spindle_speed_sync(float speed)
{
ritorno(_casey_jones(speed));
float value[] = { speed };
mp_queue_command(_exec_spindle_speed, value, nullptr);
return (STAT_OK);
}
/***********************************************************************************
* _get_spindle_pwm() - return PWM phase (duty cycle) for dir and speed
*/
@@ -266,7 +247,7 @@ static float _get_spindle_pwm (spSpindle_t *sp, pwmControl_t *pwm)
}
*/
static float _get_spindle_pwm (spState state, spState direction)
static float _get_spindle_pwm (spControl state, spControl direction)
{
float speed_lo=0, speed_hi=0, phase_lo=0, phase_hi=0;
if (direction == SPINDLE_CW ) {
@@ -317,18 +298,18 @@ stat_t spindle_override_control(const float P_word, const bool P_flag) // M51
if (P_word > SPINDLE_OVERRIDE_MAX) {
return (STAT_INPUT_EXCEEDS_MAX_VALUE);
}
spindle.sso_factor = P_word; // P word is valid, store it.
spindle.override_factor = P_word; // P word is valid, store it.
new_override = true;
}
}
if (cm->gmx.m48_enable) { // if master enable is ON
if (new_enable && (new_override || !spindle.sso_enable)) { // 3 cases to start a ramp
spindle_start_override(SPINDLE_OVERRIDE_RAMP_TIME, spindle.sso_factor);
} else if (spindle.sso_enable && !new_enable) { // case to turn off the ramp
if (new_enable && (new_override || !spindle.override_enable)) { // 3 cases to start a ramp
spindle_start_override(SPINDLE_OVERRIDE_RAMP_TIME, spindle.override_factor);
} else if (spindle.override_enable && !new_enable) { // case to turn off the ramp
spindle_end_override(SPINDLE_OVERRIDE_RAMP_TIME);
}
}
spindle.sso_enable = new_enable; // always update the enable state
spindle.override_enable = new_enable; // always update the enable state
return (STAT_OK);
}
@@ -366,53 +347,23 @@ stat_t sp_set_spdp(nvObj_t *nv) { return(set_int(nv, (uint8_t &)spindle.dir_pola
stat_t sp_get_spph(nvObj_t *nv) { return(get_int(nv, spindle.dir_polarity)); }
stat_t sp_set_spph(nvObj_t *nv) { return(set_int(nv, (uint8_t &)spindle.dir_polarity, 0, 1)); }
stat_t sp_get_spdw(nvObj_t *nv) { return(get_float(nv, spindle.dwell_seconds)); }
stat_t sp_set_spdw(nvObj_t *nv) { return(set_float_range(nv, spindle.dwell_seconds, 0, SPINDLE_DWELL_MAX)); }
stat_t sp_get_spde(nvObj_t *nv) { return(get_float(nv, spindle.spinup_delay)); }
stat_t sp_set_spde(nvObj_t *nv) { return(set_float_range(nv, spindle.spinup_delay, 0, SPINDLE_DWELL_MAX)); }
stat_t sp_get_spsn(nvObj_t *nv) { return(get_float(nv, spindle.speed_min)); }
stat_t sp_set_spsn(nvObj_t *nv) { return(set_float_range(nv, spindle.speed_min, SPINDLE_SPEED_MIN, SPINDLE_SPEED_MAX)); }
stat_t sp_get_spsm(nvObj_t *nv) { return(get_float(nv, spindle.speed_max)); }
stat_t sp_set_spsm(nvObj_t *nv) { return(set_float_range(nv, spindle.speed_max, SPINDLE_SPEED_MIN, SPINDLE_SPEED_MAX)); }
stat_t sp_get_ssoe(nvObj_t *nv) { return(get_int(nv, spindle.sso_enable)); }
stat_t sp_set_ssoe(nvObj_t *nv) { return(set_int(nv, (uint8_t &)spindle.sso_enable, 0, 1)); }
stat_t sp_get_sso(nvObj_t *nv) { return(get_float(nv, spindle.sso_factor)); }
stat_t sp_set_sso(nvObj_t *nv) { return(set_float_range(nv, spindle.sso_factor, SPINDLE_OVERRIDE_MIN, SPINDLE_OVERRIDE_MAX)); }
/* These are provided as a way to set and clear spindle states without using M commands
* SPD is useful because disabling a spindle (M5) does not change the direction, only the enable.
*/
stat_t sp_get_spoe(nvObj_t *nv) { return(get_int(nv, spindle.override_enable)); }
stat_t sp_set_spoe(nvObj_t *nv) { return(set_int(nv, (uint8_t &)spindle.override_enable, 0, 1)); }
stat_t sp_get_spo(nvObj_t *nv) { return(get_float(nv, spindle.override_factor)); }
stat_t sp_set_spo(nvObj_t *nv) { return(set_float_range(nv, spindle.override_factor, SPINDLE_OVERRIDE_MIN, SPINDLE_OVERRIDE_MAX)); }
// These are provided as a way to view and control spindles without using M commands
stat_t sp_get_spc(nvObj_t *nv) { return(get_int(nv, spindle.state)); }
stat_t sp_set_spc(nvObj_t *nv) { return(spindle_control_immediate((spControl)nv->value)); }
stat_t sp_get_sps(nvObj_t *nv) { return(get_float(nv, spindle.speed)); }
stat_t sp_set_sps(nvObj_t *nv)
{
set_float_range(nv, spindle.speed, spindle.speed_min, spindle.speed_max);
float value[] = { spindle.speed, 0,0,0,0,0 };
bool flags[] = { 1,0,0,0,0,0 };
_exec_spindle_speed(value, flags);
return (STAT_OK);
}
stat_t sp_get_spe(nvObj_t *nv) { return(get_int(nv, spindle.state)); }
/*
stat_t sp_set_spe(nvObj_t *nv)
{
// set_int(nv, (uint8_t &)spindle.state, 0, 1);
float value[] = { (float)spindle.state, (float)spindle.direction, 0,0,0,0 };
bool flags[] = { 1,1,0,0,0,0 };
_exec_spindle_control(value, flags);
return (STAT_OK);
}
*/
stat_t sp_get_spd(nvObj_t *nv) { return(get_int(nv, spindle.direction)); }
stat_t sp_set_spd(nvObj_t *nv)
{
set_int(nv, (uint8_t &)spindle.direction, 0, 1);
float value[] = { (float)spindle.state, (float)spindle.direction, 0,0,0,0 };
bool flags[] = { 1,1,0,0,0,0 };
_exec_spindle_control(value, flags);
return (STAT_OK);
}
stat_t sp_set_sps(nvObj_t *nv) { return(spindle_speed_immediate(nv->value)); }
/***********************************************************************************
* TEXT MODE SUPPORT
@@ -421,30 +372,28 @@ stat_t sp_set_spd(nvObj_t *nv)
#ifdef __TEXT_MODE
const char fmt_spc[] = "[spc] spindle control:%12d [0=OFF,1=CW,2=CCW]\n";
const char fmt_sps[] = "[sps] spindle speed:%14.0f rpm\n";
const char fmt_spmo[] = "[spmo] spindle mode%16d [0=disabled,1=plan-to-stop,2=continuous]\n";
const char fmt_spep[] = "[spep] spindle enable polarity%5d [0=active_low,1=active_high]\n";
const char fmt_spdp[] = "[spdp] spindle direction polarity%2d [0=CW_low,1=CW_high]\n";
const char fmt_spph[] = "[spph] spindle pause on hold%7d [0=no,1=pause_on_hold]\n";
const char fmt_spdw[] = "[spdw] spindle dwell time%12.1f seconds\n";
const char fmt_spde[] = "[spde] spindle spinup delay%10.1f seconds\n";
const char fmt_spsn[] = "[spsn] spindle speed min%14.2f rpm\n";
const char fmt_spsm[] = "[spsm] spindle speed max%14.2f rpm\n";
const char fmt_ssoe[] = "[ssoe] spindle speed override ena%2d [0=disable,1=enable]\n";
const char fmt_sso[] = "[sso] spindle speed override%10.3f [0.050 < sso < 2.000]\n";
const char fmt_sps[] = "Spindle Speed: %7.0f rpm\n";
const char fmt_spe[] = "Spindle Enable:%7d [0=OFF,1=ON,2=PAUSE]\n";
const char fmt_spd[] = "Spindle Direction:%4d [0=CW,1=CCW]\n";
const char fmt_spoe[] = "[spoe] spindle speed override ena%2d [0=disable,1=enable]\n";
const char fmt_spo[] = "[spo] spindle speed override%10.3f [0.050 < spo < 2.000]\n";
void sp_print_spc(nvObj_t *nv) { text_print(nv, fmt_spc);} // TYPE_INT
void sp_print_sps(nvObj_t *nv) { text_print(nv, fmt_sps);} // TYPE_FLOAT
void sp_print_spmo(nvObj_t *nv) { text_print(nv, fmt_spmo);} // TYPE_INT
void sp_print_spep(nvObj_t *nv) { text_print(nv, fmt_spep);} // TYPE_INT
void sp_print_spdp(nvObj_t *nv) { text_print(nv, fmt_spdp);} // TYPE_INT
void sp_print_spph(nvObj_t *nv) { text_print(nv, fmt_spph);} // TYPE_INT
void sp_print_spdw(nvObj_t *nv) { text_print(nv, fmt_spdw);} // TYPE_FLOAT
void sp_print_spde(nvObj_t *nv) { text_print(nv, fmt_spde);} // TYPE_FLOAT
void sp_print_spsn(nvObj_t *nv) { text_print(nv, fmt_spsn);} // TYPE_FLOAT
void sp_print_spsm(nvObj_t *nv) { text_print(nv, fmt_spsm);} // TYPE_FLOAT
void sp_print_ssoe(nvObj_t *nv) { text_print(nv, fmt_ssoe);} // TYPE INT
void sp_print_sso(nvObj_t *nv) { text_print(nv, fmt_sso);} // TYPE FLOAT
void sp_print_spe(nvObj_t *nv) { text_print(nv, fmt_spe);} // TYPE_INT
void sp_print_spd(nvObj_t *nv) { text_print(nv, fmt_spd);} // TYPE_INT
void sp_print_sps(nvObj_t *nv) { text_print(nv, fmt_sps);} // TYPE_FLOAT
void sp_print_spoe(nvObj_t *nv) { text_print(nv, fmt_spoe);} // TYPE INT
void sp_print_spo(nvObj_t *nv) { text_print(nv, fmt_spo);} // TYPE FLOAT
#endif // __TEXT_MODE
+44 -58
View File
@@ -28,6 +28,12 @@
#ifndef SPINDLE_H_ONCE
#define SPINDLE_H_ONCE
#define SPINDLE_OVERRIDE_ENABLE false
#define SPINDLE_OVERRIDE_FACTOR 1.00
#define SPINDLE_OVERRIDE_MIN 0.05 // 5%
#define SPINDLE_OVERRIDE_MAX 2.00 // 200%
#define SPINDLE_OVERRIDE_RAMP_TIME 1 // change sped in seconds
typedef enum {
SPINDLE_DISABLED = 0, // spindle will not operate
SPINDLE_PLAN_TO_STOP, // spindle operating, plans to stop
@@ -35,22 +41,19 @@ typedef enum {
} spMode;
#define SPINDLE_MODE_MAX SPINDLE_CONTINUOUS
// spState is used for multiple purposes:
// - request the spindle operation (OFF, CW, CCW)
// - request PAUSE and RESUME
// spControl is used for multiple purposes:
// - request a spindle operation (OFF, CW, CCW, PAUSE, RESUME)
// - run the spindle state machine for spindle wait states
// - store current direction (1=CW, 2=CCW) in spindle.direction
// - CW and CCW values are stored as current direction in spindle.direction
typedef enum { // how spindle controls are presented by the Gcode parser
SPINDLE_OFF = 0, // M5
SPINDLE_CW = 1, // M3 and store CW to spindle.direction
SPINDLE_CCW = 2, // M4 and store CCW to spsindle.direction
SPINDLE_PAUSE, // request PAUSE and store PAUSED state to spindle.state
SPINDLE_RESUME, // request RESUME and revert spindle.state to CW, CCW
SPINDLE_WAIT // handle transient WAIT states
} spState;
// SPINDLE_ON is either of SPINDLE_CW or SPINDLE_CCW
//#define SPINDLE_ON(s) ((s == SPINDLE_CW) || (s == SPINDLE__CCW))
SPINDLE_WAIT // handle transient WAIT states (not an action state)
} spControl;
#define SPINDLE_ACTION_MAX SPINDLE_RESUME
// *** NOTE: The spindle polarity active hi/low values currently agree with ioMode in gpio.h
// These will all need to be changed to ACTIVE_HIGH = 0, ACTIVE_LOW = 1
@@ -61,15 +64,6 @@ typedef enum { // Note: These values agree with
SPINDLE_ACTIVE_HIGH = 1, // Will set output to 1 to enable the spindle or CW direction
} spPolarity;
/*
typedef enum { // basic spindle state machine. Do not change this enum
SPINDLE_OFF = 0,
SPINDLE_ON = 1, // spindle on and at speed
SPINDLE_PAUSE = 2, // meaning it was on and now it's off
SPINDLE_WAITING = 3 // spindle not at speed yet
} spState;
*/
typedef enum { // electronic speed controller for some spindles
ESC_ONLINE = 0,
ESC_OFFLINE,
@@ -78,33 +72,29 @@ typedef enum { // electronic speed controller for some spindles
ESC_LOCKOUT_AND_REBOOTING,
} ESCState;
#define SPINDLE_OVERRIDE_ENABLE false
#define SPINDLE_OVERRIDE_FACTOR 1.00
#define SPINDLE_OVERRIDE_MIN 0.05 // 5%
#define SPINDLE_OVERRIDE_MAX 2.00 // 200%
#define SPINDLE_OVERRIDE_RAMP_TIME 1 // change sped in seconds
/*
* Spindle control structure
*/
typedef struct spSpindle {
spMode mode; // spindle operating mode
spState state; // OFF, ON, PAUSE, RESUME, WAIT
spState direction; // 1=CW, 2=CCW (subset of above state)
spMode mode; // {spm:} spindle operating mode
spControl state; // {spc:} OFF, ON, PAUSE, RESUME, WAIT
spControl direction; // 1=CW, 2=CCW (subset of above state)
float speed; // S in RPM
float speed_min; // minimum settable spindle speed
float speed_max; // maximum settable spindle speed
float speed; // {sps:} S in RPM
float speed_min; // {spsn:} minimum settable spindle speed
float speed_max; // {spsm:} maximum settable spindle speed
spPolarity enable_polarity; // 0=active low, 1=active high
spPolarity dir_polarity; // 0=clockwise low, 1=clockwise high
float dwell_seconds; // dwell on spindle resume
bool pause_on_hold; // pause on feedhold
spPolarity enable_polarity; // {spep:} 0=active low, 1=active high
spPolarity dir_polarity; // {spdp:} 0=clockwise low, 1=clockwise high
bool pause_on_hold; // {spph:} pause on feedhold
float spinup_delay; // {spde:} optional delay on spindle start (set to 0 to disable)
float spindown_delay; // {spds:} optional delay on spindle stop (set to 0 to disable)
float reversal_delay; // {spdr:} optional delay on direction reversal (set to 0 to disable)
bool sso_enable; // TRUE = spindle speed override enabled (see also m48_enable in canonical machine)
float sso_factor; // 1.0000 x S spindle speed. Go up or down from there
bool override_enable; // {spoe:} TRUE = spindle speed override enabled (see also m48_enable in canonical machine)
float override_factor; // {spo:} 1.0000 x S spindle speed. Go up or down from there
// Spindle speed controller variables
ESCState esc_state; // state management for ESC controller
@@ -121,8 +111,8 @@ extern spSpindle_t spindle;
void spindle_init();
void spindle_reset();
stat_t spindle_control_immediate(spState control);
stat_t spindle_control_sync(spState control);
stat_t spindle_control_immediate(spControl control);
stat_t spindle_control_sync(spControl control);
stat_t spindle_speed_immediate(float speed); // S parameter
stat_t spindle_speed_sync(float speed); // S parameter
@@ -143,24 +133,22 @@ stat_t sp_set_spdp(nvObj_t *nv);
stat_t sp_get_spph(nvObj_t *nv);
stat_t sp_set_spph(nvObj_t *nv);
stat_t sp_get_spdw(nvObj_t *nv);
stat_t sp_set_spdw(nvObj_t *nv);
stat_t sp_get_spde(nvObj_t *nv);
stat_t sp_set_spde(nvObj_t *nv);
stat_t sp_get_spsn(nvObj_t *nv);
stat_t sp_set_spsn(nvObj_t *nv);
stat_t sp_get_spsm(nvObj_t *nv);
stat_t sp_set_spsm(nvObj_t *nv);
stat_t sp_get_ssoe(nvObj_t* nv);
stat_t sp_set_ssoe(nvObj_t* nv);
stat_t sp_get_sso(nvObj_t* nv);
stat_t sp_set_sso(nvObj_t* nv);
stat_t sp_get_spoe(nvObj_t* nv);
stat_t sp_set_spoe(nvObj_t* nv);
stat_t sp_get_spo(nvObj_t* nv);
stat_t sp_set_spo(nvObj_t* nv);
stat_t sp_get_spc(nvObj_t* nv);
stat_t sp_set_spc(nvObj_t* nv);
stat_t sp_get_sps(nvObj_t* nv);
stat_t sp_set_sps(nvObj_t* nv);
stat_t sp_get_spe(nvObj_t* nv);
stat_t sp_set_spe(nvObj_t* nv);
stat_t sp_get_spd(nvObj_t* nv);
stat_t sp_set_spd(nvObj_t* nv);
/*--- text_mode support functions ---*/
@@ -170,14 +158,13 @@ stat_t sp_set_spd(nvObj_t* nv);
void sp_print_spep(nvObj_t* nv);
void sp_print_spdp(nvObj_t* nv);
void sp_print_spph(nvObj_t* nv);
void sp_print_spdw(nvObj_t* nv);
void sp_print_spde(nvObj_t* nv);
void sp_print_spsn(nvObj_t* nv);
void sp_print_spsm(nvObj_t* nv);
void sp_print_ssoe(nvObj_t* nv);
void sp_print_sso(nvObj_t* nv);
void sp_print_spoe(nvObj_t* nv);
void sp_print_spo(nvObj_t* nv);
void sp_print_spc(nvObj_t* nv);
void sp_print_sps(nvObj_t* nv);
void sp_print_spe(nvObj_t* nv);
void sp_print_spd(nvObj_t* nv);
#else
@@ -185,14 +172,13 @@ stat_t sp_set_spd(nvObj_t* nv);
#define sp_print_spep tx_print_stub
#define sp_print_spdp tx_print_stub
#define sp_print_spph tx_print_stub
#define sp_print_spdw tx_print_stub
#define sp_print_spde tx_print_stub
#define sp_print_spsn tx_print_stub
#define sp_print_spsm tx_print_stub
#define sp_print_ssoe tx_print_stub
#define sp_print_spe tx_print_stub
#define sp_print_spoe tx_print_stub
#define sp_print_spo tx_print_stub
#define sp_print_spc tx_print_stub
#define sp_print_sps tx_print_stub
#define sp_print_sso tx_print_stub
#define sp_print_spd tx_print_stub
#endif // __TEXT_MODE