Fri, 17 Nov 2017 10:13:31 +0100
proper configuration, homing and planner optimization
0 | 1 | /* |
2 | planner.h - buffers movement commands and manages the acceleration profile plan | |
3 | Part of Grbl | |
4 | ||
5 | Copyright (c) 2009-2011 Simen Svale Skogsrud | |
6 | ||
7 | Grbl is free software: you can redistribute it and/or modify | |
8 | it under the terms of the GNU General Public License as published by | |
9 | the Free Software Foundation, either version 3 of the License, or | |
10 | (at your option) any later version. | |
11 | ||
12 | Grbl is distributed in the hope that it will be useful, | |
13 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 | GNU General Public License for more details. | |
16 | ||
17 | You should have received a copy of the GNU General Public License | |
18 | along with Grbl. If not, see <http://www.gnu.org/licenses/>. | |
19 | */ | |
20 | ||
21 | // This module is to be considered a sub-module of stepper.c. Please don't include | |
22 | // this file from any other module. | |
23 | ||
24 | #ifndef planner_h | |
25 | #define planner_h | |
26 | ||
27 | #include "Marlin.h" | |
28 | ||
29 | // This struct is used when buffering the setup for each linear movement "nominal" values are as specified in | |
30 | // the source g-code and may never actually be reached if acceleration management is active. | |
31 | typedef struct { | |
32 | // Fields used by the bresenham algorithm for tracing the line | |
33 | long steps_x, steps_y, steps_z, steps_e; // Step count along each axis | |
34 | unsigned long step_event_count; // The number of step events required to complete this block | |
35 | long accelerate_until; // The index of the step event on which to stop acceleration | |
36 | long decelerate_after; // The index of the step event on which to start decelerating | |
37 | long acceleration_rate; // The acceleration rate used for acceleration calculation | |
38 | unsigned char direction_bits; // The direction bit set for this block (refers to *_DIRECTION_BIT in config.h) | |
39 | unsigned char active_extruder; // Selects the active extruder | |
40 | #ifdef ADVANCE | |
41 | long advance_rate; | |
42 | volatile long initial_advance; | |
43 | volatile long final_advance; | |
44 | float advance; | |
45 | #endif | |
46 | ||
47 | // Fields used by the motion planner to manage acceleration | |
48 | // float speed_x, speed_y, speed_z, speed_e; // Nominal mm/sec for each axis | |
49 | float nominal_speed; // The nominal speed for this block in mm/sec | |
50 | float entry_speed; // Entry speed at previous-current junction in mm/sec | |
51 | float max_entry_speed; // Maximum allowable junction entry speed in mm/sec | |
52 | float millimeters; // The total travel of this block in mm | |
53 | float acceleration; // acceleration mm/sec^2 | |
54 | unsigned char recalculate_flag; // Planner flag to recalculate trapezoids on entry junction | |
55 | unsigned char nominal_length_flag; // Planner flag for nominal speed always reached | |
56 | ||
57 | // Settings for the trapezoid generator | |
58 | unsigned long nominal_rate; // The nominal step rate for this block in step_events/sec | |
59 | unsigned long initial_rate; // The jerk-adjusted step rate at start of block | |
60 | unsigned long final_rate; // The minimal rate at exit | |
61 | unsigned long acceleration_st; // acceleration steps/sec^2 | |
62 | unsigned long fan_speed; | |
63 | volatile char busy; | |
1
b584642d4f58
several modifications to support laser enable - still needs cleanup
mbayer
parents:
0
diff
changeset
|
64 | |
b584642d4f58
several modifications to support laser enable - still needs cleanup
mbayer
parents:
0
diff
changeset
|
65 | bool laser_on; |
0 | 66 | } block_t; |
67 | ||
68 | // Initialize the motion plan subsystem | |
69 | void plan_init(); | |
70 | ||
71 | // Add a new linear movement to the buffer. x, y and z is the signed, absolute target position in | |
72 | // millimaters. Feed rate specifies the speed of the motion. | |
1
b584642d4f58
several modifications to support laser enable - still needs cleanup
mbayer
parents:
0
diff
changeset
|
73 | void plan_buffer_line(const float &x, const float &y, const float &z, const float &e, float feed_rate, const uint8_t &extruder, bool laser_on); |
0 | 74 | |
75 | // Set position. Used for G92 instructions. | |
76 | void plan_set_position(const float &x, const float &y, const float &z, const float &e); | |
77 | void plan_set_e_position(const float &e); | |
78 | ||
79 | ||
80 | ||
81 | void check_axes_activity(); | |
82 | uint8_t movesplanned(); //return the nr of buffered moves | |
83 | ||
84 | extern unsigned long minsegmenttime; | |
85 | extern float max_feedrate[4]; // set the max speeds | |
86 | extern float axis_steps_per_unit[4]; | |
87 | extern unsigned long max_acceleration_units_per_sq_second[4]; // Use M201 to override by software | |
88 | extern float minimumfeedrate; | |
89 | extern float acceleration; // Normal acceleration mm/s^2 THIS IS THE DEFAULT ACCELERATION for all moves. M204 SXXXX | |
90 | extern float retract_acceleration; // mm/s^2 filament pull-pack and push-forward while standing still in the other axis M204 TXXXX | |
91 | extern float max_xy_jerk; //speed than can be stopped at once, if i understand correctly. | |
92 | extern float max_z_jerk; | |
93 | extern float max_e_jerk; | |
94 | extern float mintravelfeedrate; | |
95 | extern unsigned long axis_steps_per_sqr_second[NUM_AXIS]; | |
96 | ||
97 | #ifdef AUTOTEMP | |
98 | extern bool autotemp_enabled; | |
99 | extern float autotemp_max; | |
100 | extern float autotemp_min; | |
101 | extern float autotemp_factor; | |
102 | #endif | |
103 | ||
104 | ||
105 | ||
106 | ||
107 | extern block_t block_buffer[BLOCK_BUFFER_SIZE]; // A ring buffer for motion instfructions | |
108 | extern volatile unsigned char block_buffer_head; // Index of the next block to be pushed | |
109 | extern volatile unsigned char block_buffer_tail; | |
110 | // Called when the current block is no longer needed. Discards the block and makes the memory | |
111 | // availible for new blocks. | |
112 | FORCE_INLINE void plan_discard_current_block() | |
113 | { | |
114 | if (block_buffer_head != block_buffer_tail) { | |
115 | block_buffer_tail = (block_buffer_tail + 1) & (BLOCK_BUFFER_SIZE - 1); | |
116 | } | |
117 | } | |
118 | ||
119 | // Gets the current block. Returns NULL if buffer empty | |
120 | FORCE_INLINE block_t *plan_get_current_block() | |
121 | { | |
122 | if (block_buffer_head == block_buffer_tail) { | |
123 | return(NULL); | |
124 | } | |
125 | block_t *block = &block_buffer[block_buffer_tail]; | |
126 | block->busy = true; | |
127 | return(block); | |
128 | } | |
129 | ||
130 | // Gets the current block. Returns NULL if buffer empty | |
131 | FORCE_INLINE bool blocks_queued() | |
132 | { | |
133 | if (block_buffer_head == block_buffer_tail) { | |
134 | return false; | |
135 | } | |
136 | else | |
137 | return true; | |
138 | } | |
139 | ||
140 | void allow_cold_extrudes(bool allow); | |
141 | #endif |