Laurence B / Mbed 2 deprecated deelPID

Dependencies:   FastPWM HIDScope MODSERIAL QEI mbed

Files at this revision

API Documentation at this revision

Comitter:
laurencebr
Date:
Tue Oct 30 14:17:16 2018 +0000
Commit message:
pid controller;

Changed in this revision

FastPWM.lib Show annotated file Show diff for this revision Revisions of this file
HIDScope.lib Show annotated file Show diff for this revision Revisions of this file
MODSERIAL.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 2aa29a0824df FastPWM.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/FastPWM.lib	Tue Oct 30 14:17:16 2018 +0000
@@ -0,0 +1,1 @@
+http://os.mbed.com/users/Sissors/code/FastPWM/#c0b2265cff9c
diff -r 000000000000 -r 2aa29a0824df HIDScope.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HIDScope.lib	Tue Oct 30 14:17:16 2018 +0000
@@ -0,0 +1,1 @@
+http://os.mbed.com/users/tomlankhorst/code/HIDScope/#d23c6edecc49
diff -r 000000000000 -r 2aa29a0824df MODSERIAL.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MODSERIAL.lib	Tue Oct 30 14:17:16 2018 +0000
@@ -0,0 +1,1 @@
+http://os.mbed.com/users/Sissors/code/MODSERIAL/#da0788f0bd77
diff -r 000000000000 -r 2aa29a0824df QEI.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QEI.lib	Tue Oct 30 14:17:16 2018 +0000
@@ -0,0 +1,1 @@
+http://os.mbed.com/users/aberk/code/QEI/#5c2ad81551aa
diff -r 000000000000 -r 2aa29a0824df main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Tue Oct 30 14:17:16 2018 +0000
@@ -0,0 +1,244 @@
+#include "mbed.h"
+#include "FastPWM.h"
+#include "MODSERIAL.h"
+#include "QEI.h"
+#include "HIDScope.h"
+
+DigitalOut gpo(D0);
+DigitalOut led(LED_RED);
+AnalogIn pot1(A0);
+AnalogIn pot2(A1);
+AnalogIn pot3(A2);
+QEI encoder1(D10, D11, NC, 32);
+QEI encoder2(D12, D13, NC, 32);
+FastPWM Motor1PWM(D6);
+DigitalOut Motor1Direction(D7);
+FastPWM Motor2PWM(D5);            //!!!!! Juiste poorten aangeven
+DigitalOut Motor2Direction(D4);   //!!!!! Juiste poort aangeven
+
+MODSERIAL pc(USBTX, USBRX);
+
+//HIDSCOPE
+HIDScope    scope(4);
+Ticker      scopeTimer;
+
+
+///Variables
+
+double q1Error;
+double q2Error;
+double PrevErrorq1[100];
+double PrevErrorq2[100];
+int n = 100;            // Zelfde waarde als PrevErrorarray
+double q1Ref = 1.0;     //VOOR TESTEN
+double q2Ref;
+//Double xPos;
+//Double yPos;
+double xRef;
+double yRef;
+double q1Pos;
+double q2Pos;
+double PIDerrorq1;
+double PIDerrorq2;
+double IntegralErrorq1 = 0.0;
+double IntegralErrorq2 = 0.0;
+double DerivativeErrorq1 = 0.0;
+double DerivativeErrorq2 = 0.0;
+double GainP1 = 2.0;
+double GainI1 = 1.2;
+double GainD1 = 0.0;
+double GainP2 = 2.0;
+double GainI2 = 2.0;
+double GainD2 = 2.0;
+double TickerPeriod = 1.0/400.0;
+
+Ticker Kikker;
+int count = 0;
+int countstep = 0;
+
+
+
+void UpdateRefPosition()
+{
+  //  Update, (based on EMG or pots) the reference position xRef, yRef
+    //q1Ref = pot1.read()*2*3.1416;
+    //q2Ref = pot2.read()*2*3.1416;
+}
+
+
+void InverseKinematics()
+{
+  //  Convert, using the inverse kinematics relations, xRef and yRef to q1Ref and q2Ref
+// (So, update the values of q1Ref and q2Ref)
+}
+
+
+void ReadCurrentPosition()  //Update the coordinates of the end-effector q1Pos, q2Pos
+{    
+    q1Pos = encoder1.getPulses()/32/131.25*2*3.1416;        //Position motor 1 in rad
+    q2Pos = encoder2.getPulses()/32/131.25*2*3.1416;        //Position motor 2 in rad 
+}   
+
+void UpdateError()    //Update the q1Error and q2Error values based on q1Ref, q2Ref, q1Pos, q2Pos
+{
+    q1Error = q1Ref - q1Pos;
+    q2Error = q2Ref - q2Pos;
+
+    //Update PrevErrorq1 and PrevErrorq2
+    
+    for (int i = 0; i <= n-2 ; i++)
+    {
+        PrevErrorq1[i] = PrevErrorq1[i+1];
+        PrevErrorq2[i] = PrevErrorq2[i+1];
+    }
+    
+    PrevErrorq1[n-1] = q1Error;
+    PrevErrorq2[n-1] = q2Error;    
+}
+
+void PIDControl(){
+    // Update PIDerrorq1 and PIDerrorq2 based on the gains and the values q1Error and q2Error
+    
+    
+    // PID control motor 1
+        //P-Control
+        double P_error1 = GainP1 * q1Error;
+     
+        //I-Control
+        IntegralErrorq1 = IntegralErrorq1 + q1Error * TickerPeriod;
+        double I_error1 = GainI1 * IntegralErrorq1;
+     
+        //D-Control
+        //First smoothen the error signal
+        double MovAvq1_1 = 0.0;
+        double MovAvq1_2 = 0.0;
+        for (int i=0; i<=n-2; i++){   // Creates two mov. av. with one element shifted
+            MovAvq1_1 = MovAvq1_1 + PrevErrorq1[i]/((double) (n-1));
+            MovAvq1_2 = MovAvq1_2 + PrevErrorq1[i+1]/((double)(n-1));
+        }
+        DerivativeErrorq1 = (MovAvq1_2 - MovAvq1_1)/TickerPeriod;    
+        double D_error1 = GainD1 * DerivativeErrorq1;
+        // Derivative error sum over all time?   
+     
+    PIDerrorq1 = P_error1 + I_error1 + D_error1;
+    
+    // PID control motor 2
+        //P-Control
+        double P_error2 = GainP2 * q2Error;
+     
+        //I-Control
+        IntegralErrorq2 = IntegralErrorq2 + q2Error * TickerPeriod;
+        double I_error2 = GainI2 * IntegralErrorq2;
+     
+        //D-Control
+        //First smoothen the error signal
+        double MovAvq2_1 = 0.0;
+        double MovAvq2_2 = 0.0;
+        for (int i=0; i<=n-2; i++){   // Creates two mov. av. with one element shifted
+            MovAvq2_1 = MovAvq2_1 + PrevErrorq2[i]/((double)(n-1));
+            MovAvq2_2 = MovAvq2_2 + PrevErrorq2[i+1]/((double)(n-1));
+        }
+        DerivativeErrorq2 = (MovAvq2_2 - MovAvq2_1)/TickerPeriod;    
+        double D_error2 = GainD2 * DerivativeErrorq2;
+        // Derivative error sum over all time?   
+     
+    PIDerrorq2 = P_error2 + I_error2 + D_error2;
+}
+
+    
+void MotorControl()
+{
+        //Motor 1 
+        //Keep signal within bounds
+        if (PIDerrorq1 > 1.0){
+            PIDerrorq1 = 1.0;
+            }
+        else if (PIDerrorq1 < -1.0){
+            PIDerrorq1 = -1.0;
+            }     
+        //Direction    
+        if (PIDerrorq1 <= 0){
+            Motor1Direction = 0;
+            Motor1PWM.write(-PIDerrorq1); //write Duty cycle 
+        }        
+        if (PIDerrorq1 >= 0){
+            Motor1Direction = 1;
+            Motor1PWM.write(PIDerrorq1); //write Duty cycle 
+        }    
+        
+        //Motor 2 
+        //Keep signal within bounds
+        if (PIDerrorq2 > 1.0){
+            PIDerrorq2 = 1.0;
+            }
+        else if (PIDerrorq2 < -1.0){
+            PIDerrorq2 = -1.0;
+            }     
+        //Direction           
+          
+        if (PIDerrorq2 <= 0){
+            Motor2Direction = 0;
+            Motor2PWM.write(-PIDerrorq2); //write Duty cycle 
+        }        
+        if (PIDerrorq2 >= 0){
+            Motor2Direction = 1;
+            Motor2PWM.write(PIDerrorq2); //write Duty cycle 
+        }    
+}
+
+void NormalOperatingModus()
+{
+     UpdateRefPosition();
+     InverseKinematics();
+     ReadCurrentPosition();
+     UpdateError();
+     PIDControl();
+     MotorControl();
+     
+     scope.set(0, q1Pos);
+     scope.set(1, q1Ref);
+     
+     GainP1 = pot3.read() * 10;
+     GainI1 = pot2.read() * 10;
+     GainD1 = pot1.read() ;
+          
+     countstep++;
+     count++;
+     if (count == 400) // print 1x per seconde waardes.
+    {
+        pc.printf("GainP1 = %1f, GainI1 = %1f, GainD1 = %1f, q1Pos = %lf, q1Ref = %1f \n\r", GainP1, GainI1, GainD1, q1Pos, q1Ref);
+        count = 0;   
+    }
+     if (countstep == 4000)
+     {
+         q1Ref = !q1Ref;
+         countstep = 0;
+     }    
+         
+    
+}
+ 
+ 
+int main()
+{
+        pc.baud(115200);
+        //Initialize array errors to 0
+        for (int i = 0; i <= 9; i++){
+             PrevErrorq2[i] = 0;
+             PrevErrorq2[i] = 0;
+             }
+             
+        int frequency_pwm = 16700; //16.7 kHz PWM
+        Motor1PWM.period(1.0/frequency_pwm); // T = 1/f
+        Motor2PWM.period(1.0/frequency_pwm); // T = 1/f     
+        
+        Kikker.attach(NormalOperatingModus, TickerPeriod);
+        scopeTimer.attach_us(&scope, &HIDScope::send, 2e4);
+        
+        while(true);
+        {}        
+}           
+             
+             
+             
+            
diff -r 000000000000 -r 2aa29a0824df mbed.bld
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Tue Oct 30 14:17:16 2018 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/mbed_official/code/mbed/builds/97feb9bacc10
\ No newline at end of file