hey guys its me again-
i kinda wrote my own AccelStepper Lib cuz i wanna change things up and add some funktions for later projects.
Accelstepper is based on basic math and there are a lot of things i dont need in my case.
Im only using stepperdrivers so I left out a lot of things.
now the problem: my motor is running, yet its weirdly ticking. its the same code as in Accelstepper so it should work :o yet it doesnt run as smooth as it does in accelstepper and the question is why..
any advice?`
heres the code:
#include "StepperControl.h"
void StepperControl::moveAbs( long absolute) {
_targetPos = absolute;
computeNewSpeed();
}
void StepperControl::moveRel(long relative) {
moveAbs(_currentPos + relative);
}
boolean StepperControl::runGeschw() {
unsigned long zeit = millis();
if (zeit > _lastStepTime + _stepInterval)
{
if ( _speed > 0 )
{
_currentPos += 1;
}
else if ( _speed < 0 )
{
_currentPos -= 1;
}
schritt(_currentPos & 0x3);
_lastStepTime = zeit;
return true;
}
else
return false;
}
long StepperControl::distToGo() {
return _targetPos - _currentPos;
}
long StepperControl::targetPos() {
return _targetPos;
}
long StepperControl::currentPos() {
return _currentPos;
}
void StepperControl::setCurrentPos(long _position) {
_currentPos = _position;
}
void StepperControl::computeNewSpeed() {
setGeschw(desiredSpeed());
}
float StepperControl::desiredSpeed() {
long distanceTo = distToGo();
float requiredSpeed;
if (distanceTo == 0) return 0.0;
else if (distanceTo > 0) requiredSpeed = sqrt(2.0 * distanceTo * _acceleration);
else requiredSpeed = -sqrt(2.0 * -distanceTo * _acceleration);
if (requiredSpeed > _speed)
{
if (_speed == 0) requiredSpeed = sqrt(2.0 * _acceleration);
else requiredSpeed = _speed + abs(_acceleration / _speed);
if (requiredSpeed > _maxSpeed) requiredSpeed = _maxSpeed;
}
else if (requiredSpeed < _speed) {
if (_speed == 0) requiredSpeed = -sqrt(2.0 * _acceleration);
else requiredSpeed = _speed - abs(_acceleration / _speed);
if (requiredSpeed < -_maxSpeed) requiredSpeed = -_maxSpeed;
}
return requiredSpeed;
}
boolean StepperControl::go() {
if (_targetPos == _currentPos) return false;
if (runGeschw()) {
computeNewSpeed();
return true;
}
}
StepperControl::StepperControl(uint8_t pin_1, uint8_t pin_2) {
_pins=1;
_pin1 = pin_1;
_pin2 = pin_2;
_currentPos = 0;
_targetPos = 0;
_speed = 0;
_maxSpeed = 1;
_acceleration = 1;
_stepInterval = 0;
_lastStepTime = 0;
}
void StepperControl::setMaxGeschw(float geschw) {
_maxSpeed = geschw;
computeNewSpeed();
}
void StepperControl::setBeschl(float acceleration) {
_acceleration = acceleration;
computeNewSpeed();
}
void StepperControl::setGeschw( float geschw) {
_speed = geschw;
_stepInterval = abs(1000.0 / _speed);
}
float StepperControl::getGeschw() {
return _speed;
}
void StepperControl::schritt(uint8_t schritt)
{
switch (_pins)
{
case 0:
//step0();
break;
case 1:
schritt1(schritt);
break;
case 2:
//step2(schritt);
break;
case 4:
// step4(schritt);
break;
}
}
void StepperControl::schritt1(uint8_t schritt) {
digitalWrite(_pin2, _speed > 0);
digitalWrite(_pin1, HIGH);
delayMicroseconds(1);
digitalWrite(_pin1, LOW);
}