deelPID, aanpasbare gains via pods

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
--- /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
--- /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
--- /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
--- /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
--- /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);
+        {}        
+}           
+             
+             
+             
+            
--- /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