⚡️ Apply PTC on all probing (#23764)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
This commit is contained in:
parent
56cec9690a
commit
7ec2167a73
|
@ -28,6 +28,7 @@
|
||||||
|
|
||||||
#include "probe_temp_comp.h"
|
#include "probe_temp_comp.h"
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
#include "../module/temperature.h"
|
||||||
|
|
||||||
ProbeTempComp ptc;
|
ProbeTempComp ptc;
|
||||||
|
|
||||||
|
@ -62,6 +63,7 @@ constexpr temp_calib_t ProbeTempComp::cali_info[TSI_COUNT];
|
||||||
|
|
||||||
uint8_t ProbeTempComp::calib_idx; // = 0
|
uint8_t ProbeTempComp::calib_idx; // = 0
|
||||||
float ProbeTempComp::init_measurement; // = 0.0
|
float ProbeTempComp::init_measurement; // = 0.0
|
||||||
|
bool ProbeTempComp::enabled = true;
|
||||||
|
|
||||||
void ProbeTempComp::reset() {
|
void ProbeTempComp::reset() {
|
||||||
TERN_(PTC_PROBE, LOOP_L_N(i, PTC_PROBE_COUNT) z_offsets_probe[i] = z_offsets_probe_default[i]);
|
TERN_(PTC_PROBE, LOOP_L_N(i, PTC_PROBE_COUNT) z_offsets_probe[i] = z_offsets_probe_default[i]);
|
||||||
|
@ -169,6 +171,13 @@ bool ProbeTempComp::finish_calibration(const TempSensorID tsi) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ProbeTempComp::apply_compensation(float &meas_z) {
|
||||||
|
if (!enabled) return;
|
||||||
|
TERN_(PTC_BED, compensate_measurement(TSI_BED, thermalManager.degBed(), meas_z));
|
||||||
|
TERN_(PTC_PROBE, compensate_measurement(TSI_PROBE, thermalManager.degProbe(), meas_z));
|
||||||
|
TERN_(PTC_HOTEND, compensate_measurement(TSI_EXT, thermalManager.degHotend(0), meas_z));
|
||||||
|
}
|
||||||
|
|
||||||
void ProbeTempComp::compensate_measurement(const TempSensorID tsi, const celsius_t temp, float &meas_z) {
|
void ProbeTempComp::compensate_measurement(const TempSensorID tsi, const celsius_t temp, float &meas_z) {
|
||||||
const uint8_t measurements = cali_info[tsi].measurements;
|
const uint8_t measurements = cali_info[tsi].measurements;
|
||||||
const celsius_t start_temp = cali_info[tsi].start_temp,
|
const celsius_t start_temp = cali_info[tsi].start_temp,
|
||||||
|
|
|
@ -77,7 +77,6 @@ class ProbeTempComp {
|
||||||
static void reset_index() { calib_idx = 0; };
|
static void reset_index() { calib_idx = 0; };
|
||||||
static uint8_t get_index() { return calib_idx; }
|
static uint8_t get_index() { return calib_idx; }
|
||||||
static void reset();
|
static void reset();
|
||||||
static void clear_offsets(const TempSensorID tsi);
|
|
||||||
static void clear_all_offsets() {
|
static void clear_all_offsets() {
|
||||||
TERN_(PTC_PROBE, clear_offsets(TSI_PROBE));
|
TERN_(PTC_PROBE, clear_offsets(TSI_PROBE));
|
||||||
TERN_(PTC_BED, clear_offsets(TSI_BED));
|
TERN_(PTC_BED, clear_offsets(TSI_BED));
|
||||||
|
@ -88,10 +87,16 @@ class ProbeTempComp {
|
||||||
static void prepare_new_calibration(const_float_t init_meas_z);
|
static void prepare_new_calibration(const_float_t init_meas_z);
|
||||||
static void push_back_new_measurement(const TempSensorID tsi, const_float_t meas_z);
|
static void push_back_new_measurement(const TempSensorID tsi, const_float_t meas_z);
|
||||||
static bool finish_calibration(const TempSensorID tsi);
|
static bool finish_calibration(const TempSensorID tsi);
|
||||||
static void compensate_measurement(const TempSensorID tsi, const celsius_t temp, float &meas_z);
|
static void set_enabled(const bool ena) { enabled = ena; }
|
||||||
|
|
||||||
|
// Apply all temperature compensation adjustments
|
||||||
|
static void apply_compensation(float &meas_z);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static uint8_t calib_idx;
|
static uint8_t calib_idx;
|
||||||
|
static bool enabled;
|
||||||
|
|
||||||
|
static void clear_offsets(const TempSensorID tsi);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Base value. Temperature compensation values will be deltas
|
* Base value. Temperature compensation values will be deltas
|
||||||
|
@ -104,6 +109,8 @@ class ProbeTempComp {
|
||||||
* to allow generating values of higher temperatures.
|
* to allow generating values of higher temperatures.
|
||||||
*/
|
*/
|
||||||
static bool linear_regression(const TempSensorID tsi, float &k, float &d);
|
static bool linear_regression(const TempSensorID tsi, float &k, float &d);
|
||||||
|
|
||||||
|
static void compensate_measurement(const TempSensorID tsi, const celsius_t temp, float &meas_z);
|
||||||
};
|
};
|
||||||
|
|
||||||
extern ProbeTempComp ptc;
|
extern ProbeTempComp ptc;
|
||||||
|
|
|
@ -36,11 +36,6 @@
|
||||||
#include "../../../module/probe.h"
|
#include "../../../module/probe.h"
|
||||||
#include "../../queue.h"
|
#include "../../queue.h"
|
||||||
|
|
||||||
#if HAS_PTC
|
|
||||||
#include "../../../feature/probe_temp_comp.h"
|
|
||||||
#include "../../../module/temperature.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if HAS_STATUS_MESSAGE
|
#if HAS_STATUS_MESSAGE
|
||||||
#include "../../../lcd/marlinui.h"
|
#include "../../../lcd/marlinui.h"
|
||||||
#endif
|
#endif
|
||||||
|
@ -658,10 +653,6 @@ G29_TYPE GcodeSuite::G29() {
|
||||||
break; // Breaks out of both loops
|
break; // Breaks out of both loops
|
||||||
}
|
}
|
||||||
|
|
||||||
TERN_(PTC_BED, ptc.compensate_measurement(TSI_BED, thermalManager.degBed(), abl.measured_z));
|
|
||||||
TERN_(PTC_PROBE, ptc.compensate_measurement(TSI_PROBE, thermalManager.degProbe(), abl.measured_z));
|
|
||||||
TERN_(PTC_HOTEND, ptc.compensate_measurement(TSI_EXT, thermalManager.degHotend(0), abl.measured_z));
|
|
||||||
|
|
||||||
#if ENABLED(AUTO_BED_LEVELING_LINEAR)
|
#if ENABLED(AUTO_BED_LEVELING_LINEAR)
|
||||||
|
|
||||||
abl.mean += abl.measured_z;
|
abl.mean += abl.measured_z;
|
||||||
|
|
|
@ -109,7 +109,9 @@ static void say_failed_to_calibrate() { SERIAL_ECHOPGM("!Failed to calibra
|
||||||
|
|
||||||
auto g76_probe = [](const TempSensorID sid, celsius_t &targ, const xy_pos_t &nozpos) {
|
auto g76_probe = [](const TempSensorID sid, celsius_t &targ, const xy_pos_t &nozpos) {
|
||||||
do_z_clearance(5.0); // Raise nozzle before probing
|
do_z_clearance(5.0); // Raise nozzle before probing
|
||||||
|
ptc.set_enabled(false);
|
||||||
const float measured_z = probe.probe_at_point(nozpos, PROBE_PT_STOW, 0, false); // verbose=0, probe_relative=false
|
const float measured_z = probe.probe_at_point(nozpos, PROBE_PT_STOW, 0, false); // verbose=0, probe_relative=false
|
||||||
|
ptc.set_enabled(true);
|
||||||
if (isnan(measured_z))
|
if (isnan(measured_z))
|
||||||
SERIAL_ECHOLNPGM("!Received NAN. Aborting.");
|
SERIAL_ECHOLNPGM("!Received NAN. Aborting.");
|
||||||
else {
|
else {
|
||||||
|
|
|
@ -35,11 +35,15 @@
|
||||||
#include "../../module/planner.h"
|
#include "../../module/planner.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if HAS_PTC
|
||||||
|
#include "../../feature/probe_temp_comp.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* M48: Z probe repeatability measurement function.
|
* M48: Z probe repeatability measurement function.
|
||||||
*
|
*
|
||||||
* Usage:
|
* Usage:
|
||||||
* M48 <P#> <X#> <Y#> <V#> <E> <L#> <S>
|
* M48 <P#> <X#> <Y#> <V#> <E> <L#> <S> <C#>
|
||||||
* P = Number of sampled points (4-50, default 10)
|
* P = Number of sampled points (4-50, default 10)
|
||||||
* X = Sample X position
|
* X = Sample X position
|
||||||
* Y = Sample Y position
|
* Y = Sample Y position
|
||||||
|
@ -47,6 +51,7 @@
|
||||||
* E = Engage Z probe for each reading
|
* E = Engage Z probe for each reading
|
||||||
* L = Number of legs of movement before probe
|
* L = Number of legs of movement before probe
|
||||||
* S = Schizoid (Or Star if you prefer)
|
* S = Schizoid (Or Star if you prefer)
|
||||||
|
* C = Enable probe temperature compensation (0 or 1, default 1)
|
||||||
*
|
*
|
||||||
* This function requires the machine to be homed before invocation.
|
* This function requires the machine to be homed before invocation.
|
||||||
*/
|
*/
|
||||||
|
@ -107,6 +112,8 @@ void GcodeSuite::M48() {
|
||||||
set_bed_leveling_enabled(false);
|
set_bed_leveling_enabled(false);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
TERN_(HAS_PTC, ptc.set_enabled(!parser.seen('C') || parser.value_bool()));
|
||||||
|
|
||||||
// Work with reasonable feedrates
|
// Work with reasonable feedrates
|
||||||
remember_feedrate_scaling_off();
|
remember_feedrate_scaling_off();
|
||||||
|
|
||||||
|
@ -269,6 +276,9 @@ void GcodeSuite::M48() {
|
||||||
// Re-enable bed level correction if it had been on
|
// Re-enable bed level correction if it had been on
|
||||||
TERN_(HAS_LEVELING, set_bed_leveling_enabled(was_enabled));
|
TERN_(HAS_LEVELING, set_bed_leveling_enabled(was_enabled));
|
||||||
|
|
||||||
|
// Re-enable probe temperature correction
|
||||||
|
TERN_(HAS_PTC, ptc.set_enabled(true));
|
||||||
|
|
||||||
report_current_position();
|
report_current_position();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -29,6 +29,10 @@
|
||||||
#include "../../module/probe.h"
|
#include "../../module/probe.h"
|
||||||
#include "../../feature/bedlevel/bedlevel.h"
|
#include "../../feature/bedlevel/bedlevel.h"
|
||||||
|
|
||||||
|
#if HAS_PTC
|
||||||
|
#include "../../feature/probe_temp_comp.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* G30: Do a single Z probe at the current XY
|
* G30: Do a single Z probe at the current XY
|
||||||
*
|
*
|
||||||
|
@ -37,6 +41,7 @@
|
||||||
* X Probe X position (default current X)
|
* X Probe X position (default current X)
|
||||||
* Y Probe Y position (default current Y)
|
* Y Probe Y position (default current Y)
|
||||||
* E Engage the probe for each probe (default 1)
|
* E Engage the probe for each probe (default 1)
|
||||||
|
* C Enable probe temperature compensation (0 or 1, default 1)
|
||||||
*/
|
*/
|
||||||
void GcodeSuite::G30() {
|
void GcodeSuite::G30() {
|
||||||
|
|
||||||
|
@ -51,7 +56,10 @@ void GcodeSuite::G30() {
|
||||||
remember_feedrate_scaling_off();
|
remember_feedrate_scaling_off();
|
||||||
|
|
||||||
const ProbePtRaise raise_after = parser.boolval('E', true) ? PROBE_PT_STOW : PROBE_PT_NONE;
|
const ProbePtRaise raise_after = parser.boolval('E', true) ? PROBE_PT_STOW : PROBE_PT_NONE;
|
||||||
|
|
||||||
|
TERN_(HAS_PTC, ptc.set_enabled(!parser.seen('C') || parser.value_bool()));
|
||||||
const float measured_z = probe.probe_at_point(pos, raise_after, 1);
|
const float measured_z = probe.probe_at_point(pos, raise_after, 1);
|
||||||
|
TERN_(HAS_PTC, ptc.set_enabled(true));
|
||||||
if (!isnan(measured_z))
|
if (!isnan(measured_z))
|
||||||
SERIAL_ECHOLNPGM("Bed X: ", pos.x, " Y: ", pos.y, " Z: ", measured_z);
|
SERIAL_ECHOLNPGM("Bed X: ", pos.x, " Y: ", pos.y, " Z: ", measured_z);
|
||||||
|
|
||||||
|
|
|
@ -62,7 +62,7 @@ void probe_offset_wizard_menu() {
|
||||||
if (LCD_HEIGHT >= 4)
|
if (LCD_HEIGHT >= 4)
|
||||||
STATIC_ITEM(MSG_MOVE_NOZZLE_TO_BED, SS_CENTER|SS_INVERT);
|
STATIC_ITEM(MSG_MOVE_NOZZLE_TO_BED, SS_CENTER|SS_INVERT);
|
||||||
|
|
||||||
STATIC_ITEM_P(PSTR("Z="), SS_CENTER, ftostr42_52(current_position.z));
|
STATIC_ITEM_P(PSTR("Z"), SS_CENTER, ftostr42_52(current_position.z));
|
||||||
STATIC_ITEM(MSG_ZPROBE_ZOFFSET, SS_LEFT, ftostr42_52(calculated_z_offset));
|
STATIC_ITEM(MSG_ZPROBE_ZOFFSET, SS_LEFT, ftostr42_52(calculated_z_offset));
|
||||||
|
|
||||||
SUBMENU(MSG_MOVE_1MM, []{ _goto_manual_move_z( 1); });
|
SUBMENU(MSG_MOVE_1MM, []{ _goto_manual_move_z( 1); });
|
||||||
|
|
|
@ -77,6 +77,10 @@
|
||||||
#include "servo.h"
|
#include "servo.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if HAS_PTC
|
||||||
|
#include "../feature/probe_temp_comp.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#if ENABLED(EXTENSIBLE_UI)
|
#if ENABLED(EXTENSIBLE_UI)
|
||||||
#include "../lcd/extui/ui_api.h"
|
#include "../lcd/extui/ui_api.h"
|
||||||
#elif ENABLED(DWIN_CREALITY_LCD_ENHANCED)
|
#elif ENABLED(DWIN_CREALITY_LCD_ENHANCED)
|
||||||
|
@ -801,7 +805,10 @@ float Probe::probe_at_point(const_float_t rx, const_float_t ry, const ProbePtRai
|
||||||
do_blocking_move_to(npos, feedRate_t(XY_PROBE_FEEDRATE_MM_S));
|
do_blocking_move_to(npos, feedRate_t(XY_PROBE_FEEDRATE_MM_S));
|
||||||
|
|
||||||
float measured_z = NAN;
|
float measured_z = NAN;
|
||||||
if (!deploy()) measured_z = run_z_probe(sanity_check) + offset.z;
|
if (!deploy()) {
|
||||||
|
measured_z = run_z_probe(sanity_check) + offset.z;
|
||||||
|
TERN_(HAS_PTC, ptc.apply_compensation(measured_z));
|
||||||
|
}
|
||||||
if (!isnan(measured_z)) {
|
if (!isnan(measured_z)) {
|
||||||
const bool big_raise = raise_after == PROBE_PT_BIG_RAISE;
|
const bool big_raise = raise_after == PROBE_PT_BIG_RAISE;
|
||||||
if (big_raise || raise_after == PROBE_PT_RAISE)
|
if (big_raise || raise_after == PROBE_PT_RAISE)
|
||||||
|
|
Loading…
Reference in a new issue