Simple pulse direction program for testing stepper motors.

Dependencies:   mbed

Files at this revision

API Documentation at this revision

Comitter:
OTBsolar
Date:
Fri Apr 29 09:15:32 2011 +0000
Commit message:

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r 999962b66e03 main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Fri Apr 29 09:15:32 2011 +0000
@@ -0,0 +1,98 @@
+#include "mbed.h"
+
+Timeout timer;
+Ticker ticker;
+DigitalOut stepled(LED1);   // Toggles on step
+DigitalOut ccled(LED2);     // Counterclockwise, =Dir
+DigitalOut correct(LED3);   // Checks if nr. of steps made = equal to index
+DigitalOut toggle(LED4);    // Proves life exists
+
+// MS1 MS2 MS3     Microstep Resolution 
+// Low Low Low     Full step 
+// Hig Low Low     Half step 
+// Low Hig Low     Quarter step 
+// Hig Hig Low     Eighth step 
+// Hig Hig Hig     Sixteenth step 
+DigitalOut MS1(p11);
+DigitalOut MS2(p12);
+DigitalOut MS3(p13);
+
+//Sleep and Reset not connected.
+DigitalOut enable(p20);
+
+DigitalOut Step(p21);
+DigitalOut Dir(p22);
+
+// Motor has 200 steps per rotation and is driven Sixteenth step in comment.
+// So 3200 microsteps per rotation
+
+int accel=30;       // steps/s^2
+int speed=32000;    // steps/s  /3200   = 10 Rounds/s *60    = 600RPM
+int index=12800;    // steps            = 4 rotations
+int count;
+
+void timeout() {
+    stepled=!stepled;
+    Step=1;                 // Rising edge
+    wait_us(5);             // Short high time
+    Step=0;
+    if(count<(index/2)) {   // Start accelerating untill the top speed is reached
+        if(accel*count<speed) {
+            timer.attach_us(&timeout,((1000000/((accel*count)+10))-5)); // decreasing time until next step
+        }                           // the +10 is to avoid dividing by 0 and boosts initial speed
+        else {      // don't go over the top speed
+            timer.attach_us(&timeout,((1000000/speed))-5);
+        }                           // the -5 is to compensate for the 5us high time :p
+    }
+    else if(count<index) {  // Halfway to the target, start decelerating
+        if(accel*(index-count)<speed) {
+            timer.attach_us(&timeout,((1000000/((accel*(index-count))+10))-5)); // increasing time until next stil
+        }
+        else {      // stay at top speed if needed
+            timer.attach_us(&timeout,((1000000/speed))-5); 
+        }
+    }
+    else {          // target reached
+        timer.detach();
+        stepled=0;
+        Step=0;
+        if(count==index) {  // Check if the right number of steps were made
+            correct=1;
+        }
+        else {
+            correct=0;
+        }
+    }
+    count++;        // ***INC STEPCOUNT***
+}
+        
+void toggler() {    // It toggles
+    toggle=!toggle;        
+}
+
+int main() {
+    // Initialize pololu drive
+    enable=0;   // Low active
+    MS1=1;      // Sixteenth
+    MS2=1;
+    MS3=1;
+    
+    // Initialize for movement
+    stepled=0;
+    count=0;
+    correct=0;
+    
+    timer.attach(&timeout,1);   // Initiate a movement
+    ticker.attach(&toggler,1);  // Toggle the live led on interrupt
+    while(1) {
+        wait(10); // Simulate some 10sec delay between commands
+        
+        // Initialize for next movement
+        Dir=!Dir;   // Toggle Direction
+        ccled=Dir;  // Make it obvious
+        count=0;    // Reset count
+        correct=0;  // Reset count=index check
+        
+        timer.attach(&timeout,1);   // Initiate a movement
+    }  
+}
\ No newline at end of file
diff -r 000000000000 -r 999962b66e03 mbed.bld
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Fri Apr 29 09:15:32 2011 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/63bcd7ba4912