3#ifdef ATOM_STEPPER_MOTOR_MODULE
6StepperDriver::StepperDriver(
int number_of_steps,
int step_division,
int en_pin,
int dir_pin,
int step_pin)
8 this->number_of_steps = number_of_steps;
9 this->step_division = step_division;
10 this->step_interval = 10000;
11 this->last_step_time = 0;
12 this->target_step_time1 = 0;
13 this->target_step_time2 = 0;
16 this->en_pin = en_pin;
17 this->dir_pin = dir_pin;
18 this->step_pin = step_pin;
21 pinMode(en_pin, OUTPUT);
22 pinMode(dir_pin, OUTPUT);
23 pinMode(step_pin, OUTPUT);
29void StepperDriver::setSpeed(
float rpm)
31 step_interval = 60000000L / (number_of_steps * rpm * step_division);
36void StepperDriver::powerEnable(
bool ena)
39 digitalWrite(en_pin, LOW);
41 digitalWrite(en_pin, HIGH);
50void StepperDriver::step(
long steps_to_move)
52 steps_to_move *= step_division;
53 setDirection(steps_to_move);
54 last_step_time = micros();
56 for (
long i = abs(steps_to_move); i > 0; i--) {
63void StepperDriver::step(
long steps_to_move,
long steps_acc,
long steps_dec)
65 steps_to_move *= step_division;
66 steps_acc *= step_division;
67 steps_dec *= step_division;
68 setDirection(steps_to_move);
69 last_step_time = micros();
72 for (
long i = 1; i <= steps_acc; i++) {
73 dynamicMove( i , steps_acc );
77 for (
long i = (abs(steps_to_move) - abs(steps_acc) - abs(steps_dec)); i > 0; i--) {
82 for (
long i = (steps_dec - 1); i >= 0; i--) {
83 dynamicMove( i , steps_dec );
90void StepperDriver::setDirection(
long steps_to_move)
92 if (steps_to_move < 0) {
93 digitalWrite(dir_pin, HIGH);
96 digitalWrite(dir_pin, LOW);
102void StepperDriver::move()
104 digitalWrite(step_pin, HIGH);
105 moveInterval(step_interval);
110void StepperDriver::dynamicMove(
int s1,
int s2)
112 digitalWrite(step_pin, HIGH);
113 double r1 = (double)s1 / (
double)s2;
114 double r2 = 0.1 + 0.2*r1 + 2.2*r1*r1 - 1.5*r1*r1*r1;
115 moveInterval( (
unsigned long)(step_interval / r2) );
120void StepperDriver::moveInterval(
unsigned long target_delay)
122 target_step_time1 = last_step_time + (target_delay / 2);
123 target_step_time2 = last_step_time + target_delay;
125 if (target_step_time1 >= last_step_time) {
126 while (micros() < target_step_time1) {}
129 while ((
long)(micros()) < (
long)target_step_time1) {}
132 digitalWrite(step_pin, LOW);
134 if (target_step_time2 >= last_step_time) {
135 while (micros() < target_step_time2) {}
138 while ((
long)(micros()) < (
long)target_step_time2) {}
140 last_step_time = micros();