Browse Source

✨ Controllerfan PWM scaling, kickstart (#24873)

InsanityAutomation 1 year ago
parent
commit
02c43f44c7
No account linked to committer's email address

+ 8
- 4
Marlin/Configuration_adv.h View File

552
   #endif
552
   #endif
553
 #endif
553
 #endif
554
 
554
 
555
-// When first starting the main fan, run it at full speed for the
556
-// given number of milliseconds.  This gets the fan spinning reliably
557
-// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu)
558
-//#define FAN_KICKSTART_TIME 100
555
+/**
556
+ * Fan Kickstart
557
+ * When part cooling or controller fans first start, run at a speed that
558
+ * gets it spinning reliably for a short time before setting the requested speed.
559
+ * (Does not work on Sanguinololu with FAN_SOFT_PWM.)
560
+ */
561
+//#define FAN_KICKSTART_TIME  100  // (ms)
562
+//#define FAN_KICKSTART_POWER 180  // 64-255
559
 
563
 
560
 // Some coolers may require a non-zero "off" state.
564
 // Some coolers may require a non-zero "off" state.
561
 //#define FAN_OFF_PWM  1
565
 //#define FAN_OFF_PWM  1

+ 16
- 0
Marlin/src/feature/controllerfan.cpp View File

72
       ? settings.active_speed : settings.idle_speed
72
       ? settings.active_speed : settings.idle_speed
73
     );
73
     );
74
 
74
 
75
+    speed = CALC_FAN_SPEED(speed);
76
+
77
+    #if FAN_KICKSTART_TIME
78
+      static millis_t fan_kick_end = 0;
79
+      if (speed > FAN_OFF_PWM) {
80
+        if (!fan_kick_end) {
81
+          fan_kick_end = ms + FAN_KICKSTART_TIME; // May be longer based on slow update interval for controller fn check. Sets minimum
82
+          speed = FAN_KICKSTART_POWER;
83
+        }
84
+        else if (PENDING(ms, fan_kick_end))
85
+          speed = FAN_KICKSTART_POWER;
86
+      }
87
+      else
88
+        fan_kick_end = 0;
89
+    #endif
90
+
75
     #if ENABLED(FAN_SOFT_PWM)
91
     #if ENABLED(FAN_SOFT_PWM)
76
       thermalManager.soft_pwm_controller_speed = speed;
92
       thermalManager.soft_pwm_controller_speed = speed;
77
     #else
93
     #else

+ 11
- 0
Marlin/src/inc/Conditionals_adv.h View File

1074
 #if ANY(DISABLE_INACTIVE_X, DISABLE_INACTIVE_Y, DISABLE_INACTIVE_Z, DISABLE_INACTIVE_I, DISABLE_INACTIVE_J, DISABLE_INACTIVE_K, DISABLE_INACTIVE_U, DISABLE_INACTIVE_V, DISABLE_INACTIVE_W, DISABLE_INACTIVE_E)
1074
 #if ANY(DISABLE_INACTIVE_X, DISABLE_INACTIVE_Y, DISABLE_INACTIVE_Z, DISABLE_INACTIVE_I, DISABLE_INACTIVE_J, DISABLE_INACTIVE_K, DISABLE_INACTIVE_U, DISABLE_INACTIVE_V, DISABLE_INACTIVE_W, DISABLE_INACTIVE_E)
1075
   #define HAS_DISABLE_INACTIVE_AXIS 1
1075
   #define HAS_DISABLE_INACTIVE_AXIS 1
1076
 #endif
1076
 #endif
1077
+
1078
+// Fan Kickstart
1079
+#if FAN_KICKSTART_TIME && !defined(FAN_KICKSTART_POWER)
1080
+  #define FAN_KICKSTART_POWER 180
1081
+#endif
1082
+
1083
+#if FAN_MIN_PWM == 0 && FAN_MAX_PWM == 255
1084
+  #define CALC_FAN_SPEED(f) (f ?: FAN_OFF_PWM)
1085
+#else
1086
+  #define CALC_FAN_SPEED(f) (f ? map(f, 1, 255, FAN_MIN_PWM, FAN_MAX_PWM) : FAN_OFF_PWM)
1087
+#endif

+ 5
- 0
Marlin/src/inc/SanityCheck.h View File

1513
   #error "To use BED_LIMIT_SWITCHING you must disable PIDTEMPBED."
1513
   #error "To use BED_LIMIT_SWITCHING you must disable PIDTEMPBED."
