Files
AsteleMotor/stepper.cpp
2019-05-06 19:06:49 +02:00

93 lines
1.9 KiB
C++

#include "stepper.h"
#include "writepin.h"
void Stepper::tick()
{
if(++_tickCounter > UINT8_MAX - (_speed>>8) )
{
if(_targetStep != _currentStep)
{
step(_targetStep > _currentStep);
}
else if(endlessMove) step(endlessDriection);
_tickCounter = 0;
}
if(_speed>>8 < _targetSpeed) _speed = _speed + acceleration;
else if(_speed>>8 > _targetSpeed)_speed = _speed - acceleration;;
}
void Stepper::moveTo(const int32_t step)
{
_targetStep = step;
}
void Stepper::moveRelative(const int16_t dist)
{
moveTo(_targetStep + dist);
}
void Stepper::setSpeed(const uint8_t speed)
{
_targetSpeed = speed;
if(_targetSpeed < speedFloor) _targetSpeed = speedFloor;
}
void Stepper::setEndlesMove(bool endless, bool direction)
{
endlessMove = endless;
if(direction != endlessDriection)
{
_speed = speedFloor;
endlessDriection = direction;
}
}
uint32_t Stepper::isAt()
{
return _currentStep;
}
bool Stepper::isStoped()
{
return _currentStep == _targetStep;
}
void Stepper::step(bool direction)
{
switch(_currentStep & 0x03)
{
case 0:
writePin(_port, _pinA, true);
writePin(_port, _pinB, false);
writePin(_port, _pinC, false);
writePin(_port, _pinD, true);
break;
case 1:
writePin(_port, _pinA, true);
writePin(_port, _pinB, true);
writePin(_port, _pinC, false);
writePin(_port, _pinD, false);
break;
case 2:
writePin(_port, _pinA, false);
writePin(_port, _pinB, true);
writePin(_port, _pinC, true);
writePin(_port, _pinD, false);
break;
case 3:
writePin(_port, _pinA, false);
writePin(_port, _pinB, false);
writePin(_port, _pinC, true);
writePin(_port, _pinD, true);
break;
default:
writePin(_port, _pinA, false);
writePin(_port, _pinB, false);
writePin(_port, _pinC, false);
writePin(_port, _pinD, false);
}
_currentStep = _currentStep + (direction ? 1 : -1);
if(endlessMove) _targetStep = _currentStep;
}