ti bisogna il phaserunner
Dependencies: mbed PID mbed-rtos
main.cpp
- Committer:
- EpicG10
- Date:
- 2019-05-09
- Revision:
- 6:a80300ee574d
- Parent:
- 5:57fbb5d30d3d
- Child:
- 7:15e6fc689368
File content as of revision 6:a80300ee574d:
#include "mbed.h" #include "Encoder.h" #include "math.h" #include "Phaserunner.h" #include "Daumenbetaetigung.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); Phaserunner rechtspedal(pedalR); Daumenbetaetigung daumen; Handgriffbetaetigung gasGlied; AnalogIn Strom(PB_0); AnalogIn Spannung(PC_1); AnalogOut GegenMomLinks(PA_4); AnalogOut GegenMomRechts(PA_5); DigitalOut PedalL_ON_OFF(PC_14); DigitalOut PedalR_ON_OFF(PC_15); DigitalIn Taste(PC_8); InterruptIn NullStell(PA_13); Serial pc(USBTX,USBRX); DigitalOut led(LED2); DigitalOut ON_OFF(PH_1); DigitalOut Abvorne(PB_7); DigitalOut Abhinten(PC_13); ON_OFF = true; uint16_t rot,rotOld; 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]; 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); PedalL_ON_OFF = false; PedalR_ON_OFF = false; wait(0.2); PedalL_ON_OFF = true; PedalR_ON_OFF = true; float LeerlaufLeistung = 15.0f; pc.printf("Siamo accesi\n\r"); wait(1); // Lowpass Filter 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; //Diskrete Ableitung float dt = 0.005f; //5ms float PedaleFreq = 0.0f,PedaleFreqOld = 0.0f, PedaleFreqFil, PedaleFreqFilOld=0.0f; // in rad/s bool init= false; //NullStell.fall(NULL); while(1){ for(i=0;i<2000;i++){ //if(reset) NullStell.fall(NULL); // Measure data form sensors angle_rad = encoder.readAngle(); strom = ((Strom.read()*3.3f)-2.5f)/0.025f; spannung = (Spannung.read()*42.95f); leistung = strom*spannung-leistungsOffset; // LowPass Filter F_Value = sf * leistung + (1-sf)*F_ValueOld; // Diskrete Ableitung PedaleFreq = (angle_rad - angleOld) / dt; // 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; 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; // 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]); } } }