A class for driving a stepper motor via driver with indexer.
Revision 1:9888802e71b9, committed 2016-12-02
- Comitter:
- tbjazic
- Date:
- Fri Dec 02 08:35:20 2016 +0000
- Parent:
- 0:12be56dc6182
- Child:
- 2:70f593d34039
- Commit message:
- Number of sine periods set to 10.
Changed in this revision
StepperDriver.cpp | Show annotated file Show diff for this revision Revisions of this file |
StepperDriver.h | Show annotated file Show diff for this revision Revisions of this file |
--- a/StepperDriver.cpp Thu Dec 01 13:35:45 2016 +0000 +++ b/StepperDriver.cpp Fri Dec 02 08:35:20 2016 +0000 @@ -3,12 +3,24 @@ StepperDriver::StepperDriver(PinName outputPin, PinName directionPin) : output(outputPin), direction(directionPin) { currentPosition = previousPosition = desiredPosition = 0; - maxPosition = 500; - minPosition = 0; + configure(1.8f, 0, 900); homePosition = (maxPosition - minPosition) / 2; + speed = 250; + pulseWidth = 100e-6; } -void StepperDriver::setPosition(uint32_t position) { +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; } @@ -17,6 +29,10 @@ } } +float StepperDriver::getPosition() { + return currentPosition * degreesPerStep; +} + void StepperDriver::update() { if (desiredPosition > currentPosition) { direction = 1; @@ -33,7 +49,7 @@ } void StepperDriver::attachTicker() { - ticker.attach(this, &StepperDriver::update, 4e-3); + ticker.attach(this, &StepperDriver::update, 1/speed); isTickerAttached = true; } @@ -44,9 +60,46 @@ void StepperDriver::generateImpulse() { output = 1; - timeout.attach(this, &StepperDriver::turnOutputOff, 100e-6); + 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; } \ No newline at end of file
--- a/StepperDriver.h Thu Dec 01 13:35:45 2016 +0000 +++ b/StepperDriver.h Fri Dec 02 08:35:20 2016 +0000 @@ -3,14 +3,82 @@ #include "mbed.h" +/** A class for driving a stepper motor in open loop. + * A driver must contain an indexer and sequencer. + * Each generated pulse moves the rotor by one step in a given direction. + */ class StepperDriver { + public: - StepperDriver(PinName, PinName); - void setPosition(uint32_t); + + /** Constructor receives output pin and direction pin. + * @param outputPin DigitalOut pin for sending pulses to the driver. + * @param directionPin DigitalOut pin for setting a direction of rotation. + */ + StepperDriver(PinName outputPin, PinName directionPin); + + /** Sets the motor resolution in steps per revolution (uint32_t) and minimum and maximum + * angle in degrees (angles range). + * @param resolution Resolution of the stepper motor in steps per revolution (uint32_t). + * Typical value is 200 steps per revolution, and that value is set by default in this class. + * @param minDegrees Minimum angle in degrees. + * @param maxDegrees Maximum angle in degrees. + */ + void configure(uint32_t resolution, float minDegrees, float maxDegrees); + + /** Sets the motor resolution in degrees per step (float) and minimum and maximum + * angle in degrees (angles range). + * @param resolution Resolution of the stepper motor in degrees per step (float). + * Typical value is 1.8 degrees per step, and that value is set by default in this class. + * @param minDegrees Minimum angle in degrees. + * @param maxDegrees Maximum angle in degrees. + */ + void configure(float resolution, float minDegrees, float maxDegrees); + + /** Sets the position in degrees. + * @param desiredPosition Desired position in degrees. + */ + void setPosition(float desiredPosition); - private: + /** Get the current position in degrees. + * @returns Current position in degrees. + */ + float getPosition(); + + /** Set the speed in rpm (revolutions per minute). + * @param speedRPM Motor speed in rpm (revolutions per minute). + */ + void setSpeedRPM(float speedRPM); + + /** Set the speed in revolutions per second. + * @param speedRPS Motor speed in revolutions per second. + */ + void setSpeedRPS(float speedRPS); + + /** Set the speed in steps per second. + * @param speedSPS Motor speed in rpm (revolutions per minute). + */ + void setSpeedSPS(float speedSPS); + + /** Get the speed in rpm (revolutions per minute). + * @returns Motor speed in rpm (revolutions per minute). + */ + float getSpeedRPM(); + + /** Get the speed in revolutions per second. + * @returns Motor speed in revolutions per second. + */ + float getSpeedRPS(); + + /** Get the speed in steps per second. + * @returns Motor speed in steps per second. + */ + float getSpeedSPS(); + + protected: DigitalOut output, direction; uint32_t currentPosition, previousPosition, homePosition, minPosition, maxPosition, desiredPosition; + float degreesPerStep, pulseWidth, speed; Ticker ticker; Timeout timeout; void update(); @@ -19,6 +87,9 @@ void generateImpulse(); void turnOutputOff(); bool isTickerAttached; + void setResolution(uint32_t resolution); + void setResolution(float resolution); + void setDegreesRange(float minDegrees, float maxDegrees); }; #endif \ No newline at end of file