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 ;
20
20
const float STEP_SIZE = 0 .05f ; // mm
21
21
22
22
struct Segment {
@@ -39,12 +39,15 @@ void initMotors() {
39
39
}
40
40
}
41
41
42
+ bool stepNow[N_AXIS];
43
+
42
44
void enableMotors () {
43
45
for (uint8_t a = 0 ; a < N_AXIS; ++a) {
44
46
digitalWrite (XDIR + a, HIGH);
45
47
}
46
48
for (uint8_t a = 0 ; a < N_AXIS; ++a) {
47
49
digitalWrite (XSTP + a, LOW);
50
+ stepNow[a] = 0 ;
48
51
}
49
52
digitalWrite (EN, LOW);
50
53
}
@@ -58,7 +61,7 @@ void setDirection(uint8_t axis, bool direction) {
58
61
}
59
62
60
63
void sendStep (uint8_t axis) {
61
- digitalWrite (XSTP + axis, ! digitalRead (XSTP ));
64
+ digitalWrite (XSTP + axis, (stepNow[axis] = !stepNow[axis] ));
62
65
}
63
66
64
67
void delayFor (float stepTime) {
@@ -67,7 +70,7 @@ void delayFor(float stepTime) {
67
70
68
71
void sendSegment (Segment const &segment) {
69
72
uint32_t maxAxisSteps = 0 ;
70
- uint32_t maxAxis = N_AXIS;
73
+ uint8_t maxAxis = N_AXIS;
71
74
for (uint8_t a = 0 ; a < N_AXIS; ++a) {
72
75
setDirection (a, segment.directions [a]);
73
76
if (segment.steps [a] > maxAxisSteps) {
@@ -82,24 +85,28 @@ void sendSegment(Segment const &segment) {
82
85
float topStepTime = 1 .0f / sqrtf (segment.topSpeedSqr );
83
86
float invertAcceleration = 1 .0f / segment.acceleration ;
84
87
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
+ }
87
94
for (uint32_t i = 0 ; i < maxAxisSteps; ++i) {
88
95
float speed1Sqr = segment.initSpeedSqr + twiceAcceleration * i;
89
96
float speed2Sqr = segment.exitSpeedSqr + twiceAcceleration * (maxAxisSteps - 1 - i);
90
97
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 ) {
95
100
stepTime = (sqrtf (speedMinSqr + twiceAcceleration) - sqrtf (speedMinSqr)) * invertAcceleration;
96
101
}
97
102
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]];
101
109
}
102
- slaveDelta += 2 * segment.steps [slaveAxis];
103
110
delayFor (stepTime);
104
111
}
105
112
}
@@ -108,13 +115,13 @@ void setup() {
108
115
Serial.begin (115200 );
109
116
110
117
segments[0 ].directions [0 ] = 1 ;
111
- segments[0 ].steps [0 ] = 1000 ;
118
+ segments[0 ].steps [0 ] = 400 ;
112
119
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 );
118
125
119
126
initMotors ();
120
127
enableMotors ();
0 commit comments