1514
 #endif
1514
 #endif
1515
 
1515
 
1516
+// Fan Kickstart
1517
+#if FAN_KICKSTART_TIME && defined(FAN_KICKSTART_POWER) && !WITHIN(FAN_KICKSTART_POWER, 64, 255)
1518
+  #error "FAN_KICKSTART_POWER must be an integer from 64 to 255."
1519
+#endif
1520
+
1516
 /**
1521
 /**
1517
  * Synchronous M106/M107 checks
1522
  * Synchronous M106/M107 checks
1518
  */
1523
  */

+ 5
- 11
Marlin/src/module/planner.cpp View File

1282
 
1282
 
1283
   void Planner::sync_fan_speeds(uint8_t (&fan_speed)[FAN_COUNT]) {
1283
   void Planner::sync_fan_speeds(uint8_t (&fan_speed)[FAN_COUNT]) {
1284
 
1284
 
1285
-    #if FAN_MIN_PWM != 0 || FAN_MAX_PWM != 255
1286
-      #define CALC_FAN_SPEED(f) (fan_speed[f] ? map(fan_speed[f], 1, 255, FAN_MIN_PWM, FAN_MAX_PWM) : FAN_OFF_PWM)
1287
-    #else
1288
-      #define CALC_FAN_SPEED(f) (fan_speed[f] ?: FAN_OFF_PWM)
1289
-    #endif
1290
-
1291
     #if ENABLED(FAN_SOFT_PWM)
1285
     #if ENABLED(FAN_SOFT_PWM)
1292
-      #define _FAN_SET(F) thermalManager.soft_pwm_amount_fan[F] = CALC_FAN_SPEED(F);
1286
+      #define _FAN_SET(F) thermalManager.soft_pwm_amount_fan[F] = CALC_FAN_SPEED(fan_speed[F]);
1293
     #else
1287
     #else
1294
-      #define _FAN_SET(F) hal.set_pwm_duty(pin_t(FAN##F##_PIN), CALC_FAN_SPEED(F));
1288
+      #define _FAN_SET(F) hal.set_pwm_duty(pin_t(FAN##F##_PIN), CALC_FAN_SPEED(fan_speed[F]));
1295
     #endif
1289
     #endif
1296
     #define FAN_SET(F) do{ kickstart_fan(fan_speed, ms, F); _FAN_SET(F); }while(0)
1290
     #define FAN_SET(F) do{ kickstart_fan(fan_speed, ms, F); _FAN_SET(F); }while(0)
1297
 
1291
 
1306
 
1300
 
1307
     void Planner::kickstart_fan(uint8_t (&fan_speed)[FAN_COUNT], const millis_t &ms, const uint8_t f) {
1301
     void Planner::kickstart_fan(uint8_t (&fan_speed)[FAN_COUNT], const millis_t &ms, const uint8_t f) {
1308
       static millis_t fan_kick_end[FAN_COUNT] = { 0 };
1302
       static millis_t fan_kick_end[FAN_COUNT] = { 0 };
1309
-      if (fan_speed[f]) {
1303
+      if (fan_speed[f] > FAN_OFF_PWM) {
1310
         if (fan_kick_end[f] == 0) {
1304
         if (fan_kick_end[f] == 0) {
1311
           fan_kick_end[f] = ms + FAN_KICKSTART_TIME;
1305
           fan_kick_end[f] = ms + FAN_KICKSTART_TIME;
1312
-          fan_speed[f] = 255;
1306
+          fan_speed[f] = FAN_KICKSTART_POWER;
1313
         }
1307
         }
1314
         else if (PENDING(ms, fan_kick_end[f]))
1308
         else if (PENDING(ms, fan_kick_end[f]))
1315
-          fan_speed[f] = 255;
1309
+          fan_speed[f] = FAN_KICKSTART_POWER;
1316
       }
1310
       }
1317
       else
1311
       else
1318
         fan_kick_end[f] = 0;
1312
         fan_kick_end[f] = 0;

+ 7
- 7
Marlin/src/module/temperature.cpp View File

306
 #endif
306
 #endif
307
 
307
 
308
 #if EITHER(AUTO_POWER_E_FANS, HAS_FANCHECK)
308
 #if EITHER(AUTO_POWER_E_FANS, HAS_FANCHECK)
309
-  uint8_t Temperature::autofan_speed[HOTENDS]; // = { 0 }
309
+  uint8_t Temperature::autofan_speed[HOTENDS] = ARRAY_N_1(HOTENDS, FAN_OFF_PWM);
310
 #endif
310
 #endif
311
 
311
 
312
 #if ENABLED(AUTO_POWER_CHAMBER_FAN)
312
 #if ENABLED(AUTO_POWER_CHAMBER_FAN)
313
-  uint8_t Temperature::chamberfan_speed; // = 0
313
+  uint8_t Temperature::chamberfan_speed = FAN_OFF_PWM;
314
 #endif
314
 #endif
315
 
315
 
316
 #if ENABLED(AUTO_POWER_COOLER_FAN)
316
 #if ENABLED(AUTO_POWER_COOLER_FAN)
317
-  uint8_t Temperature::coolerfan_speed; // = 0
317
+  uint8_t Temperature::coolerfan_speed = FAN_OFF_PWM;
318
 #endif
318
 #endif
319
 
319
 
320
 #if BOTH(FAN_SOFT_PWM, USE_CONTROLLER_FAN)
320
 #if BOTH(FAN_SOFT_PWM, USE_CONTROLLER_FAN)
321
-  uint8_t Temperature::soft_pwm_controller_speed;
321
+  uint8_t Temperature::soft_pwm_controller_speed = FAN_OFF_PWM;
322
 #endif
322
 #endif
323
 
323
 
324
 // Init fans according to whether they're native PWM or Software PWM
324
 // Init fans according to whether they're native PWM or Software PWM
342
 // HAS_FAN does not include CONTROLLER_FAN
342
 // HAS_FAN does not include CONTROLLER_FAN
343
 #if HAS_FAN
343
 #if HAS_FAN
344
 
344
 
345
-  uint8_t Temperature::fan_speed[FAN_COUNT]; // = { 0 }
345
+  uint8_t Temperature::fan_speed[FAN_COUNT] = ARRAY_N_1(FAN_COUNT, FAN_OFF_PWM);
346
 
346
 
347
   #if ENABLED(EXTRA_FAN_SPEED)
347
   #if ENABLED(EXTRA_FAN_SPEED)
348
 
348
 
349
-    Temperature::extra_fan_t Temperature::extra_fan_speed[FAN_COUNT];
349
+    Temperature::extra_fan_t Temperature::extra_fan_speed[FAN_COUNT] = ARRAY_N_1(FAN_COUNT, FAN_OFF_PWM);
350
 
350
 
351
     /**
351
     /**
352
      * Handle the M106 P<fan> T<speed> command:
352
      * Handle the M106 P<fan> T<speed> command:
373
 
373
 
374
   #if EITHER(PROBING_FANS_OFF, ADVANCED_PAUSE_FANS_PAUSE)
374
   #if EITHER(PROBING_FANS_OFF, ADVANCED_PAUSE_FANS_PAUSE)
375
     bool Temperature::fans_paused; // = false;
375
     bool Temperature::fans_paused; // = false;
376
-    uint8_t Temperature::saved_fan_speed[FAN_COUNT]; // = { 0 }
376
+    uint8_t Temperature::saved_fan_speed[FAN_COUNT] = ARRAY_N_1(FAN_COUNT, FAN_OFF_PWM);
377
   #endif
377
   #endif
378
 
378
 
379
   #if ENABLED(ADAPTIVE_FAN_SLOWING)
379
   #if ENABLED(ADAPTIVE_FAN_SLOWING)

+ 1
- 1
Marlin/src/module/tool_change.cpp View File

917
     #if HAS_FAN && TOOLCHANGE_FS_FAN >= 0
917
     #if HAS_FAN && TOOLCHANGE_FS_FAN >= 0
918
       thermalManager.fan_speed[TOOLCHANGE_FS_FAN] = toolchange_settings.fan_speed;
918
       thermalManager.fan_speed[TOOLCHANGE_FS_FAN] = toolchange_settings.fan_speed;
919
       gcode.dwell(SEC_TO_MS(toolchange_settings.fan_time));
919
       gcode.dwell(SEC_TO_MS(toolchange_settings.fan_time));
920
-      thermalManager.fan_speed[TOOLCHANGE_FS_FAN] = 0;
920
+      thermalManager.fan_speed[TOOLCHANGE_FS_FAN] = FAN_OFF_PWM;
921
     #endif
921
     #endif
922
   }
922
   }
923
 
923
 

Loading…
Cancel
Save