1 changed files with 90 additions and 0 deletions
@ -0,0 +1,90 @@ |
|||||
|
#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); |
||||
|
} |
||||
|
} |
||||
|
} |
Loading…
Reference in new issue