Dependencies:   mbed PID mbed-rtos

Revision:
7:15e6fc689368
Parent:
6:a80300ee574d
Child:
8:1655d27152e6
--- a/main.cpp	Thu May 09 11:50:43 2019 +0000
+++ b/main.cpp	Thu May 16 20:42:39 2019 +0000
@@ -3,24 +3,16 @@
 #include "math.h"
 #include "Phaserunner.h"
 #include "Daumenbetaetigung.h"
+#include "Handgriffbetaetigung.h"
+#include "PID.h"
 #define PI 3.14159
-#include "Handgriffbetaetigung.h"
 
-bool reset = false;
-Encoder encoder;  
-void Nullstelle()
-{
-    float angle = encoder.readAngle();
-    printf("angle%.3f\n\r", angle);
-    encoder.reset();
-    reset = true;
-}
 
 
 
 int main(){
-    Encoder encoder; 
-    
+
+     
     RawSerial pedalL(PC_10, PC_11, 115200);
     RawSerial pedalR(PC_12, PD_2, 115200);
     Phaserunner linkspedal(pedalL);
@@ -39,7 +31,9 @@
     DigitalOut PedalR_ON_OFF(PC_15);
     DigitalIn Taste(PC_8);
     
-    InterruptIn NullStell(PA_13);  
+    PinName Hallsensor(PA_13);  
+    Encoder encoder(Hallsensor); 
+    
     Serial pc(USBTX,USBRX);
     DigitalOut led(LED2);
     DigitalOut ON_OFF(PH_1);
@@ -48,19 +42,22 @@
     DigitalOut Abhinten(PC_13);
  
     ON_OFF = true;
-    uint16_t rot,rotOld;
+    uint16_t rot,rotOld,daumenValue;
     double angle_rad, angleOld=0;
     float a=0.0f,b=0.0f,beta=0.0f; // Ellipse Parameters
     float R=0.0f, phi=0.0f, Rold=0.0f;
     float strom, spannung, leistung;
     float leistungsOffset = 15.0f; // Leerlauf Leistung 
-    float MessungP[2001], MessungFil[2001],MessungFreq[2001], MessungRPM[2001];
+    float RPM, Acc; // Value form Encoder
+    float MessungP[4001], MessungFreq[4001],MessungAngle[4001], MessungPID[4001];
+    float rec=0.0f; // recuperation 0..100%
+    float recAntret;
     uint32_t i=0;
 
     led = false;
     pc.printf("Hello bike\n\r");
 
-    float rec=0.0f;
+    
     PedalL_ON_OFF = true;
     PedalR_ON_OFF = true;
     wait(0.2);
@@ -73,75 +70,134 @@
     pc.printf("Siamo accesi\n\r");
     wait(1);
     
-    // Lowpass Filter
+    linkspedal.sendBuffer(156,4900);
+    rechtspedal.sendBuffer(156,4900);
+    
+    linkspedal.sendBuffer(495,0);
+    rechtspedal.sendBuffer(495,0);
+    wait(0.2);
+    
+    // Lowpass Filter Leistung
     float T_ab = 0.005; // Abtastzeit: 5ms
     float F_ab = 1/T_ab; // Abtastfrequenz
     float Omega_c = 2*PI*F_ab/750; // 750 Mal kleiner als die Abtastfrequenz
     float sf = (Omega_c*T_ab)/(1+Omega_c*T_ab);//smoothing factor
-    float F_Value, F_ValueOld = 0.0f;
+    float F_Value, F_ValueOld = 0.0f; 
+    
+    // Lowpass Filter RPM
+    float Omega_cRPM = 2*PI*F_ab/150; // 150 Mal kleiner als die Abtastfrequenz
+    float sfRPM = (Omega_cRPM*T_ab)/(1+Omega_cRPM*T_ab);//smoothing factor
+    float F_RPM, F_RPMOld = 0.0f;
+    
+    // Lowpass Filter Acceleration
+    float Omega_cAcc = 2*PI*F_ab/200; // 200 Mal kleiner als die Abtastfrequenz
+    float sfAcc = (Omega_cAcc*T_ab)/(1+Omega_cAcc*T_ab);//smoothing factor
+    float F_Acc, F_AccOld = 0.0f;
+    
     //Diskrete Ableitung
     float dt = 0.005f; //5ms
     float PedaleFreq = 0.0f,PedaleFreqOld = 0.0f, PedaleFreqFil, PedaleFreqFilOld=0.0f; // in rad/s
-    bool init= false;
+    
+    // PID instance
+    float Kp = 1.0, Ki = 20.0, Kd = 0.0;
+    PID pid(Kp, Ki, Kd, dt);
+    pid.setInputLimits(0.0,200.0);
+    pid.setOutputLimits(1.0,100.0);
+    pid.setMode(1); //Regulator
+    
+    // Antretvariablen
+    uint16_t verlauf=0;
+    float tau=0.9; // tau für exponentiel funktion in s : 0.9s;
+    
+    bool init1= false, init = false;
     
-    //NullStell.fall(NULL);
+    while(!encoder.reset()){
+        if(!init){
+           rechtspedal.sendBuffer(495,0.2*4096);
+           init = true;
+           wait(0.005);
+           rechtspedal.sendBuffer(495,0.03*4096);
+        }
+    }
+    rechtspedal.sendBuffer(495,0); 
+    init = false;
 while(1){
-        for(i=0;i<2000;i++){
-            //if(reset) NullStell.fall(NULL);
+        while(i<4000){
+
+            
             // Measure data form sensors
             angle_rad = encoder.readAngle();
+            RPM = encoder.readRPM();
+            Acc = encoder.readAcceleration();
             strom = ((Strom.read()*3.3f)-2.5f)/0.025f; 
             spannung = (Spannung.read()*42.95f);
             leistung = strom*spannung-leistungsOffset; 
             
-            // LowPass Filter
+            // LowPass Filter leistung
             F_Value = sf * leistung + (1-sf)*F_ValueOld;
             
-            // Diskrete Ableitung
-            PedaleFreq = (angle_rad - angleOld) / dt;
+            // LowPass Filter RPM
+            F_RPM = sfRPM * RPM + (1-sfRPM)*F_RPMOld;
+            
+            // LowPass Filter ACC
+            F_Acc = sfAcc * Acc + (1-sfAcc)*F_AccOld;
             
-            // Set first OldValue to actual value
-            if(!init){
-                PedaleFreqOld = PedaleFreq;
-                PedaleFreqFilOld = PedaleFreq;
-                init = true;
-            }            
-            // Filter Nulldurchgang mit der Messung der Winkels und Frequenz Grenz [5,5]rad/s
-            if(((PedaleFreq - PedaleFreqOld) > 5.0) || ((PedaleFreq - PedaleFreqOld) < -5.0f) ){
-               PedaleFreqFil = PedaleFreqFilOld;
-            } 
-            else{
-               PedaleFreqFil = PedaleFreq;
-            }
-            a = 1.0f;
-            b = 0.4f;
-            beta = 0.0f;
+            // Regulator
+            //if(F_RPM > 1.1 * pid.getSetPoint()) pid.setSetPoint(F_RPM);
+            //else if (F_RPM < 0.9f * pid.getSetPoint()) pid.setSetPoint(F_RPM);
+            pid.setSetPoint(80.0);
+            
+            pid.setProcessValue(F_RPM);
+            
+            
+
+            // Ellipse
+            a = 1.0f; // % of Torque Max 0..1
+            b = 0.6f; // % of Torque Max 0..1
+            beta = 0.52f; // 30°
             phi = angle_rad;  
             R = sqrt(pow(a,2) * pow(sin(beta + phi),2) + pow(b,2) * pow(cos(beta + phi),2)); // Torque in function of the Ellipse parameters
-            rec = daumen.getValue()*R;
-        
-            GegenMomRechts.write(rec*0.008f);
-            GegenMomLinks.write(rec*0.008f);
-            linkspedal.setTorque(0);
-            rechtspedal.setTorque(0);
-      
-            //  Save Values in Array
-            MessungP[i]=leistung;
-            //MessungFil[i] = F_Value;
-            MessungFreq[i] = PedaleFreqFil;
-            MessungRPM[i] = PedaleFreqFil / (2.0*PI) * 60.0;
+            daumenValue = 5;
+            if(daumenValue < 1) daumenValue = 1;
+            rec = ((float)daumenValue)+(R*pid.getCalculation());
             
+            // Antret
+            if(F_RPM > 2.0 && !init1) init1 = true;
+            if(!init && init1){
+                recAntret = 80*exp(-(dt*verlauf)/ tau);
+                verlauf++;
+                if(recAntret < 5) init = true; // Use ellipse when rec_start < 5%
+            }
+            if(!init) rec = R * recAntret;
+            else{
+                // if(F_Acc > 5.0){
+                    rec = rec ;
+                 //}
+            }
+            if(rec < 0.0) rec = 0.0;      
+            GegenMomRechts.write(0.02+(rec*0.008f)); // offset for 0.2V -> ~0.02
+            GegenMomLinks.write(0.02+(rec*0.008f));  // offset for 0.2V -> ~0.02
+
             
+           MessungP[i] = pid.getSetPoint();
+           MessungFreq[i] = F_RPM;
+           MessungPID[i] = rec;
+
             // Store Old Values
             angleOld = angle_rad;
             F_ValueOld = F_Value;
-            PedaleFreqOld = PedaleFreq; 
-            PedaleFreqFilOld = PedaleFreqFil;
-            wait(0.004);// Set to 5 ms
-        }
-        for(i=0;i<2000;i++){
-            printf("%.3f,%.3f,%.3f;...\n\r",MessungP[i], MessungFreq[i], MessungRPM[i]);
-        }
+            F_RPMOld = F_RPM;
+            F_AccOld = F_Acc;
+            i++;
+            wait(0.005);// Set to 5 ms
+       }
+       printf("[");
+       for(i=0;i<3999;i++){
+            printf("%.3f,%.3f,%.3f;...\n\r",MessungP[i],MessungFreq[i],MessungPID[i]);
+       }
+       printf("%.3f,%.3f,%.3f];\n\r",MessungP[3999],MessungFreq[3999],MessungPID[3999]);
+       i=0; 
+       
 }