Ibiltari Nora / StepperDriver
Revision:
1:9888802e71b9
Parent:
0:12be56dc6182
Child:
2:70f593d34039
--- 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