motor controller with P velocity control

Dependencies:   HIDScope PID QEI mbed EMG

Fork of PID_VelocityExample by Aaron Berk

Revision:
14:102a2b4f5c86
Parent:
13:40141b362092
Child:
16:e9945e3b4712
--- a/main.cpp	Tue Oct 06 11:30:38 2015 +0000
+++ b/main.cpp	Tue Oct 06 14:17:11 2015 +0000
@@ -3,10 +3,13 @@
 #include "PID.h"
 #include "QEI.h"
 #include "HIDScope.h"
+#include <math.h>
+//#include "Point.cpp"
 #include "inits.h" // all globals, pin and variable initialization 
 
 void setGoFlag(){
-    if (goFlag==true){
+    if (goFlag==true && systemOn==true){
+        pc.printf("ERROR: INCORRECT TIMINGS, look at the setGoFlag \n\r");
         // flag is already set true: code too slow or frequency too high    
     }
     goFlag=true;
@@ -38,15 +41,60 @@
             request_pos = pot1.read();
             request_neg = pot2.read();
             
-            // determine if forward or backward signal is stronger and set reference
+            // determine if forward or backward signal is stronger
             if (request_pos > request_neg){
                 request = request_pos; 
             } 
             else {
                 request = -request_neg;
             }
-            leftController.setSetPoint(request);
-            rightController.setSetPoint(request);
+            
+            // calculate required rotational velocity from the requested horizontal velocity
+            // first get the current position from the motor encoders
+            leftAngle=(leftQei.getPulses()/round)*360;
+            rightAngle=(rightQei.getPulses()/round)*360;
+            if (leftAngle < -90 or leftAngle > 90 or rightAngle < -90 or rightAngle > 90 ){
+                pc.printf("out of bounds \n\r");
+                leftRequest=0;
+                rightRequest=0;
+                if (leftAngle < -90){leftRequest=0.1;}
+                if (leftAngle > 90){leftRequest=-0.1;}
+                if (rightAngle < -90){rightRequest=0.1;}
+                if (rightAngle > 90){rightRequest=-0.1;}
+            }
+            else {
+                currentX = (tan(rightAngle*M_PI/180)*l)/(tan(leftAngle*M_PI/180)+tan(rightAngle*M_PI/180));
+                currentY = tan(leftAngle*M_PI/180)*currentX;
+                
+                if (sqrt(pow(currentX,2)+pow(currentY,2)) > armlength){ // too far from left arm
+                    //return 0;
+                }
+                if (sqrt(pow(l-currentX,2)+pow(currentY,2)) > armlength){ // too far from right arm
+                    //return 0;
+                }
+                // calculate the position to go to according the the current position + the distance that should be covered in this timestep
+                toX=currentX+request*RATE*10; // should be request*RATE
+                //toX=5;
+                //toY=pCurrent.posY+0*RATE;
+                toY=currentY;
+            
+                toLeftAngle = atan(toY/toX)*180/M_PI;
+                toRightAngle = atan(toY/(l-toX))*180/M_PI;
+                
+                // calculate how much the angles should change in this timestep
+                leftDeltaAngle=toLeftAngle-leftAngle;
+                rightDeltaAngle=toRightAngle-rightAngle;
+                
+                // calculate the neccesairy velocities to make these angles happen.
+                leftRequest=(leftDeltaAngle/RATE);
+                rightRequest=(rightDeltaAngle/RATE);
+            }
+            
+            // set the PID controller to go with that speed.
+            leftController.setSetPoint(leftRequest);
+            rightController.setSetPoint(rightRequest);
+            
+            pc.printf("leftAngle: %f, rightAngle: %f, leftDeltaAngle: %f, rightDeltaAngle: %f \n\r", leftAngle, rightAngle, leftDeltaAngle, rightDeltaAngle);
             
             // *******************
             // Velocity calculation
@@ -80,20 +128,22 @@
             rightController.setProcessValue(rightVelocity);
             rightPwmDuty = rightController.compute();
             if (rightPwmDuty < 0){
-                rightDirection = 0;
+                rightDirection = 1;
                 rightMotor = -rightPwmDuty;
             }
             else {
-                rightDirection = 1;
+                rightDirection = 0;
                 rightMotor = rightPwmDuty;
             }
             
             // User feedback
-            scope.set(0, request);
+            scope.set(0, rightRequest);
             scope.set(1, rightPwmDuty);
             scope.set(2, rightVelocity);
+            scope.set(3, leftAngle);
+            scope.set(4, rightAngle);
             scope.send();
-            pc.printf("pot2: %f, request: %f, lefVelocity: %f, output: %f \n\r",pot2.read(),request,leftVelocity,leftPwmDuty);
+            //pc.printf("pot2: %f, request: %f, lefVelocity: %f, output: %f \n\r",pot2.read(),request,leftVelocity,leftPwmDuty);
         
             goFlag=false;
         }