A class for driving a stepper motor via driver with indexer.

Dependents:   StepperTest

StepperDriver.cpp

Committer:
tbjazic
Date:
2018-01-10
Revision:
3:05586e7efd2b
Parent:
2:70f593d34039

File content as of revision 3:05586e7efd2b:

#include "mbed.h"
#include "StepperDriver.h"

StepperDriver::StepperDriver(PinName outputPin, PinName directionPin) : output(outputPin), direction(directionPin) {
    currentPosition = previousPosition = desiredPosition = 0;
    configure(1.8f, 0, 900);
    homePosition = (maxPosition - minPosition) / 2;
    setSpeedSPS(250);
    setPulseWidth(100e-6);
}

void StepperDriver::configure(uint32_t resolution, float minDegrees, float maxDegrees) {
    setResolution(resolution);
    setDegreesRange(minDegrees, maxDegrees);
}

void StepperDriver::configure(float resolution, float minDegrees, float maxDegrees) {
    setResolution(resolution);
    setDegreesRange(minDegrees, maxDegrees);
}

void StepperDriver::setPosition(float desiredDegrees) {
    uint32_t position = desiredDegrees / degreesPerStep + 0.5f; // rounding
    if (position >= minPosition && position <= maxPosition) {
        desiredPosition = position;
    }
    if (desiredPosition != currentPosition && !isTickerAttached) {
        attachTicker();
    }
}

float StepperDriver::getPosition() {
    return currentPosition * degreesPerStep;
}

void StepperDriver::update() {
    if (desiredPosition > currentPosition) {
        direction = 1;
        currentPosition++;
        generateImpulse();
    } else if (desiredPosition < currentPosition) {
        direction = 0;
        currentPosition--;
        generateImpulse();
    } else {
        detachTicker();
    }
    previousPosition = currentPosition;
}

void StepperDriver::attachTicker() {
    ticker.attach(this, &StepperDriver::update, 1/speed);
    isTickerAttached = true;
}

void StepperDriver::detachTicker() {
    ticker.detach();
    isTickerAttached = false;
}

void StepperDriver::generateImpulse() {
    output = 1;
    timeout.attach(this, &StepperDriver::turnOutputOff, pulseWidth);
}

void StepperDriver::turnOutputOff() {
    output = 0;
}

void StepperDriver::setResolution(uint32_t resolution) {
    degreesPerStep = 360.0f / resolution;
}

void StepperDriver::setResolution(float resolution) {
    degreesPerStep = resolution;
}

void StepperDriver::setDegreesRange(float minDegrees, float maxDegrees) {
    minPosition = 0;
    maxPosition = minPosition + 1/degreesPerStep * (maxDegrees - minDegrees);
}

void StepperDriver::setSpeedSPS(float speedSPS) {
    speed = speedSPS;
}

void StepperDriver::setSpeedRPS(float speedRPS) {
    speed = speedRPS * 360 / degreesPerStep;
}

void StepperDriver::setSpeedRPM(float speedRPM) {
    speed = speedRPM / 60 * 360 / degreesPerStep;
}

float StepperDriver::getSpeedSPS() {
    return speed;
}

float StepperDriver::getSpeedRPS() {
    return speed * degreesPerStep / 360;
}

float StepperDriver::getSpeedRPM() {
    return speed * degreesPerStep / 360 * 60;
}

void StepperDriver::setPulseWidth(float pulseWidth) {
    if (pulseWidth > 0) {
        this->pulseWidth = pulseWidth;
    }
}