Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: StepperDriver.cpp
- Revision:
- 1:9888802e71b9
- Parent:
- 0:12be56dc6182
- Child:
- 2:70f593d34039
diff -r 12be56dc6182 -r 9888802e71b9 StepperDriver.cpp
--- 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