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.
90 lines
2.7 KiB
90 lines
2.7 KiB
#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);
|
|
}
|
|
}
|
|
}
|