Script voor aansturen motoren

Dependencies:   Encoder HIDScope MODSERIAL mbed-dsp mbed

Revision:
27:77bb255753be
Parent:
26:5981d4b1144e
--- a/main.cpp	Fri Oct 31 12:06:01 2014 +0000
+++ b/main.cpp	Fri Oct 31 13:04:51 2014 +0000
@@ -6,8 +6,8 @@
 #define TSAMP 0.005
 #define K_P1 (3.5) //voor motor1 is het 3.5
 #define K_I1 (0.01  *TSAMP) //voor motor1 is het 0.01
-#define K_P2 (1.0)
-#define K_I2 (0.01 *TSAMP)
+#define K_P2 (1.0)  //3.5
+#define K_I2 (0.01 *TSAMP) //0.1
 #define I_LIMIT 1.
 #define PI 3.14159265
 #define l_arm 0.5
@@ -44,7 +44,7 @@
 float speed2_rad;
 float pos_motor1_rad;
 float pos_motor2_rad;
-int staat = 0;
+int staat1 = 0;
 
 
 
@@ -69,6 +69,18 @@
     return out_p1 + out_i1;
 }
 
+float pid2(float setpoint2, float measurement2)
+{
+    float error2;
+    float           out_p2 = 0;
+    static float    out_i2 = 0;
+    error2  = (setpoint2 - measurement2);
+    out_p2  = error2*K_P1;
+    out_i2 += error2*K_I1;
+    clamp(&out_i2,-I_LIMIT,I_LIMIT);
+    return out_p2 + out_i2;
+}
+
 float prev_setpoint1 = 0;
 float setpoint1 = 0;
 float prev_setpoint2 = 0;
