My Marlin configs for Fabrikator Mini and CTC i3 Pro B
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

planner.h 8.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. /**
  2. * Marlin 3D Printer Firmware
  3. * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
  4. *
  5. * Based on Sprinter and grbl.
  6. * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm
  7. *
  8. * This program is free software: you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License as published by
  10. * the Free Software Foundation, either version 3 of the License, or
  11. * (at your option) any later version.
  12. *
  13. * This program is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU General Public License
  19. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  20. *
  21. */
  22. /**
  23. planner.h - buffers movement commands and manages the acceleration profile plan
  24. Part of Grbl
  25. Copyright (c) 2009-2011 Simen Svale Skogsrud
  26. Grbl is free software: you can redistribute it and/or modify
  27. it under the terms of the GNU General Public License as published by
  28. the Free Software Foundation, either version 3 of the License, or
  29. (at your option) any later version.
  30. Grbl is distributed in the hope that it will be useful,
  31. but WITHOUT ANY WARRANTY; without even the implied warranty of
  32. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  33. GNU General Public License for more details.
  34. You should have received a copy of the GNU General Public License
  35. along with Grbl. If not, see <http://www.gnu.org/licenses/>.
  36. */
  37. // This module is to be considered a sub-module of stepper.c. Please don't include
  38. // this file from any other module.
  39. #ifndef PLANNER_H
  40. #define PLANNER_H
  41. #include "Marlin.h"
  42. // This struct is used when buffering the setup for each linear movement "nominal" values are as specified in
  43. // the source g-code and may never actually be reached if acceleration management is active.
  44. typedef struct {
  45. // Fields used by the bresenham algorithm for tracing the line
  46. long steps[NUM_AXIS]; // Step count along each axis
  47. unsigned long step_event_count; // The number of step events required to complete this block
  48. long accelerate_until; // The index of the step event on which to stop acceleration
  49. long decelerate_after; // The index of the step event on which to start decelerating
  50. long acceleration_rate; // The acceleration rate used for acceleration calculation
  51. unsigned char direction_bits; // The direction bit set for this block (refers to *_DIRECTION_BIT in config.h)
  52. unsigned char active_extruder; // Selects the active extruder
  53. #if ENABLED(ADVANCE)
  54. long advance_rate;
  55. volatile long initial_advance;
  56. volatile long final_advance;
  57. float advance;
  58. #endif
  59. // Fields used by the motion planner to manage acceleration
  60. // float speed_x, speed_y, speed_z, speed_e; // Nominal mm/sec for each axis
  61. float nominal_speed; // The nominal speed for this block in mm/sec
  62. float entry_speed; // Entry speed at previous-current junction in mm/sec
  63. float max_entry_speed; // Maximum allowable junction entry speed in mm/sec
  64. float millimeters; // The total travel of this block in mm
  65. float acceleration; // acceleration mm/sec^2
  66. unsigned char recalculate_flag; // Planner flag to recalculate trapezoids on entry junction
  67. unsigned char nominal_length_flag; // Planner flag for nominal speed always reached
  68. // Settings for the trapezoid generator
  69. unsigned long nominal_rate; // The nominal step rate for this block in step_events/sec
  70. unsigned long initial_rate; // The jerk-adjusted step rate at start of block
  71. unsigned long final_rate; // The minimal rate at exit
  72. unsigned long acceleration_st; // acceleration steps/sec^2
  73. #if FAN_COUNT > 0
  74. unsigned long fan_speed[FAN_COUNT];
  75. #endif
  76. #if ENABLED(BARICUDA)
  77. unsigned long valve_pressure;
  78. unsigned long e_to_p_pressure;
  79. #endif
  80. volatile char busy;
  81. } block_t;
  82. #define BLOCK_MOD(n) ((n)&(BLOCK_BUFFER_SIZE-1))
  83. // Initialize the motion plan subsystem
  84. void plan_init();
  85. void check_axes_activity();
  86. // Get the number of buffered moves
  87. extern volatile unsigned char block_buffer_head;
  88. extern volatile unsigned char block_buffer_tail;
  89. FORCE_INLINE uint8_t movesplanned() { return BLOCK_MOD(block_buffer_head - block_buffer_tail + BLOCK_BUFFER_SIZE); }
  90. #if ENABLED(AUTO_BED_LEVELING_FEATURE) || ENABLED(MESH_BED_LEVELING)
  91. #if ENABLED(AUTO_BED_LEVELING_FEATURE)
  92. #include "vector_3.h"
  93. // Transform required to compensate for bed level
  94. extern matrix_3x3 plan_bed_level_matrix;
  95. /**
  96. * Get the position applying the bed level matrix
  97. */
  98. vector_3 plan_get_position();
  99. #endif // AUTO_BED_LEVELING_FEATURE
  100. /**
  101. * Add a new linear movement to the buffer. x, y, z are the signed, absolute target position in
  102. * millimeters. Feed rate specifies the (target) speed of the motion.
  103. */
  104. void plan_buffer_line(float x, float y, float z, const float& e, float feed_rate, const uint8_t extruder);
  105. /**
  106. * Set the planner positions. Used for G92 instructions.
  107. * Multiplies by axis_steps_per_unit[] to set stepper positions.
  108. * Clears previous speed values.
  109. */
  110. void plan_set_position(float x, float y, float z, const float& e);
  111. #else
  112. void plan_buffer_line(const float& x, const float& y, const float& z, const float& e, float feed_rate, const uint8_t extruder);
  113. void plan_set_position(const float& x, const float& y, const float& z, const float& e);
  114. #endif // AUTO_BED_LEVELING_FEATURE || MESH_BED_LEVELING
  115. void plan_set_e_position(const float& e);
  116. //===========================================================================
  117. //============================= public variables ============================
  118. //===========================================================================
  119. extern millis_t minsegmenttime;
  120. extern float max_feedrate[NUM_AXIS]; // Max speeds in mm per minute
  121. extern float axis_steps_per_unit[NUM_AXIS];
  122. extern unsigned long max_acceleration_units_per_sq_second[NUM_AXIS]; // Use M201 to override by software
  123. extern float minimumfeedrate;
  124. extern float acceleration; // Normal acceleration mm/s^2 DEFAULT ACCELERATION for all printing moves. M204 SXXXX
  125. extern float retract_acceleration; // Retract acceleration mm/s^2 filament pull-back and push-forward while standing still in the other axes M204 TXXXX
  126. extern float travel_acceleration; // Travel acceleration mm/s^2 DEFAULT ACCELERATION for all NON printing moves. M204 MXXXX
  127. extern float max_xy_jerk; // The largest speed change requiring no acceleration
  128. extern float max_z_jerk;
  129. extern float max_e_jerk;
  130. extern float mintravelfeedrate;
  131. extern unsigned long axis_steps_per_sqr_second[NUM_AXIS];
  132. #if ENABLED(AUTOTEMP)
  133. extern bool autotemp_enabled;
  134. extern float autotemp_max;
  135. extern float autotemp_min;
  136. extern float autotemp_factor;
  137. #endif
  138. extern block_t block_buffer[BLOCK_BUFFER_SIZE]; // A ring buffer for motion instructions
  139. extern volatile unsigned char block_buffer_head; // Index of the next block to be pushed
  140. extern volatile unsigned char block_buffer_tail;
  141. // Returns true if the buffer has a queued block, false otherwise
  142. FORCE_INLINE bool blocks_queued() { return (block_buffer_head != block_buffer_tail); }
  143. // Called when the current block is no longer needed. Discards
  144. // the block and makes the memory available for new blocks.
  145. FORCE_INLINE void plan_discard_current_block() {
  146. if (blocks_queued())
  147. block_buffer_tail = BLOCK_MOD(block_buffer_tail + 1);
  148. }
  149. // Gets the current block. Returns NULL if buffer empty
  150. FORCE_INLINE block_t* plan_get_current_block() {
  151. if (blocks_queued()) {
  152. block_t* block = &block_buffer[block_buffer_tail];
  153. block->busy = true;
  154. return block;
  155. }
  156. else
  157. return NULL;
  158. }
  159. void reset_acceleration_rates();
  160. #endif // PLANNER_H