You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
91 lines
2.7 KiB
91 lines
2.7 KiB
4 years ago
|
#define dirPin 2
|
||
|
#define stepPin 3
|
||
|
#define endPin 4
|
||
|
|
||
|
long maxRange = 35000; // motor maximum excursion range - 35000
|
||
|
int brakeRange = 400; // motor lowSpeed range
|
||
|
int lowSpeed = 2000; // motor lower speed
|
||
|
int highSpeed = 2800; // motor higher speed
|
||
|
int inversionBreak = 10000; // motor pause time - 10000
|
||
|
|
||
|
long stepSpeed = 0;
|
||
|
bool dir = true;
|
||
|
long counter = 0;
|
||
|
bool rodEnd = false;
|
||
|
long brakeFactor = 0;
|
||
|
|
||
|
void setup() {
|
||
|
pinMode(stepPin, OUTPUT);
|
||
|
pinMode(dirPin, OUTPUT);
|
||
|
pinMode(endPin, INPUT);
|
||
|
digitalWrite(dirPin, dir);
|
||
|
|
||
|
while(!rodEnd) {
|
||
|
counter++;
|
||
|
if(counter <= brakeRange) {
|
||
|
brakeFactor = (lowSpeed / brakeRange) * counter;
|
||
|
stepSpeed = (highSpeed + brakeFactor > highSpeed + lowSpeed) ? highSpeed + lowSpeed : highSpeed + brakeFactor;
|
||
|
} else {
|
||
|
stepSpeed = highSpeed;
|
||
|
}
|
||
|
|
||
|
digitalWrite(stepPin, HIGH);
|
||
|
delayMicroseconds(stepSpeed);
|
||
|
digitalWrite(stepPin, LOW);
|
||
|
delayMicroseconds(stepSpeed);
|
||
|
|
||
|
if(digitalRead(endPin)) {
|
||
|
rodEnd = true;
|
||
|
counter = 0;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void loop() {
|
||
|
if(!dir) {
|
||
|
counter++;
|
||
|
if(counter >= maxRange) {
|
||
|
dir = !dir;
|
||
|
digitalWrite(dirPin, dir);
|
||
|
delay(inversionBreak);
|
||
|
} else {
|
||
|
if(counter >= maxRange - brakeRange) {
|
||
|
brakeFactor = (lowSpeed / brakeRange) * (maxRange - counter);
|
||
|
stepSpeed = (highSpeed + brakeFactor > highSpeed + lowSpeed) ? highSpeed + lowSpeed : highSpeed + brakeFactor;
|
||
|
} else if(counter <= brakeRange) {
|
||
|
brakeFactor = (lowSpeed / brakeRange) * counter;
|
||
|
stepSpeed = (highSpeed + brakeFactor > highSpeed + lowSpeed) ? highSpeed + lowSpeed : highSpeed + brakeFactor;
|
||
|
} else {
|
||
|
stepSpeed = highSpeed;
|
||
|
}
|
||
|
|
||
|
digitalWrite(stepPin, HIGH);
|
||
|
delayMicroseconds(stepSpeed);
|
||
|
digitalWrite(stepPin, LOW);
|
||
|
delayMicroseconds(stepSpeed);
|
||
|
}
|
||
|
} else {
|
||
|
counter--;
|
||
|
if(counter <= 0) {
|
||
|
dir = !dir;
|
||
|
digitalWrite(dirPin, dir);
|
||
|
delay(inversionBreak);
|
||
|
} else {
|
||
|
if(counter >= maxRange - brakeRange) {
|
||
|
brakeFactor = (lowSpeed / brakeRange) * (maxRange - counter);
|
||
|
stepSpeed = (highSpeed + brakeFactor > highSpeed + lowSpeed) ? highSpeed + lowSpeed : highSpeed + brakeFactor;
|
||
|
} else if(counter <= brakeRange) {
|
||
|
brakeFactor = (lowSpeed / brakeRange) * counter;
|
||
|
stepSpeed = (highSpeed + brakeFactor > highSpeed + lowSpeed) ? highSpeed + lowSpeed : highSpeed + brakeFactor;
|
||
|
} else {
|
||
|
stepSpeed = highSpeed;
|
||
|
}
|
||
|
|
||
|
digitalWrite(stepPin, HIGH);
|
||
|
delayMicroseconds(stepSpeed);
|
||
|
digitalWrite(stepPin, LOW);
|
||
|
delayMicroseconds(stepSpeed);
|
||
|
}
|
||
|
}
|
||
|
}
|