瀏覽代碼

Merge pull request #2639 from wavexx/la15_adj_threshold

Adjustable Linear Advance limits and thresholds
DRracer 4 年之前
父節點
當前提交
7079606df3
共有 8 個文件被更改,包括 40 次插入30 次删除
  1. 7 5
      Firmware/Configuration_adv.h
  2. 1 1
      Firmware/Marlin.h
  3. 21 7
      Firmware/Marlin_main.cpp
  4. 6 3
      Firmware/la10compat.cpp
  5. 1 1
      Firmware/planner.cpp
  6. 0 11
      Firmware/stepper.cpp
  7. 0 2
      Firmware/stepper.h
  8. 4 0
      Firmware/ultralcd.cpp

+ 7 - 5
Firmware/Configuration_adv.h

@@ -285,11 +285,13 @@
 #define LIN_ADVANCE
 
 #ifdef LIN_ADVANCE
-  #define LIN_ADVANCE_K 0  // Unit: mm compression per 1mm/s extruder speed
-  //#define LA_NOCOMPAT    // Disable Linear Advance 1.0 compatibility
-  //#define LA_LIVE_K      // Allow adjusting K in the Tune menu
-  //#define LA_DEBUG       // If enabled, this will generate debug information output over USB.
-  //#define LA_DEBUG_LOGIC // @wavexx: setup logic channels for isr debugging
+  #define LA_K_DEF    0        // Default K factor (Unit: mm compression per 1mm/s extruder speed)
+  #define LA_K_MAX    10       // Maximum acceptable K factor (exclusive, see notes in planner.cpp:plan_buffer_line)
+  #define LA_LA10_MIN LA_K_MAX // Lin. Advance 1.0 threshold value (inclusive)
+  //#define LA_NOCOMPAT        // Disable Linear Advance 1.0 compatibility
+  //#define LA_LIVE_K          // Allow adjusting K in the Tune menu
+  //#define LA_DEBUG           // If enabled, this will generate debug information output over USB.
+  //#define LA_DEBUG_LOGIC     // @wavexx: setup logic channels for isr debugging
 #endif
 
 // Arc interpretation settings:

+ 1 - 1
Firmware/Marlin.h

@@ -238,8 +238,8 @@ void get_coordinates();
 void prepare_move();
 void kill(const char *full_screen_message = NULL, unsigned char id = 0);
 void Stop();
-
 bool IsStopped();
+void finishAndDisableSteppers();
 
 //put an ASCII command at the end of the current buffer.
 void enquecommand(const char *cmd, bool from_progmem = false);

+ 21 - 7
Firmware/Marlin_main.cpp

@@ -2066,15 +2066,16 @@ static float probe_pt(float x, float y, float z_before) {
 inline void gcode_M900() {
     float newK = code_seen('K') ? code_value_float() : -2;
 #ifdef LA_NOCOMPAT
-    if (newK >= 0 && newK < 10)
+    if (newK >= 0 && newK < LA_K_MAX)
         extruder_advance_K = newK;
     else
         SERIAL_ECHOLNPGM("K out of allowed range!");
 #else
     if (newK == 0)
+    {
         extruder_advance_K = 0;
-    else if (newK == -1)
         la10c_reset();
+    }
     else
     {
         newK = la10c_value(newK);
@@ -4864,11 +4865,6 @@ if(eSoundMode!=e_SOUND_MODE_SILENT)
 	case_G80:
 	{
 		mesh_bed_leveling_flag = true;
-#ifndef LA_NOCOMPAT
-        // When printing via USB there's no clear boundary between prints. Abuse MBL to indicate
-        // the beginning of a new print, allowing a new autodetected setting just after G80.
-        la10c_reset();
-#endif
 #ifndef PINDA_THERMISTOR
         static bool run = false; // thermistor-less PINDA temperature compensation is running
 #endif // ndef PINDA_THERMISTOR
@@ -9726,6 +9722,24 @@ void Stop()
 
 bool IsStopped() { return Stopped; };
 
+void finishAndDisableSteppers()
+{
+  st_synchronize();
+  disable_x();
+  disable_y();
+  disable_z();
+  disable_e0();
+  disable_e1();
+  disable_e2();
+
+#ifndef LA_NOCOMPAT
+  // Steppers are disabled both when a print is stopped and also via M84 (which is additionally
+  // checked-for to indicate a complete file), so abuse this function to reset the LA detection
+  // state for the next print.
+  la10c_reset();
+#endif
+}
+
 #ifdef FAST_PWM_FAN
 void setPwmFrequency(uint8_t pin, int val)
 {

+ 6 - 3
Firmware/la10compat.cpp

@@ -1,5 +1,6 @@
 #include "la10compat.h"
 #include "Marlin.h"
+#include <float.h>
 
 
 static LA10C_MODE la10c_mode = LA10C_UNKNOWN; // Current LA compatibility mode
@@ -38,7 +39,9 @@ void la10c_mode_change(LA10C_MODE mode)
 static float la10c_convert(float k)
 {
     float new_K = k * 0.004 - 0.05;
-    return (new_K < 0? 0: new_K);
+    return new_K < 0? 0:
+           new_K > (LA_K_MAX - FLT_EPSILON)? (LA_K_MAX - FLT_EPSILON):
+           new_K;
 }
 
 
@@ -52,11 +55,11 @@ float la10c_value(float k)
         else if(k < 0)
             return -1;
 
-        la10c_mode_change(k < 10? LA10C_LA15: LA10C_LA10);
+        la10c_mode_change(k < LA_LA10_MIN? LA10C_LA15: LA10C_LA10);
     }
 
     if(la10c_mode == LA10C_LA15)
-        return (k >= 0 && k < 10? k: -1);
+        return (k >= 0 && k < LA_K_MAX? k: -1);
     else
         return (k >= 0? la10c_convert(k): -1);
 }

+ 1 - 1
Firmware/planner.cpp

@@ -126,7 +126,7 @@ float extrude_min_temp=EXTRUDE_MINTEMP;
 #endif
 
 #ifdef LIN_ADVANCE
-float extruder_advance_K = LIN_ADVANCE_K;
+float extruder_advance_K = LA_K_DEF;
 float position_float[NUM_AXIS];
 #endif
 

+ 0 - 11
Firmware/stepper.cpp

@@ -1356,17 +1356,6 @@ float st_get_position_mm(uint8_t axis)
 }
 
 
-void finishAndDisableSteppers()
-{
-  st_synchronize();
-  disable_x();
-  disable_y();
-  disable_z();
-  disable_e0();
-  disable_e1();
-  disable_e2();
-}
-
 void quickStop()
 {
   DISABLE_STEPPER_DRIVER_INTERRUPT();

+ 0 - 2
Firmware/stepper.h

@@ -69,8 +69,6 @@ void invert_z_endstop(bool endstop_invert);
 
 void checkStepperErrors(); //Print errors detected by the stepper
 
-void finishAndDisableSteppers();
-
 extern block_t *current_block;  // A pointer to the block currently being traced
 extern bool x_min_endstop;
 extern bool x_max_endstop;

+ 4 - 0
Firmware/ultralcd.cpp

@@ -51,6 +51,10 @@
 #include "adc.h"
 #include "config.h"
 
+#ifndef LA_NOCOMPAT
+#include "la10compat.h"
+#endif
+
 
 int scrollstuff = 0;
 char longFilenameOLD[LONG_FILENAME_LENGTH];