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

#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);
}
}
}