From 0f91bf9527eb2d20631ae23e48a504e47e3092ee Mon Sep 17 00:00:00 2001 From: Robert Pelnar Date: Fri, 20 Jul 2018 20:30:08 +0200 Subject: [PATCH] FSensor - optical quality meassurement durring load filament --- Firmware/Marlin_main.cpp | 25 ++++++++---- Firmware/fsensor.cpp | 83 +++++++++++++++++++++++++++++++--------- Firmware/fsensor.h | 36 +++++++++++------ 3 files changed, 105 insertions(+), 39 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 227f69bd..eb0146ed 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -3085,12 +3085,7 @@ void gcode_M701() custom_message_type = 2; bool old_watch_runout = fsensor_watch_runout; - fsensor_watch_runout = false; - fsensor_st_sum = 0; - fsensor_yd_sum = 0; - fsensor_er_sum = 0; - fsensor_yd_min = 65535; - fsensor_yd_max = 0; + fsensor_oq_meassure_start(); lcd_setstatuspgm(_T(MSG_LOADING_FILAMENT)); current_position[E_AXIS] += 40; @@ -3132,11 +3127,25 @@ void gcode_M701() custom_message_type = 0; #endif + fsensor_oq_meassure_stop(); + fsensor_err_cnt = 0; fsensor_watch_runout = old_watch_runout; - printf_P(_N("\nFSENSOR st_sum=%lu yd_sum=%lu er_sum=%lu\n"), fsensor_st_sum, fsensor_yd_sum, fsensor_er_sum); - printf_P(_N("\nFSENSOR yd_min=%hhu yd_max=%hhu yd_avg=%hhu\n"), fsensor_yd_min, fsensor_yd_max, fsensor_yd_sum * FSENSOR_CHUNK_LEN / fsensor_st_sum); + + printf_P(_N("\nFSENSOR st_sum=%lu yd_sum=%lu er_sum=%u er_max=%u\n"), fsensor_oq_st_sum, fsensor_oq_yd_sum, fsensor_oq_er_sum, fsensor_oq_er_max); + printf_P(_N("\nFSENSOR yd_min=%hhu yd_max=%hhu yd_avg=%hhu\n"), fsensor_oq_yd_min, fsensor_oq_yd_max, fsensor_oq_yd_sum * FSENSOR_CHUNK_LEN / fsensor_oq_st_sum); printf_P(PSTR("gcode_M701 end\n")); + + + if (!fsensor_oq_result()) + { + bool disable = lcd_show_fullscreen_message_yes_no_and_wait_P( + _i("Filament sensor low response, disable it?"), false, true); + lcd_update_enable(true); + lcd_update(2); + if (disable) + fsensor_disable(); + } } /** * @brief Get serial number from 32U2 processor diff --git a/Firmware/fsensor.cpp b/Firmware/fsensor.cpp index 9ba2fbf2..f2161fc0 100644 --- a/Firmware/fsensor.cpp +++ b/Firmware/fsensor.cpp @@ -12,8 +12,6 @@ const char ERRMSG_PAT9125_NOT_RESP[] PROGMEM = "PAT9125 not responding (%d)!\n"; -//#define FSENSOR_ERR_MAX 5 //filament sensor max error count -#define FSENSOR_ERR_MAX 10 //filament sensor max error count #define FSENSOR_INT_PIN 63 //filament sensor interrupt pin PK1 #define FSENSOR_INT_PIN_MSK 0x02 //filament sensor interrupt pin mask (bit1) @@ -83,15 +81,19 @@ uint8_t fsensor_autoload_c = 0; uint32_t fsensor_autoload_last_millis = 0; uint8_t fsensor_autoload_sum = 0; -uint32_t fsensor_st_sum = 0; -uint32_t fsensor_yd_sum = 0; -uint32_t fsensor_er_sum = 0; -uint16_t fsensor_yd_min = 65535; -uint16_t fsensor_yd_max = 0; +//filament optical quality meassurement +bool fsensor_oq_meassure = false; +uint8_t fsensor_oq_skipchunk; +uint32_t fsensor_oq_st_sum; +uint32_t fsensor_oq_yd_sum; +uint16_t fsensor_oq_er_sum; +uint8_t fsensor_oq_er_max; +uint16_t fsensor_oq_yd_min; +uint16_t fsensor_oq_yd_max; + bool fsensor_enable(void) { -// puts_P(PSTR("fsensor_enable\n")); int pat9125 = pat9125_init(); printf_P(PSTR("PAT9125_init:%d\n"), pat9125); if (pat9125) @@ -100,14 +102,11 @@ bool fsensor_enable(void) fsensor_not_responding = true; fsensor_enabled = pat9125?true:false; fsensor_watch_runout = true; + fsensor_oq_meassure = false; fsensor_err_cnt = 0; eeprom_update_byte((uint8_t*)EEPROM_FSENSOR, fsensor_enabled?0x01:0x00); FSensorStateMenu = fsensor_enabled?1:0; -// printf_P(PSTR("fsensor_enable - end %d\n"), fsensor_enabled?1:0); - fsensor_st_sum = 0; - fsensor_yd_sum = 0; - fsensor_er_sum = 0; return fsensor_enabled; } @@ -194,6 +193,41 @@ bool fsensor_check_autoload(void) return false; } +void fsensor_oq_meassure_start(void) +{ + fsensor_oq_skipchunk = 1; + fsensor_oq_st_sum = 0; + fsensor_oq_yd_sum = 0; + fsensor_oq_er_sum = 0; + fsensor_oq_er_max = 0; + fsensor_oq_yd_min = FSENSOR_OQ_MAX_YD; + fsensor_oq_yd_max = 0; + pat9125_update_y(); + pat9125_y = 0; + fsensor_watch_runout = false; + fsensor_oq_meassure = true; +} + +void fsensor_oq_meassure_stop(void) +{ + fsensor_oq_meassure = false; +} + +bool fsensor_oq_result(void) +{ + printf(_N("fsensor_oq_result\n")); + if (fsensor_oq_er_sum > FSENSOR_OQ_MAX_ER) return false; + printf(_N(" er_sum OK\n")); + uint8_t yd_avg = fsensor_oq_yd_sum * FSENSOR_CHUNK_LEN / fsensor_oq_st_sum; + if ((yd_avg < FSENSOR_OQ_MIN_YD) || (yd_avg > FSENSOR_OQ_MAX_YD)) return false; + printf(_N(" yd_avg OK\n")); + if (fsensor_oq_yd_max > (yd_avg * FSENSOR_OQ_MAX_PD)) return false; + printf(_N(" yd_max OK\n")); + if (fsensor_oq_yd_min < (yd_avg / FSENSOR_OQ_MAX_ND)) return false; + printf(_N(" yd_min OK\n")); + return true; +} + ISR(PCINT2_vect) { if (!((fsensor_int_pin_old ^ PINK) & FSENSOR_INT_PIN_MSK)) return; @@ -218,20 +252,31 @@ ISR(PCINT2_vect) if (pat9125_y <= 0) { fsensor_err_cnt++; - fsensor_er_sum++; } else { if (fsensor_err_cnt) fsensor_err_cnt--; - if (st_cnt == FSENSOR_CHUNK_LEN) + } + if (fsensor_oq_meassure) + { + if (fsensor_oq_skipchunk) + fsensor_oq_skipchunk--; + else { - if (fsensor_yd_min > pat9125_y) fsensor_yd_min = (fsensor_yd_min + pat9125_y) / 2; - if (fsensor_yd_max < pat9125_y) fsensor_yd_max = (fsensor_yd_max + pat9125_y) / 2; + if (st_cnt == FSENSOR_CHUNK_LEN) + { + if (fsensor_oq_yd_min > pat9125_y) fsensor_oq_yd_min = (fsensor_oq_yd_min + pat9125_y) / 2; + if (fsensor_oq_yd_max < pat9125_y) fsensor_oq_yd_max = (fsensor_oq_yd_max + pat9125_y) / 2; + } + fsensor_oq_st_sum += st_cnt; + fsensor_oq_yd_sum += pat9125_y; + if (fsensor_err_cnt > old_err_cnt) + fsensor_oq_er_sum += (fsensor_err_cnt - old_err_cnt); + if (fsensor_oq_er_max < fsensor_err_cnt) + fsensor_oq_er_max = fsensor_err_cnt; } } - fsensor_st_sum += st_cnt; - fsensor_yd_sum += pat9125_y; } else //negative movement { @@ -245,7 +290,7 @@ ISR(PCINT2_vect) if (fsensor_log) { printf_P(_N("FSENSOR cnt=%d dy=%d err=%d %S\n"), st_cnt, pat9125_y, fsensor_err_cnt, (fsensor_err_cnt > old_err_cnt)?_N("NG!"):_N("OK")); - printf_P(_N("FSENSOR st_sum=%lu yd_sum=%lu er_sum=%lu\n"), fsensor_st_sum, fsensor_yd_sum, fsensor_er_sum); + printf_P(_N("FSENSOR st_sum=%lu yd_sum=%lu er_sum=%u er_max=%u\n"), fsensor_oq_st_sum, fsensor_oq_yd_sum, fsensor_oq_er_sum, fsensor_oq_er_max); } #endif //DEBUG_FSENSOR_LOG diff --git a/Firmware/fsensor.h b/Firmware/fsensor.h index 70534b39..99f30e8a 100644 --- a/Firmware/fsensor.h +++ b/Firmware/fsensor.h @@ -3,8 +3,16 @@ #include "planner.h" -//#define FSENSOR_CHUNK_LEN 280 //filament sensor chunk length in steps - 1mm #define FSENSOR_CHUNK_LEN 180 //filament sensor chunk length in steps - 0.64mm +#define FSENSOR_ERR_MAX 10 //filament sensor maximum error count for runout detection + +//Optical quality meassurement params +#define FSENSOR_OQ_MAX_ER 5 //maximum error count for loading (~150mm) +#define FSENSOR_OQ_MIN_YD 2 //minimum yd per chunk +#define FSENSOR_OQ_MAX_YD 200 //maximum yd per chunk +#define FSENSOR_OQ_MAX_PD 3 //maximum positive deviation (= yd_max/yd_avg) +#define FSENSOR_OQ_MAX_ND 5 //maximum negative deviation (= yd_avg/yd_min) + //save restore printing extern void fsensor_stop_and_save_print(void); @@ -25,15 +33,16 @@ extern void fsensor_update(void); //setup pin-change interrupt extern void fsensor_setup_interrupt(void); -// +//autoload support extern void fsensor_autoload_check_start(void); - -// extern void fsensor_autoload_check_stop(void); - -// extern bool fsensor_check_autoload(void); +//optical quality meassurement support +extern void fsensor_oq_meassure_start(void); +extern void fsensor_oq_meassure_stop(void); +extern bool fsensor_oq_result(void); + //callbacks from stepper extern void fsensor_st_block_begin(block_t* bl); extern void fsensor_st_block_chunk(block_t* bl, int cnt); @@ -52,11 +61,14 @@ extern uint8_t fsensor_err_cnt; //autoload enable/disable flag extern bool fsensor_watch_autoload; - -extern uint32_t fsensor_st_sum; -extern uint32_t fsensor_yd_sum; -extern uint32_t fsensor_er_sum; -extern uint16_t fsensor_yd_min; -extern uint16_t fsensor_yd_max; +//filament optical quality meassurement +extern bool fsensor_oq_meassure; +extern uint8_t fsensor_oq_skipchunk; +extern uint32_t fsensor_oq_st_sum; +extern uint32_t fsensor_oq_yd_sum; +extern uint16_t fsensor_oq_er_sum; +extern uint8_t fsensor_oq_er_max; +extern uint16_t fsensor_oq_yd_min; +extern uint16_t fsensor_oq_yd_max; #endif //FSENSOR_H