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

Dependents:   StepperTest

Files at this revision

API Documentation at this revision

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