Some internal changes to allow homing feed rate overrides from plugins, reserved setting numbers for per axis homing feedrate settings (not used by the core).

This commit is contained in:
Terje Io
2023-01-28 10:45:14 +01:00
parent dbc170a571
commit 4e7f313271
9 changed files with 66 additions and 25 deletions
+2 -2
View File
@@ -13,7 +13,7 @@ It has been written to complement grblHAL and has features such as proper keyboa
---
Latest build date is 20230126, see the [changelog](changelog.md) for details.
Latest build date is 20230128, see the [changelog](changelog.md) for details.
__NOTE:__ A settings reset will be performed on an update of builds earlier than 20230125. Backup and restore of settings is recommended.
__IMPORTANT!__ A new setting has been introduced for ganged axes motors in build 20211121.
I have only bench tested this for a couple of drivers, correct function should be verified after updating by those who have more than three motors configured.
@@ -87,4 +87,4 @@ List of Supported G-Codes:
Some [plugins](https://github.com/grblHAL/plugins) implements additional M-codes.
---
2023-01-26
2023-01-28
+19
View File
@@ -1,5 +1,24 @@
## grblHAL changelog
<a name="20230128"/>Build 20230128
Core:
* Some internal changes to allow homing feed rate override from plugins, reserved setting numbers for per axis homing feedrate settings \(not used by the core\).
Motors plugin:
* Fix for issue [#9](https://github.com/grblHAL/Plugins_motor/issues/9), added settings for per axis homing feed rates.
__NOTE:__ Per axis homing feedrates will only be used for Trinamic driven axes with sensorless homing enabled, others will still use feedrates as set by the `$24` and `$25` settings.
__NOTE:__ If more than one axis is homed in a cycle and the homing feedrates differ the cycle will be skipped.
__NOTE:__ Per axis feedrates is currently for experimental use/testing - may be removed in a later build.
Trinamic plugin:
* Fix for issue [#41](https://github.com/grblHAL/RP2040/issues/41#issuecomment-1379449288), wrong PWM autoscale mode selected for sensorless homing.
---
<a name="20230126"/>Build 20230126
Core:
+2 -1
View File
@@ -32,6 +32,7 @@
#include "settings.h"
#include "report.h"
#include "planner.h"
#include "machine_limits.h"
typedef enum {
OverrideChanged_FeedRate = 0,
@@ -91,7 +92,7 @@ typedef void (*on_realtime_report_ptr)(stream_write_ptr stream_write, report_tra
typedef void (*on_unknown_feedback_message_ptr)(stream_write_ptr stream_write);
typedef void (*on_stream_changed_ptr)(stream_type_t type);
typedef bool (*on_laser_ppi_enable_ptr)(uint_fast16_t ppi, uint_fast16_t pulse_length);
typedef void (*on_homing_rate_set_ptr)(axes_signals_t axes, float rate, bool pulloff);
typedef void (*on_homing_rate_set_ptr)(axes_signals_t axes, float rate, homing_mode_t mode);
typedef void (*on_homing_completed_ptr)(void);
typedef bool (*on_probe_fixture_ptr)(tool_data_t *tool, bool at_g59_3, bool on);
typedef bool (*on_probe_start_ptr)(axes_signals_t axes, float *target, plan_line_data_t *pl_data);
+1 -1
View File
@@ -42,7 +42,7 @@
#else
#define GRBL_VERSION "1.1f"
#endif
#define GRBL_BUILD 20230126
#define GRBL_BUILD 20230128
#define GRBL_URL "https://github.com/grblHAL"
+3 -1
View File
@@ -173,12 +173,14 @@ typedef struct {
* Homing *
************/
typedef float (*homing_get_feedrate_ptr)(axes_signals_t axes, homing_mode_t mode);
//! Limit switches handler for homing cycle.
typedef struct {
limits_get_state_ptr get_state; //!< Handler for getting limit switches status. Usually set to the same function as _hal.limits.get_state_.
homing_get_feedrate_ptr get_feedrate;
} homing_ptrs_t;
/*****************************
* Control signal switches *
*****************************/
+27 -19
View File
@@ -221,6 +221,10 @@ static bool limits_pull_off (axes_signals_t axis, float distance)
return true; // Note: failure is returned above if move fails.
}
static float limits_get_homing_rate (axes_signals_t cycle, homing_mode_t mode)
{
return mode == HomingMode_Locate ? settings.homing.feed_rate : settings.homing.seek_rate;
}
// Homes the specified cycle axes, sets the machine position, and performs a pull-off motion after
// completing. Homing is a special motion case, which involves rapid uncontrolled stops to locate
@@ -233,15 +237,19 @@ static bool limits_homing_cycle (axes_signals_t cycle, axes_signals_t auto_squar
if (ABORTED) // Block if system reset has been issued.
return false;
if(hal.homing.get_feedrate == NULL)
hal.homing.get_feedrate = limits_get_homing_rate;
int32_t initial_trigger_position = 0, autosquare_fail_distance = 0;
uint_fast8_t n_cycle = (2 * settings.homing.locate_cycles + 1);
uint_fast8_t step_pin[N_AXIS], n_active_axis, dual_motor_axis = 0;
coord_data_t target;
float max_travel = 0.0f, homing_rate = settings.homing.seek_rate;
bool approach = true, autosquare_check = false;
bool autosquare_check = false;
float max_travel = 0.0f, homing_rate;
homing_mode_t mode = HomingMode_Seek;
axes_signals_t axislock, homing_state;
limit_signals_t limits_state;
squaring_mode_t squaring_mode = SquaringMode_Both;
coord_data_t target;
plan_line_data_t plan_data;
// Initialize plan data struct for homing motion.
@@ -281,6 +289,9 @@ static bool limits_homing_cycle (axes_signals_t cycle, axes_signals_t auto_squar
if(max_travel == 0.0f)
return true;
if((homing_rate = hal.homing.get_feedrate(cycle, HomingMode_Seek)) == 0.0f)
return false;
if(auto_square.mask) {
float fail_distance = (-settings.homing.dual_axis.fail_length_percent / 100.0f) * settings.axis[dual_motor_axis].max_travel;
fail_distance = min(fail_distance, settings.homing.dual_axis.fail_distance_max);
@@ -309,29 +320,28 @@ static bool limits_homing_cycle (axes_signals_t cycle, axes_signals_t auto_squar
#endif
// Set target direction based on cycle mask and homing cycle approach state.
if (bit_istrue(settings.homing.dir_mask.value, bit(idx)))
target.values[idx] = approach ? - max_travel : max_travel;
target.values[idx] = mode == HomingMode_Pulloff ? max_travel : - max_travel;
else
target.values[idx] = approach ? max_travel : - max_travel;
target.values[idx] = mode == HomingMode_Pulloff ? - max_travel : max_travel;
// Apply axislock to the step port pins active in this cycle.
axislock.mask |= step_pin[idx];
}
} while(idx);
sys.homing_axis_lock.mask = axislock.mask;
#ifdef KINEMATICS_API
if(kinematics.homing_cycle_get_feedrate)
homing_rate = kinematics.homing_cycle_get_feedrate(homing_rate, cycle);
#endif
if(grbl.on_homing_rate_set)
grbl.on_homing_rate_set(cycle, homing_rate, !approach);
grbl.on_homing_rate_set(cycle, homing_rate, mode);
homing_rate *= sqrtf(n_active_axis); // [sqrt(N_AXIS)] Adjust so individual axes all move at homing rate.
// Perform homing cycle. Planner buffer should be empty, as required to initiate the homing cycle.
plan_data.feed_rate = homing_rate; // Set current homing rate.
sys.homing_axis_lock.mask = axislock.mask;
#ifdef KINEMATICS_API
coord_data_t k_target;
@@ -347,7 +357,7 @@ static bool limits_homing_cycle (axes_signals_t cycle, axes_signals_t auto_squar
do {
if (approach) {
if (mode != HomingMode_Pulloff) {
// Check homing switches state. Lock out cycle axes when they change.
homing_state = homing_signals_select(limits_state = hal.homing.get_state(), auto_square, squaring_mode);
@@ -386,7 +396,7 @@ static bool limits_homing_cycle (axes_signals_t cycle, axes_signals_t auto_squar
}
}
st_prep_buffer(); // Check and prep segment buffer. NOTE: Should take no longer than 200us.
st_prep_buffer(); // Check and prep segment buffer.
// Exit routines: No time to run protocol_execute_realtime() in this loop.
if (sys.rt_exec_state & (EXEC_SAFETY_DOOR | EXEC_RESET | EXEC_CYCLE_COMPLETE)) {
@@ -402,11 +412,11 @@ static bool limits_homing_cycle (axes_signals_t cycle, axes_signals_t auto_squar
system_set_exec_alarm(Alarm_HomingFailDoor);
// Homing failure condition: Homing switch(es) still engaged after pull-off motion
if (!approach && (homing_signals_select(hal.homing.get_state(), (axes_signals_t){0}, SquaringMode_Both).mask & cycle.mask))
if (mode == HomingMode_Pulloff && (homing_signals_select(hal.homing.get_state(), (axes_signals_t){0}, SquaringMode_Both).mask & cycle.mask))
system_set_exec_alarm(Alarm_FailPulloff);
// Homing failure condition: Limit switch not found during approach.
if (approach && (rt_exec & EXEC_CYCLE_COMPLETE))
if (mode != HomingMode_Pulloff && (rt_exec & EXEC_CYCLE_COMPLETE))
system_set_exec_alarm(Alarm_HomingFailApproach);
if (sys.rt_exec_alarm) {
@@ -427,20 +437,18 @@ static bool limits_homing_cycle (axes_signals_t cycle, axes_signals_t auto_squar
st_reset(); // Immediately force kill steppers and reset step segment buffer.
hal.delay_ms(settings.homing.debounce_delay, NULL); // Delay to allow transient dynamics to dissipate.
// Reverse direction and reset homing rate for locate cycle(s).
approach = !approach;
// Reverse direction and reset homing rate for cycle(s).
mode = mode == HomingMode_Pulloff ? HomingMode_Locate : HomingMode_Pulloff;
homing_rate = hal.homing.get_feedrate(cycle, mode);
// After first cycle, homing enters locating phase. Shorten search to pull-off distance.
if (approach) {
if (mode == HomingMode_Locate) {
// Only one initial pass for auto squared axis when both motors are active
//if(mode == SquaringMode_Both && auto_square.mask)
// cycle.mask &= ~auto_square.mask;
max_travel = settings.homing.pulloff * HOMING_AXIS_LOCATE_SCALAR;
homing_rate = settings.homing.feed_rate;
} else {
} else
max_travel = settings.homing.pulloff;
homing_rate = settings.homing.seek_rate;
}
if(auto_square.mask) {
autosquare_check = false;
+7
View File
@@ -26,6 +26,13 @@
#include "nuts_bolts.h"
typedef enum
{
HomingMode_Seek = 0,
HomingMode_Locate,
HomingMode_Pulloff
} homing_mode_t;
// Perform one portion of the homing cycle based on the input settings.
status_code_t limits_go_home (axes_signals_t cycle);
+2
View File
@@ -2118,6 +2118,8 @@ bool settings_iterator (const setting_detail_t *setting, setting_output_ptr call
case Setting_AxisMicroSteps:
case Setting_AxisBacklash:
case Setting_AxisAutoSquareOffset:
case Setting_AxisHomingFeedRate:
case Setting_AxisHomingSeekRate:
case Setting_AxisExtended0:
case Setting_AxisExtended1:
case Setting_AxisExtended2:
+3 -1
View File
@@ -155,7 +155,7 @@ typedef enum {
// Reserving settings in the range 100 - 299 for axis settings.
Setting_AxisSettingsBase = 100, // Reserved for core settings
Setting_AxisSettingsMax = Setting_AxisSettingsBase + AXIS_SETTINGS_INCREMENT * 7 + N_AXIS,
Setting_AxisSettingsMax = Setting_AxisSettingsBase + AXIS_SETTINGS_INCREMENT * 9 + N_AXIS,
Setting_AxisSettingsBase2 = 200, // Reserved for driver/plugin settings
Setting_AxisSettingsMax2 = Setting_AxisSettingsBase2 + AXIS_SETTINGS_INCREMENT * 9 + N_AXIS,
//
@@ -338,6 +338,8 @@ typedef enum {
Setting_AxisMicroSteps = Setting_AxisSettingsBase + 5 * AXIS_SETTINGS_INCREMENT,
Setting_AxisBacklash = Setting_AxisSettingsBase + 6 * AXIS_SETTINGS_INCREMENT,
Setting_AxisAutoSquareOffset = Setting_AxisSettingsBase + 7 * AXIS_SETTINGS_INCREMENT,
Setting_AxisHomingFeedRate = Setting_AxisSettingsBase + 8 * AXIS_SETTINGS_INCREMENT,
Setting_AxisHomingSeekRate = Setting_AxisSettingsBase + 9 * AXIS_SETTINGS_INCREMENT,
// Calculated base values for driver/plugin stepper settings
Setting_AxisExtended0 = Setting_AxisSettingsBase2,