interface to enable or disable acceleration management
This commit is contained in:
parent
0be21a9034
commit
7327b82585
2
main.c
2
main.c
@ -21,6 +21,7 @@
|
|||||||
#include <avr/io.h>
|
#include <avr/io.h>
|
||||||
#include <avr/sleep.h>
|
#include <avr/sleep.h>
|
||||||
#include <util/delay.h>
|
#include <util/delay.h>
|
||||||
|
#include "motion_plan.h"
|
||||||
#include "stepper.h"
|
#include "stepper.h"
|
||||||
#include "spindle_control.h"
|
#include "spindle_control.h"
|
||||||
#include "motion_control.h"
|
#include "motion_control.h"
|
||||||
@ -35,6 +36,7 @@ int main(void)
|
|||||||
beginSerial(BAUD_RATE);
|
beginSerial(BAUD_RATE);
|
||||||
printString("A");
|
printString("A");
|
||||||
config_init();
|
config_init();
|
||||||
|
mp_init(); // initialize the motion plan subsystem
|
||||||
st_init(); // initialize the stepper subsystem
|
st_init(); // initialize the stepper subsystem
|
||||||
mc_init(); // initialize motion control subsystem
|
mc_init(); // initialize motion control subsystem
|
||||||
spindle_init(); // initialize spindle controller
|
spindle_init(); // initialize spindle controller
|
||||||
|
@ -20,14 +20,17 @@
|
|||||||
|
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include "motion_plan.h"
|
#include "motion_plan.h"
|
||||||
#include "nuts_bolts.h"
|
#include "nuts_bolts.h"
|
||||||
#include "stepper.h"
|
#include "stepper.h"
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
struct Block block_buffer[BLOCK_BUFFER_SIZE]; // A ring buffer for motion instructions
|
struct Block block_buffer[BLOCK_BUFFER_SIZE]; // A ring buffer for motion instructions
|
||||||
volatile int block_buffer_head = 0; // Index of the next block to be pushed
|
volatile int block_buffer_head; // Index of the next block to be pushed
|
||||||
volatile int block_buffer_tail = 0; // Index of the block to process now
|
volatile int block_buffer_tail; // Index of the block to process now
|
||||||
|
uint8_t acceleration_management; // Acceleration management active?
|
||||||
|
|
||||||
inline uint32_t estimate_acceleration_distance(int32_t current_rate, int32_t target_rate, int32_t acceleration) {
|
inline uint32_t estimate_acceleration_distance(int32_t current_rate, int32_t target_rate, int32_t acceleration) {
|
||||||
return((target_rate*target_rate-current_rate*current_rate)/(2*acceleration));
|
return((target_rate*target_rate-current_rate*current_rate)/(2*acceleration));
|
||||||
@ -40,6 +43,27 @@ inline uint32_t estimate_acceleration_ticks(int32_t start_rate, int32_t accelera
|
|||||||
acceleration_per_tick));
|
acceleration_per_tick));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void mp_enable_acceleration_management() {
|
||||||
|
if (!acceleration_management) {
|
||||||
|
st_synchronize();
|
||||||
|
acceleration_management = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void mp_disable_acceleration_management() {
|
||||||
|
if(acceleration_management) {
|
||||||
|
st_synchronize();
|
||||||
|
acceleration_management = FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void mp_init() {
|
||||||
|
block_buffer_head = 0;
|
||||||
|
block_buffer_tail = 0;
|
||||||
|
mp_enable_acceleration_management();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Calculates trapezoid parameters so that the entry- and exit-speed is compensated by the provided factors.
|
// Calculates trapezoid parameters so that the entry- and exit-speed is compensated by the provided factors.
|
||||||
// In practice both factors must be in the range 0 ... 1.0
|
// In practice both factors must be in the range 0 ... 1.0
|
||||||
void calculate_trapezoid_for_block(struct Block *block, double entry_factor, double exit_factor) {
|
void calculate_trapezoid_for_block(struct Block *block, double entry_factor, double exit_factor) {
|
||||||
@ -103,7 +127,13 @@ void mp_buffer_line(int32_t steps_x, int32_t steps_y, int32_t steps_z, uint32_t
|
|||||||
block->rate_delta = round(
|
block->rate_delta = round(
|
||||||
(settings.acceleration/(60.0*ACCELERATION_TICKS_PER_SECOND))/ // acceleration mm/min per acceleration_tick
|
(settings.acceleration/(60.0*ACCELERATION_TICKS_PER_SECOND))/ // acceleration mm/min per acceleration_tick
|
||||||
travel_per_step); // convert to: acceleration steps/min/acceleration_tick
|
travel_per_step); // convert to: acceleration steps/min/acceleration_tick
|
||||||
calculate_trapezoid_for_block(block,0,0); // compute a default trapezoid
|
if (acceleration_management) {
|
||||||
|
calculate_trapezoid_for_block(block,0,0); // compute a conservative acceleration trapezoid for now
|
||||||
|
} else {
|
||||||
|
block->accelerate_ticks = 0;
|
||||||
|
block->plateau_ticks = 0;
|
||||||
|
block->rate_delta = 0;
|
||||||
|
}
|
||||||
|
|
||||||
// Compute direction bits for this block
|
// Compute direction bits for this block
|
||||||
block->direction_bits = 0;
|
block->direction_bits = 0;
|
||||||
@ -112,7 +142,5 @@ void mp_buffer_line(int32_t steps_x, int32_t steps_y, int32_t steps_z, uint32_t
|
|||||||
if (steps_z < 0) { block->direction_bits |= (1<<Z_DIRECTION_BIT); }
|
if (steps_z < 0) { block->direction_bits |= (1<<Z_DIRECTION_BIT); }
|
||||||
// Move buffer head
|
// Move buffer head
|
||||||
block_buffer_head = next_buffer_head;
|
block_buffer_head = next_buffer_head;
|
||||||
// Ensure that block processing is running by enabling The Stepper Driver Interrupt
|
|
||||||
ENABLE_STEPPER_DRIVER_INTERRUPT();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -50,6 +50,9 @@ extern struct Block block_buffer[BLOCK_BUFFER_SIZE]; // A ring buffer for motion
|
|||||||
extern volatile int block_buffer_head; // Index of the next block to be pushed
|
extern volatile int block_buffer_head; // Index of the next block to be pushed
|
||||||
extern volatile int block_buffer_tail; // Index of the block to process now
|
extern volatile int block_buffer_tail; // Index of the block to process now
|
||||||
|
|
||||||
|
// Initialize the motion plan subsystem
|
||||||
|
void mp_init();
|
||||||
|
|
||||||
// Add a new linear movement to the buffer. steps_x, _y and _z is the signed, relative motion in
|
// Add a new linear movement to the buffer. steps_x, _y and _z is the signed, relative motion in
|
||||||
// steps. Microseconds specify how many microseconds the move should take to perform. To aid acceleration
|
// steps. Microseconds specify how many microseconds the move should take to perform. To aid acceleration
|
||||||
// calculation the caller must also provide the physical length of the line in millimeters.
|
// calculation the caller must also provide the physical length of the line in millimeters.
|
||||||
@ -57,4 +60,10 @@ extern volatile int block_buffer_tail; // Index of the block to proces
|
|||||||
// st_buffer_line which also wakes up the stepper subsystem.
|
// st_buffer_line which also wakes up the stepper subsystem.
|
||||||
void mp_buffer_line(int32_t steps_x, int32_t steps_y, int32_t steps_z, uint32_t microseconds, double millimeters);
|
void mp_buffer_line(int32_t steps_x, int32_t steps_y, int32_t steps_z, uint32_t microseconds, double millimeters);
|
||||||
|
|
||||||
|
// Enables acceleration-management for upcoming blocks
|
||||||
|
void mp_enable_acceleration_management();
|
||||||
|
// Disables acceleration-management for upcoming blocks
|
||||||
|
void mp_disable_acceleration_management();
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
Loading…
Reference in New Issue
Block a user