@@ -76,49 +88,34 @@
 
 void batje_links ()
 {
-    speed1_rad = -1.0; //positief is CCW, negatief CW (boven aanzicht)
-    cur_pos_motor1 = motor1.getPosition();
-    pos_motor1_rad = (float)cur_pos_motor1/(3600.0/(2.0*PI));
+    
+    speed1_rad = 6.0; //positief is CCW, negatief CW (boven aanzicht)
     setpoint1 = prev_setpoint1 + TSAMP * speed1_rad;
-    if(setpoint1 > (180*2.0*PI/360)) { //setpoint in graden
-        setpoint1 = (180*2.0*PI/360);
+    if(setpoint1 > (155.0*2.0*PI/360)) { //setpoint in graden
+        setpoint1 = (155.0*2.0*PI/360);
     }
-    if(setpoint1 < -(180*2.0*PI/360)) {
-        setpoint1 = -(180*2.0*PI/360);
+    if(setpoint1 < -(155.0*2.0*PI/360)) {
+        setpoint1 = -(155.0*2.0*PI/360);
     }
-
-    pwm_motor1.write(abs(pwm1_percentage));
     prev_setpoint1 = setpoint1;
-    wait(TSAMP);
-
 }
 
 void batje_rechts ()
 {
-    speed1_rad = 2.0; //positief is CCW, negatief CW (boven aanzicht)
-    cur_pos_motor1 = motor1.getPosition();
-    pos_motor1_rad = (float)cur_pos_motor1/(3200.0/(2.0*PI)); //moet 4128
+    speed1_rad = 6.0; //positief is CCW, negatief CW (boven aanzicht)
     setpoint1 = prev_setpoint1 + TSAMP * speed1_rad;
-    if(setpoint1 > (360*2.0*PI/360)) { //setpoint in graden
-        setpoint1 = (360*2.0*PI/360);
+    if(setpoint1 > (155.0*2.0*PI/360)) { //setpoint in graden
+        setpoint1 = (155.0*2.0*PI/360);
     }
-    if(setpoint1 < -(360*2.0*PI/360)) {
-        setpoint1 = -(360*2.0*PI/360);
+    if(setpoint1 < -(155.0*2.0*PI/360)) {
+        setpoint1 = -(155.0*2.0*PI/360);
     }
-    pwm_motor1.write(abs(pwm1_percentage));
     prev_setpoint1 = setpoint1;
-    if(setpoint1 > (360*2.0*PI/360)) {
-        staat = 1;
-    }
-    wait(TSAMP);
-
-
 }
 
 void arm_hoog () //LET OP, PAS VARIABELE NOG AAN DIT IS VOOR TESTEN
 {
     speed1_rad = 6.0; //positief is CCW, negatief CW (boven aanzicht)
- 
     setpoint1 = prev_setpoint1 + TSAMP * speed1_rad;
     if(setpoint1 > (155.0*2.0*PI/360)) { //setpoint in graden
         setpoint1 = (155.0*2.0*PI/360);
@@ -126,20 +123,15 @@
     if(setpoint1 < -(155.0*2.0*PI/360)) {
         setpoint1 = -(155.0*2.0*PI/360);
     }
-    pwm_motor1.write(abs(pwm1_percentage));
     prev_setpoint1 = setpoint1;
     if(setpoint1 >= (155.0*2.0*PI/360)-0.1) {
-     staat = 1;
+     staat1 = 1;
     }
-    
-
 }
 
 void arm_mid ()
 {
     speed1_rad = -3.0; //positief is CCW, negatief CW (boven aanzicht)
-    //cur_pos_motor1 = motor1.getPosition();
-    //os_motor1_rad = (float)cur_pos_motor1/(3200.0/(2.0*PI)); //moet 4128
     setpoint1 = prev_setpoint1 + (TSAMP * speed1_rad);
     if(setpoint1 > (155*2.0*PI/360)) { //setpoint in graden
         setpoint1 = (155*2.0*PI/360);
@@ -147,31 +139,36 @@
     if(setpoint1 < -(155*2.0*PI/360)) {
         setpoint1 = -(155*2.0*PI/360);
     }
-    //pc.printf("m%f\n\r",setpoint1);
-    //pwm_motor1.write(abs(pwm1_percentage));
     prev_setpoint1 = setpoint1;
-    
-    //wait(TSAMP);
 }
 
 void arm_laag ()
 {
-    speed2_rad = -1.0; //positief is CCW, negatief CW (boven aanzicht)
-    cur_pos_motor2 = motor2.getPosition();
-    pos_motor2_rad = (float)cur_pos_motor2/(3600/(2.0*PI));
-    setpoint2 = prev_setpoint2 + TSAMP * speed2_rad;
-    if(setpoint2 > (100*2.0*PI/360)) { //setpoint in graden
-        setpoint2 = (100*2.0*PI/360);
+    
+    speed1_rad = 6.0; //positief is CCW, negatief CW (boven aanzicht)
+    setpoint1 = prev_setpoint1 + TSAMP * speed1_rad;
+    if(setpoint1 > (155.0*2.0*PI/360)) { //setpoint in graden
+        setpoint1 = (155.0*2.0*PI/360);
     }
-    if(setpoint2 < -(100*2.0*PI/360)) {
-        setpoint2 = -(100*2.0*PI/360);
+    if(setpoint1 < -(155.0*2.0*PI/360)) {
+        setpoint1 = -(155.0*2.0*PI/360);
     }
-
-    pwm_motor2.write(abs(pwm2_percentage));
-    prev_setpoint2 = setpoint2;
-    wait(TSAMP);
+    prev_setpoint1 = setpoint1;   
 }
 
+void arm_begin ()
+{
+    
+    speed1_rad = 1.0; //positief is CCW, negatief CW (boven aanzicht)
+    setpoint1 = prev_setpoint1 + TSAMP * speed1_rad;
+    if(setpoint1 > (0.0*2.0*PI/360)) { //setpoint in graden
+        setpoint1 = (0.0*2.0*PI/360);
+    }
+    if(setpoint1 < -(0.0*2.0*PI/360)) {
+        setpoint1 = -(0.0*2.0*PI/360);
+    }
+    prev_setpoint1 = setpoint1;
+}
 int main()
 {
     int wait_iterator = 0;
@@ -182,38 +179,64 @@
     pc.baud(115200);
 
     while(1) {
+        
+        pc.printf("%d, %f \r\n", motor1.getPosition(), motor2.getPosition());
         //MOTOR1
-        pc.printf("%d \r\n", motor1.getPosition());
         cur_pos_motor1 = motor1.getPosition();
-        pos_motor1_rad = (float)cur_pos_motor1/(3200.0/(2.0*PI)); //moet 4128
+        pos_motor1_rad = (float)cur_pos_motor1/(4128.0/(2.0*PI)); //moet 4128
         pwm1_percentage = pid1(setpoint1, pos_motor1_rad);
+        
+        
         if (pwm1_percentage < -1.0) {
             pwm1_percentage = -1.0;
         }
         if (pwm1_percentage > 1.0) {
             pwm1_percentage = 1.0;
         }
+        
         pwm_motor1.write(abs(pwm1_percentage));
         if(pwm1_percentage > 0) {
             motordir1 = 0;
         } else {
             motordir1 = 1;
         }
+        
+        //MOTOR 2
+        cur_pos_motor2 = motor2.getPosition();
+        pos_motor2_rad = (float)cur_pos_motor2/(3200.0/(2.0*PI)); //moet 4128
+        pwm2_percentage = pid2(setpoint2, pos_motor2_rad);
+        
+        if (pwm2_percentage < -1.0) {
+            pwm2_percentage = -1.0;
+        }
+        if (pwm2_percentage > 1.0) {
+            pwm2_percentage = 1.0;
+        }
+        
+        pwm_motor2.write(abs(pwm2_percentage));
+        if(pwm2_percentage > 0) {
+            motordir2 = 0;
+        } else {
+            motordir2 = 1;
+        }
+        
         wait(TSAMP);
+        
+        
         //STATES
-        if(staat == 0) {
+        if(staat1 == 0) {
             arm_hoog();
             wait_iterator = 0;
         } 
-        else if(staat ==1)
+        else if(staat1 == 1)
         {
             wait_iterator++;
             if(wait_iterator > 200)
-                staat = 2;
+                staat1 = 2;
         }
         else
         {
-            arm_mid();
+            arm_begin();
         }
        }
 }