Skip to content

Commit 56e8d0d

Browse files
committed
finish multiaxis plan
1 parent 576a2c5 commit 56e8d0d

File tree

1 file changed

+44
-37
lines changed

1 file changed

+44
-37
lines changed

stepPlan/stepPlan.ino

Lines changed: 44 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,22 @@
1-
const int XSTP = 2;
2-
const int YSTP = 3;
3-
const int ZSTP = 4;
4-
const int XDIR = 5;
5-
const int YDIR = 6;
6-
const int ZDIR = 7;
7-
const int EN = 8;
8-
const int XLIM = 9;
9-
const int YLIM = 10;
10-
const int ZLIM = 11;
11-
const int ASTP = 12;
12-
const int ADIR = 13;
13-
const int ABORT = A0;
14-
const int HOLD = A1;
15-
const int RESUME = A2;
16-
const int COOLANT = A3;
17-
18-
const int N_AXIS = 2;
19-
const int N_SEGMENTS = 1;
1+
const uint8_t XSTP = 2;
2+
const uint8_t YSTP = 3;
3+
const uint8_t ZSTP = 4;
4+
const uint8_t XDIR = 5;
5+
const uint8_t YDIR = 6;
6+
const uint8_t ZDIR = 7;
7+
const uint8_t EN = 8;
8+
const uint8_t XLIM = 9;
9+
const uint8_t YLIM = 10;
10+
const uint8_t ZLIM = 11;
11+
const uint8_t ASTP = 12;
12+
const uint8_t ADIR = 13;
13+
const uint8_t ABORT = A0;
14+
const uint8_t HOLD = A1;
15+
const uint8_t RESUME = A2;
16+
const uint8_t COOLANT = A3;
17+
18+
const uint8_t N_AXIS = 2;
19+
const uint32_t N_SEGMENTS = 1;
2020
const float STEP_SIZE = 0.05f; // mm
2121

2222
struct Segment {
@@ -39,12 +39,15 @@ void initMotors() {
3939
}
4040
}
4141

42+
bool stepNow[N_AXIS];
43+
4244
void enableMotors() {
4345
for (uint8_t a = 0; a < N_AXIS; ++a) {
4446
digitalWrite(XDIR + a, HIGH);
4547
}
4648
for (uint8_t a = 0; a < N_AXIS; ++a) {
4749
digitalWrite(XSTP + a, LOW);
50+
stepNow[a] = 0;
4851
}
4952
digitalWrite(EN, LOW);
5053
}
@@ -58,7 +61,7 @@ void setDirection(uint8_t axis, bool direction) {
5861
}
5962

6063
void sendStep(uint8_t axis) {
61-
digitalWrite(XSTP + axis, !digitalRead(XSTP));
64+
digitalWrite(XSTP + axis, (stepNow[axis] = !stepNow[axis]));
6265
}
6366

6467
void delayFor(float stepTime) {
@@ -67,7 +70,7 @@ void delayFor(float stepTime) {
6770

6871
void sendSegment(Segment const &segment) {
6972
uint32_t maxAxisSteps = 0;
70-
uint32_t maxAxis = N_AXIS;
73+
uint8_t maxAxis = N_AXIS;
7174
for (uint8_t a = 0; a < N_AXIS; ++a) {
7275
setDirection(a, segment.directions[a]);
7376
if (segment.steps[a] > maxAxisSteps) {
@@ -82,24 +85,28 @@ void sendSegment(Segment const &segment) {
8285
float topStepTime = 1.0f / sqrtf(segment.topSpeedSqr);
8386
float invertAcceleration = 1.0f / segment.acceleration;
8487
float twiceAcceleration = 2.0f * segment.acceleration;
85-
int slaveAxis = 1 - maxAxis;
86-
int slaveDelta = 2 * segment.steps[slaveAxis] - maxAxisSteps;
88+
uint8_t slaveAxis[N_AXIS - 1];
89+
int32_t slaveDelta[N_AXIS - 1];
90+
for (uint8_t a = 0; a < N_AXIS - 1; ++a) {
91+
slaveAxis[a] = (maxAxis + 1 + a) % N_AXIS;
92+
slaveDelta[a] = 2 * segment.steps[slaveAxis[a]] - maxAxisSteps;
93+
}
8794
for (uint32_t i = 0; i < maxAxisSteps; ++i) {
8895
float speed1Sqr = segment.initSpeedSqr + twiceAcceleration * i;
8996
float speed2Sqr = segment.exitSpeedSqr + twiceAcceleration * (maxAxisSteps - 1 - i);
9097
float speedMinSqr = fminf(speed1Sqr, speed2Sqr);
91-
float stepTime;
92-
if (speedMinSqr >= segment.topSpeedSqr) {
93-
stepTime = topStepTime;
94-
} else {
98+
float stepTime = topStepTime;
99+
if (speedMinSqr < segment.topSpeedSqr) {
95100
stepTime = (sqrtf(speedMinSqr + twiceAcceleration) - sqrtf(speedMinSqr)) * invertAcceleration;
96101
}
97102
sendStep(maxAxis);
98-
if (slaveDelta > 0) {
99-
sendStep(slaveAxis);
100-
slaveDelta -= 2 * maxAxisSteps;
103+
for (uint8_t a = 0; a < N_AXIS - 1; ++a) {
104+
if (slaveDelta[a] > 0) {
105+
sendStep(slaveAxis[a]);
106+
slaveDelta[a] -= 2 * maxAxisSteps;
107+
}
108+
slaveDelta[a] += 2 * segment.steps[slaveAxis[a]];
101109
}
102-
slaveDelta += 2 * segment.steps[slaveAxis];
103110
delayFor(stepTime);
104111
}
105112
}
@@ -108,13 +115,13 @@ void setup() {
108115
Serial.begin(115200);
109116

110117
segments[0].directions[0] = 1;
111-
segments[0].steps[0] = 1000;
118+
segments[0].steps[0] = 400;
112119
segments[0].directions[1] = 0;
113-
segments[0].steps[1] = 300;
114-
segments[0].acceleration = 4000;
115-
segments[0].initSpeedSqr = squaref(10);
116-
segments[0].topSpeedSqr = squaref(1000);
117-
segments[0].exitSpeedSqr = squaref(10);
120+
segments[0].steps[1] = 4000;
121+
segments[0].acceleration = 100000;
122+
segments[0].initSpeedSqr = squaref(100);
123+
segments[0].topSpeedSqr = squaref(5000);
124+
segments[0].exitSpeedSqr = squaref(100);
118125

119126
initMotors();
120127
enableMotors();

0 commit comments

Comments
 (0)