Storing status for pinda probe calibration
This commit is contained in:
parent
d31d73c565
commit
7b4c79b4d0
8 changed files with 99 additions and 92 deletions
|
@ -700,17 +700,20 @@ const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of
|
|||
// (unsigned char*)EEPROM_CALIBRATION_STATUS
|
||||
enum CalibrationStatus
|
||||
{
|
||||
// Freshly assembled, needs to peform a self-test and the XYZ calibration.
|
||||
CALIBRATION_STATUS_ASSEMBLED = 255,
|
||||
// Freshly assembled, needs to peform a self-test and the XYZ calibration.
|
||||
CALIBRATION_STATUS_ASSEMBLED = 255,
|
||||
|
||||
// For the wizard: self test has been performed, now the XYZ calibration is needed.
|
||||
// CALIBRATION_STATUS_XYZ_CALIBRATION = 250,
|
||||
// For the wizard: self test has been performed, now the XYZ calibration is needed.
|
||||
// CALIBRATION_STATUS_XYZ_CALIBRATION = 250,
|
||||
|
||||
// For the wizard: factory assembled, needs to run Z calibration.
|
||||
CALIBRATION_STATUS_Z_CALIBRATION = 240,
|
||||
// For the wizard: factory assembled, needs to run Z calibration.
|
||||
CALIBRATION_STATUS_Z_CALIBRATION = 240,
|
||||
|
||||
// The XYZ calibration has been performed, now it remains to run the V2Calibration.gcode.
|
||||
CALIBRATION_STATUS_LIVE_ADJUST = 230,
|
||||
// The XYZ calibration has been performed, now it remains to run the V2Calibration.gcode.
|
||||
CALIBRATION_STATUS_LIVE_ADJUST = 230,
|
||||
|
||||
//V2 calibration has been run, now run PINDA probe temperature calibration
|
||||
CALIBRATION_STATUS_PINDA = 220,
|
||||
|
||||
// Calibrated, ready to print.
|
||||
CALIBRATION_STATUS_CALIBRATED = 1,
|
||||
|
|
|
@ -1162,6 +1162,9 @@ void setup()
|
|||
// Show the message.
|
||||
lcd_show_fullscreen_message_and_wait_P(MSG_BABYSTEP_Z_NOT_SET);
|
||||
lcd_update_enable(true);
|
||||
} else if (calibration_status() == CALIBRATION_STATUS_PINDA) {
|
||||
lcd_show_fullscreen_message_and_wait_P(MSG_PINDA_NOT_CALIBRATED);
|
||||
lcd_update_enable(true);
|
||||
} else if (calibration_status() == CALIBRATION_STATUS_Z_CALIBRATION) {
|
||||
// Show the message.
|
||||
lcd_show_fullscreen_message_and_wait_P(MSG_FOLLOW_CALIBRATION_FLOW);
|
||||
|
@ -2760,26 +2763,7 @@ void process_commands()
|
|||
*
|
||||
*/
|
||||
|
||||
case 73:
|
||||
{
|
||||
int i, read;
|
||||
for (i = 0; i < 5; i++) {
|
||||
EEPROM_read_B(EEPROM_PROBE_TEMP_SHIFT + i * 2, &read);
|
||||
MYSERIAL.print(read);
|
||||
SERIAL_ECHOLNPGM(" ");
|
||||
}
|
||||
}break;
|
||||
|
||||
case 74:
|
||||
{
|
||||
float result, temp;
|
||||
if (code_seen('X')) temp = code_value();
|
||||
result = temp_comp_interpolation(temp);
|
||||
MYSERIAL.print(result);
|
||||
|
||||
}break;
|
||||
|
||||
case 76: //PINDA probe temperature compensation
|
||||
case 76: //PINDA probe temperature calibration
|
||||
{
|
||||
setTargetBed(PINDA_MIN_T);
|
||||
float zero_z;
|
||||
|
@ -2854,17 +2838,12 @@ void process_commands()
|
|||
|
||||
|
||||
}
|
||||
calibration_status_store(CALIBRATION_STATUS_CALIBRATED);
|
||||
setTargetBed(0); //set bed target temperature back to 0
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
case 75:
|
||||
{
|
||||
temp_compensation_start();
|
||||
}
|
||||
break;
|
||||
|
||||
#ifdef DIS
|
||||
case 77:
|
||||
{
|
||||
|
@ -2914,6 +2893,7 @@ void process_commands()
|
|||
enquecommand_front_P((PSTR("G28 W0")));
|
||||
break;
|
||||
}
|
||||
temp_compensation_start();
|
||||
|
||||
// Save custom message state, set a new custom message state to display: Calibrating point 9.
|
||||
bool custom_message_old = custom_message;
|
||||
|
@ -3220,7 +3200,7 @@ void process_commands()
|
|||
* This G-code will be performed at the end of a calibration script.
|
||||
*/
|
||||
case 87:
|
||||
calibration_status_store(CALIBRATION_STATUS_CALIBRATED);
|
||||
calibration_status_store(CALIBRATION_STATUS_PINDA);
|
||||
break;
|
||||
|
||||
/**
|
||||
|
@ -6215,6 +6195,7 @@ void bed_analysis(float x_dimension, float y_dimension, int x_points_num, int y_
|
|||
card.closefile();
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
void temp_compensation_start() {
|
||||
current_position[X_AXIS] = PINDA_PREHEAT_X;
|
||||
|
@ -6236,92 +6217,89 @@ void temp_compensation_apply() {
|
|||
int z_shift = 0;
|
||||
float z_shift_mm;
|
||||
|
||||
if (target_temperature_bed % 10 == 0 && target_temperature_bed >= 50 && target_temperature_bed <= 100) {
|
||||
i_add = (target_temperature_bed - 60) / 10;
|
||||
EEPROM_read_B(EEPROM_PROBE_TEMP_SHIFT + i_add * 2, &z_shift);
|
||||
z_shift_mm = z_shift / axis_steps_per_unit[Z_AXIS];
|
||||
if (calibration_status() == CALIBRATION_STATUS_CALIBRATED) {
|
||||
if (target_temperature_bed % 10 == 0 && target_temperature_bed >= 50 && target_temperature_bed <= 100) {
|
||||
i_add = (target_temperature_bed - 60) / 10;
|
||||
EEPROM_read_B(EEPROM_PROBE_TEMP_SHIFT + i_add * 2, &z_shift);
|
||||
z_shift_mm = z_shift / axis_steps_per_unit[Z_AXIS];
|
||||
}
|
||||
else {
|
||||
//interpolation
|
||||
z_shift_mm = temp_comp_interpolation(target_temperature_bed) / axis_steps_per_unit[Z_AXIS];
|
||||
}
|
||||
SERIAL_PROTOCOLPGM("\n");
|
||||
SERIAL_PROTOCOLPGM("Z shift applied:");
|
||||
MYSERIAL.print(z_shift_mm);
|
||||
plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS] - z_shift_mm, current_position[E_AXIS], homing_feedrate[Z_AXIS] / 40, active_extruder);
|
||||
st_synchronize();
|
||||
plan_set_z_position(current_position[Z_AXIS]);
|
||||
}
|
||||
else {
|
||||
//interpolation
|
||||
z_shift_mm = temp_comp_interpolation(target_temperature_bed) / axis_steps_per_unit[Z_AXIS];
|
||||
//message that we have no temp compensation data
|
||||
}
|
||||
SERIAL_PROTOCOLPGM("\n");
|
||||
SERIAL_PROTOCOLPGM("Z shift applied:");
|
||||
MYSERIAL.print(z_shift_mm);
|
||||
plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS] - z_shift_mm, current_position[E_AXIS], homing_feedrate[Z_AXIS] / 40, active_extruder);
|
||||
st_synchronize();
|
||||
plan_set_z_position(current_position[Z_AXIS]);
|
||||
}
|
||||
|
||||
/*float temp_comp_interpolation(float temperature) {
|
||||
|
||||
}*/
|
||||
float temp_comp_interpolation(float inp_temperature) {
|
||||
|
||||
|
||||
|
||||
float temp_comp_interpolation(float temperature) {
|
||||
//cubic spline interpolation
|
||||
|
||||
int i;
|
||||
int shift[6];
|
||||
float shift_f[6];
|
||||
float temp_C[6];
|
||||
|
||||
shift[0] = 0; //shift for 50 C is 0
|
||||
|
||||
int n, j, k;
|
||||
int n, i, j, k;
|
||||
float h[10], a, b, c, d, sum, s[10] = { 0 }, x[10], F[10], f[10], p, m[10][10] = { 0 }, temp;
|
||||
int shift[10];
|
||||
int temp_C[10];
|
||||
|
||||
/*SERIAL_ECHOLNPGM("Reading shift data:");
|
||||
MYSERIAL.print(shift[i]);*/
|
||||
for (i = 0; i < 5; i++) {
|
||||
EEPROM_read_B(EEPROM_PROBE_TEMP_SHIFT + i * 2, &shift[i + 1]); //read shift in steps from EEPROM
|
||||
p = inp_temperature;
|
||||
n = 6; //number of measured points
|
||||
|
||||
//SERIAL_ECHOLNPGM(" ");
|
||||
//MYSERIAL.print(shift[i + 1]);
|
||||
shift[0] = 0;
|
||||
for (i = 0; i < n; i++) {
|
||||
//scanf_s("%f%f", &x[i], &f[i]);
|
||||
if (i>0) EEPROM_read_B(EEPROM_PROBE_TEMP_SHIFT + (i-1) * 2, &shift[i]); //read shift in steps from EEPROM
|
||||
temp_C[i] = 50 + i * 10; //temperature in C
|
||||
shift_f[i] = (float)shift[i];
|
||||
|
||||
|
||||
x[i] = (float)temp_C[i];
|
||||
f[i] = (float)shift[i];
|
||||
}
|
||||
|
||||
for (i = 5; i > 0; i--) {
|
||||
F[i] = (shift_f[i] - shift_f[i - 1]) / (temp_C[i] - temp_C[i - 1]);
|
||||
h[i - 1] = temp_C[i] - temp_C[i - 1];
|
||||
}
|
||||
|
||||
//*********** formation of h, s , f matrix *************
|
||||
for (i = 1; i<5; i++) {
|
||||
|
||||
for (i = n - 1; i>0; i--) {
|
||||
F[i] = (f[i] - f[i - 1]) / (x[i] - x[i - 1]);
|
||||
h[i - 1] = x[i] - x[i - 1];
|
||||
}
|
||||
//*********** formation of h, s , f matrix **************
|
||||
for (i = 1; i<n - 1; i++) {
|
||||
m[i][i] = 2 * (h[i - 1] + h[i]);
|
||||
if (i != 1) {
|
||||
m[i][i - 1] = h[i - 1];
|
||||
m[i - 1][i] = h[i - 1];
|
||||
}
|
||||
m[i][5] = 6 * (F[i + 1] - F[i]);
|
||||
m[i][n - 1] = 6 * (F[i + 1] - F[i]);
|
||||
}
|
||||
//*********** forward elimination **************
|
||||
for (i = 1; i<4; i++) {
|
||||
for (i = 1; i<n - 2; i++) {
|
||||
temp = (m[i + 1][i] / m[i][i]);
|
||||
for (j = 1; j <= 5; j++)
|
||||
for (j = 1; j <= n - 1; j++)
|
||||
m[i + 1][j] -= temp*m[i][j];
|
||||
}
|
||||
//*********** backward substitution *********
|
||||
for (i = 4; i>0; i--) {
|
||||
for (i = n - 2; i>0; i--) {
|
||||
sum = 0;
|
||||
for (j = i; j <= 4; j++)
|
||||
for (j = i; j <= n - 2; j++)
|
||||
sum += m[i][j] * s[j];
|
||||
s[i] = (m[i][n - 1] - sum) / m[i][i];
|
||||
}
|
||||
|
||||
for (i = 0; i<5; i++)
|
||||
if (temp_C[i] <= temperature&&temperature <= temp_C[i + 1]) {
|
||||
a = (s[i + 1] - s[i]) / (6 * h[i]);
|
||||
b = s[i] / 2;
|
||||
c = (shift[i + 1] - shift[i]) / h[i] - (2 * h[i] * s[i] + s[i + 1] * h[i]) / 6;
|
||||
d = shift[i];
|
||||
sum = a*pow((p - temp_C[i]), 3) + b*pow((p - temp_C[i]), 2) + c*(p - temp_C[i]) + d;
|
||||
}
|
||||
return(sum);
|
||||
for (i = 0; i<n - 1; i++)
|
||||
if (x[i] <= p&&p <= x[i + 1]) {
|
||||
a = (s[i + 1] - s[i]) / (6 * h[i]);
|
||||
b = s[i] / 2;
|
||||
c = (f[i + 1] - f[i]) / h[i] - (2 * h[i] * s[i] + s[i + 1] * h[i]) / 6;
|
||||
d = f[i];
|
||||
sum = a*pow((p - x[i]), 3) + b*pow((p - x[i]), 2) + c*(p - x[i]) + d;
|
||||
}
|
||||
|
||||
return sum;
|
||||
|
||||
}
|
||||
|
||||
|
||||
#endif
|
|
@ -494,6 +494,11 @@ const char * const MSG_CALIBRATE_E_LANG_TABLE[LANG_NUM] PROGMEM = {
|
|||
MSG_CALIBRATE_E_DE
|
||||
};
|
||||
|
||||
const char MSG_CALIBRATE_PINDA_EN[] PROGMEM = "Calibrate PINDA";
|
||||
const char * const MSG_CALIBRATE_PINDA_LANG_TABLE[1] PROGMEM = {
|
||||
MSG_CALIBRATE_PINDA_EN
|
||||
};
|
||||
|
||||
const char MSG_CARD_MENU_EN[] PROGMEM = "Print from SD";
|
||||
const char MSG_CARD_MENU_CZ[] PROGMEM = "Tisk z SD";
|
||||
const char MSG_CARD_MENU_IT[] PROGMEM = "Stampa da SD";
|
||||
|
@ -1731,6 +1736,11 @@ const char * const MSG_PICK_Z_LANG_TABLE[LANG_NUM] PROGMEM = {
|
|||
MSG_PICK_Z_DE
|
||||
};
|
||||
|
||||
const char MSG_PINDA_NOT_CALIBRATED_EN[] PROGMEM = "PINDA probe has not been calibrated";
|
||||
const char * const MSG_PINDA_NOT_CALIBRATED_LANG_TABLE[1] PROGMEM = {
|
||||
MSG_PINDA_NOT_CALIBRATED_EN
|
||||
};
|
||||
|
||||
const char MSG_PLANNER_BUFFER_BYTES_EN[] PROGMEM = " PlannerBufferBytes: ";
|
||||
const char * const MSG_PLANNER_BUFFER_BYTES_LANG_TABLE[1] PROGMEM = {
|
||||
MSG_PLANNER_BUFFER_BYTES_EN
|
||||
|
|
|
@ -107,6 +107,8 @@ extern const char* const MSG_CALIBRATE_BED_RESET_LANG_TABLE[LANG_NUM];
|
|||
#define MSG_CALIBRATE_BED_RESET LANG_TABLE_SELECT(MSG_CALIBRATE_BED_RESET_LANG_TABLE)
|
||||
extern const char* const MSG_CALIBRATE_E_LANG_TABLE[LANG_NUM];
|
||||
#define MSG_CALIBRATE_E LANG_TABLE_SELECT(MSG_CALIBRATE_E_LANG_TABLE)
|
||||
extern const char* const MSG_CALIBRATE_PINDA_LANG_TABLE[1];
|
||||
#define MSG_CALIBRATE_PINDA LANG_TABLE_SELECT_EXPLICIT(MSG_CALIBRATE_PINDA_LANG_TABLE, 0)
|
||||
extern const char* const MSG_CARD_MENU_LANG_TABLE[LANG_NUM];
|
||||
#define MSG_CARD_MENU LANG_TABLE_SELECT(MSG_CARD_MENU_LANG_TABLE)
|
||||
extern const char* const MSG_CHANGE_EXTR_LANG_TABLE[LANG_NUM];
|
||||
|
@ -343,6 +345,8 @@ extern const char* const MSG_PAUSE_PRINT_LANG_TABLE[LANG_NUM];
|
|||
#define MSG_PAUSE_PRINT LANG_TABLE_SELECT(MSG_PAUSE_PRINT_LANG_TABLE)
|
||||
extern const char* const MSG_PICK_Z_LANG_TABLE[LANG_NUM];
|
||||
#define MSG_PICK_Z LANG_TABLE_SELECT(MSG_PICK_Z_LANG_TABLE)
|
||||
extern const char* const MSG_PINDA_NOT_CALIBRATED_LANG_TABLE[1];
|
||||
#define MSG_PINDA_NOT_CALIBRATED LANG_TABLE_SELECT_EXPLICIT(MSG_PINDA_NOT_CALIBRATED_LANG_TABLE, 0)
|
||||
extern const char* const MSG_PLANNER_BUFFER_BYTES_LANG_TABLE[1];
|
||||
#define MSG_PLANNER_BUFFER_BYTES LANG_TABLE_SELECT_EXPLICIT(MSG_PLANNER_BUFFER_BYTES_LANG_TABLE, 0)
|
||||
extern const char* const MSG_PLEASE_WAIT_LANG_TABLE[LANG_NUM];
|
||||
|
|
|
@ -265,3 +265,6 @@
|
|||
#define MSG_MENU_CALIBRATION "Calibration"
|
||||
#define MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_OFF "SD card [normal]"
|
||||
#define MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_ON "SD card [FlshAir]"
|
||||
|
||||
#define MSG_CALIBRATE_PINDA "Calibrate PINDA"
|
||||
#define MSG_PINDA_NOT_CALIBRATED "PINDA probe has not been calibrated"
|
||||
|
|
|
@ -2154,7 +2154,7 @@ static int babystepLoadZ = 0;
|
|||
void babystep_apply()
|
||||
{
|
||||
// Apply Z height correction aka baby stepping before mesh bed leveling gets activated.
|
||||
if(calibration_status() == CALIBRATION_STATUS_CALIBRATED)
|
||||
if(calibration_status() <= CALIBRATION_STATUS_PINDA)
|
||||
{
|
||||
check_babystep(); //checking if babystep is in allowed range, otherwise setting babystep to 0
|
||||
|
||||
|
|
|
@ -2228,6 +2228,12 @@ void lcd_mesh_calibration_z()
|
|||
lcd_return_to_status();
|
||||
}
|
||||
|
||||
void lcd_pinda_calibration()
|
||||
{
|
||||
enquecommand_P(PSTR("M76"));
|
||||
lcd_return_to_status();
|
||||
}
|
||||
|
||||
#ifndef SNMM
|
||||
|
||||
/*void lcd_calibrate_extruder() {
|
||||
|
@ -2390,6 +2396,7 @@ static void lcd_calibration_menu()
|
|||
MENU_ITEM(function, MSG_CALIBRATE_BED, lcd_mesh_calibration);
|
||||
// "Calibrate Z" with storing the reference values to EEPROM.
|
||||
MENU_ITEM(submenu, MSG_HOMEYZ, lcd_mesh_calibration_z);
|
||||
MENU_ITEM(submenu, MSG_CALIBRATE_PINDA, lcd_pinda_calibration);
|
||||
#ifndef SNMM
|
||||
//MENU_ITEM(function, MSG_CALIBRATE_E, lcd_calibrate_extruder);
|
||||
#endif
|
||||
|
|
|
@ -231,4 +231,6 @@ void lcd_extr_cal_reset();
|
|||
union MenuData;
|
||||
|
||||
char reset_menu();
|
||||
|
||||
void lcd_pinda_calibration();
|
||||
#endif //ULTRALCD_H
|
Loading…
Reference in a new issue