2 motor control

Dependencies:   Encoder QEI mbed

Files at this revision

API Documentation at this revision

Comitter:
bako
Date:
Wed Nov 01 09:47:36 2017 +0000
Commit message:
it works for 2 motors, angle increments go in different directions for the arms

Changed in this revision

Encoder.lib Show annotated file Show diff for this revision Revisions of this file
QEI.lib Show annotated file Show diff for this revision Revisions of this file
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 46cf63cba59a Encoder.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Encoder.lib	Wed Nov 01 09:47:36 2017 +0000
@@ -0,0 +1,1 @@
+https://developer.mbed.org/users/vsluiter/code/Encoder/#18b000b443af
diff -r 000000000000 -r 46cf63cba59a QEI.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QEI.lib	Wed Nov 01 09:47:36 2017 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/aberk/code/QEI/#5c2ad81551aa
diff -r 000000000000 -r 46cf63cba59a main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Wed Nov 01 09:47:36 2017 +0000
@@ -0,0 +1,102 @@
+/*
+* Parts of the code copied from PES lecture slides
+*/
+
+// include all necessary libraries
+#include "mbed.h"
+#include "QEI.h"
+
+//intialize all pins
+PwmOut motor1(D5);
+PwmOut motor2(D6);
+DigitalOut motor1Dir(D4); // direction of motor 1 (1 is ccw 0 is cw (looking at the shaft from the front))
+DigitalOut motor2Dir(D7); // direction of motor 2 (1 is ccw 0 is cw (looking at the shaft from the front))
+QEI motor1Encoder (D10,D11, NC, 624,QEI::X4_ENCODING);
+QEI motor2Encoder (D12,D13, NC, 624,QEI::X4_ENCODING);
+DigitalIn button1(D8); //button to move cw
+DigitalIn button2(D9); //button to move ccw
+
+//initialize variables
+double angleIncrement = 0.036; // increment of angle when button pressed (1 is a whole rotation (360 degrees))
+
+const double motor1KP=1.3; //Proportional gain of motor1 PI control
+const double motor1KI=0.5; //Integral gain of motor1 PI control
+const double motor1KD=0.5; // Differential gain of motor1 PID control
+
+const double motor2KP=1.3; //Proportional gain of motor1 PI control
+const double motor2KI=0.5; //Integral gain of motor1 PI control
+const double motor2KD=0.5; // Differential gain of motor1 PID control
+
+const double N=100; //LP filter coefficient
+const double encoderToMotor= 0.000119047619047619; //proportion of the rotation of the motor to the rotation of the encoder
+const double controllerTickerTime=0.01; //ticker frequency
+
+double motor1ErrorInt=0; //error of motor1 for the integrating part of PI controller
+double motor1ErrorDif=0; //error of motor1 for the integrating part of PI controller
+double desiredPos1 =0; //desired position of motor1
+
+double motor2ErrorInt=0; //error of motor1 for the integrating part of PI controller
+double motor2ErrorDif=0; //error of motor1 for the integrating part of PI controller
+double desiredPos2 =0; //desired position of motor1
+//initialize ticker for checking and correcting the angle
+Ticker myControllerTicker;
+
+
+double PIDController(double error, const double Kp, const double Ki, const double Kd, double Ts, const double N,double &intError, double &DifError){
+    const double a1 = -4/(N*Ts+2);
+    const double a2 = -(N*Ts-2)/(N*Ts+2);
+    const double b0 = (4*Kp + 4*Kd*N + 2*Ki*Ts + 2*Kp*N*Ts + Ki*N*pow(Ts,2))/(2*N*Ts + 4);
+    const double b1 = (Ki*N*pow(Ts,2) - 4*Kp - 4*Kd*N)/(N*Ts + 2);
+    const double b2 = (4*Kp + 4*Kd*N - 2*Ki*Ts - 2*Kp*N*Ts + Ki*N*pow(Ts,2))/(2*N*Ts + 4);
+
+    double v = error - a1*intError - a2*DifError;
+    double u = b0*v + b1*intError + b2*DifError;
+    DifError = intError; intError = v;
+    return u;
+}
+
+
+void motorButtonController(){
+    double position1= encoderToMotor*motor1Encoder.getPulses();
+    double posError1 = desiredPos1 - position1; 
+    
+    //change direction based on error sign
+    if(PIDController( posError1, motor1KP, motor1KI,motor1KD, controllerTickerTime, N, motor1ErrorInt ,motor1ErrorDif)>0) {
+        motor1Dir=0;
+    } else {
+        motor1Dir =1;
+    }
+    //set motor speed based on PI controller error
+    motor1 = fabs(PIDController( posError1, motor1KP, motor1KI,motor1KD, controllerTickerTime, N, motor1ErrorInt ,motor1ErrorDif));
+    
+    double position2= encoderToMotor*motor2Encoder.getPulses();
+    double posError2 = desiredPos2 - position2; 
+    
+    //change direction based on error sign
+    if(PIDController( posError2, motor2KP, motor2KI,motor2KD, controllerTickerTime, N, motor2ErrorInt ,motor2ErrorDif)>0) {
+        motor2Dir=0;
+    } else {
+        motor2Dir =1;
+    }
+    //set motor speed based on PI controller error
+    motor2 = fabs(PIDController( posError2, motor2KP, motor2KI,motor2KD, controllerTickerTime, N, motor2ErrorInt ,motor2ErrorDif));
+
+}
+
+int main(){
+    wait(2);
+    myControllerTicker.attach(&motorButtonController, controllerTickerTime);
+    while(1) {
+        if(!button1) {
+            desiredPos1+=angleIncrement;
+            desiredPos2-=angleIncrement;
+            wait(0.5f);
+        }
+
+        if(!button2) {
+            desiredPos1-=angleIncrement;
+            desiredPos2+=angleIncrement;
+            wait(0.5f);
+        }
+    }
+}
\ No newline at end of file
diff -r 000000000000 -r 46cf63cba59a mbed.bld
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Wed Nov 01 09:47:36 2017 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/fb8e0ae1cceb
\ No newline at end of file