![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
mbed-os github
Dependencies: ADS1015 Faulhaber HTU21D_mod MS5837_potless Sensor_Head_RevB_3 USBDevice_dfu Utilsdfu beep
Fork of ARNSRS_testDFU by
Diff: main.cpp
- Revision:
- 85:98861c7bb3a1
- Parent:
- 84:49f0acf09f67
- Child:
- 87:314231bfaf8f
diff -r 49f0acf09f67 -r 98861c7bb3a1 main.cpp --- a/main.cpp Mon Sep 10 09:33:38 2018 +0000 +++ b/main.cpp Fri Sep 14 06:39:08 2018 +0000 @@ -131,19 +131,19 @@ float volet_fuite_Position; float Volets_Speed = 1; -float Volet_DeadBand = 5; +float Volet_DeadBand = 0; //Paramètre du PID -float Kc = 0.005; -float Ti = 0.1; -float Td = 0.0; +float Kc = 40; +float Ti = 0; +float Td = 0; float RATE_PID = 10.0; float Commande_PID; int consigne = 210; float Max_Input = 1000; float Min_Input = 80; -float Borne = 5; -float Max_Output = 90 - Borne;//Vérifier la valeur pour angle à laisser ouvert... +float Borne = 5; //ce sont des pourcentages +float Max_Output = 100 - Borne;//on laisse en pourcentage et on calcule l'angle après le compute float Min_Output = 0 + Borne; //Init PID @@ -570,10 +570,16 @@ while (true) { if (FLAG_PID == 1 && EN_MODE_SECU == false) { control_Servo.setProcessValue(ppO2); + float pid_output = control_Servo.compute(); + // on détermine le output comme un débit entre 0 et 100% et on fait le calcul d'angle ensuite + // on suppose pour simplifier que le débit est proportionnel à la surface projeté du papillon sur un plan perpendiculaire à la section du tuyau + // exemple pour 50% de débit, l'angle à ouvrir est de Acos(0.5)=60degrés + float angle = 90 + acos(1-pid_output/100)*180/3.14159265f; + DEBUG("\r\n pid_ouput = %f \r\n", pid_output); //Nouvelle sortie servo poumon si on est pas en mode SECU - Consigne_poumon = 90 - control_Servo.compute(); + Consigne_fuite = angle;//; // mode volets asservis (simule un seul moteur) - Consigne_fuite = 90 - Consigne_poumon; + Consigne_poumon = 90 - Consigne_fuite; //control_Servo.compute(); wait(RATE_PID); } } @@ -787,17 +793,17 @@ Kc = atof(numb); //control_Servo.reset(); control_Servo.setTunings(Kc, Ti, Td); - OUTPUT(" MAJ PID --> Kc = %f Ti = %f Td = %f\r\n", Kc, Ti, Td); + OUTPUT(" MAJ PID -- Kc = %f Ti = %f Td = %f\r\n", Kc, Ti, Td); } else if (0 == strcmp(com, "ti")) { Ti = atof(numb); //control_Servo.reset(); control_Servo.setTunings(Kc, Ti, Td); - OUTPUT(" MAJ PID --> Kc = %f Ti = %f Td = %f\r\n", Kc, Ti, Td); + OUTPUT(" MAJ PID -- Kc = %f Ti = %f Td = %f\r\n", Kc, Ti, Td); } else if (0 == strcmp(com, "td")) { Td = atof(numb); //control_Servo.reset(); control_Servo.setTunings(Kc, Ti, Td); - OUTPUT(" MAJ PID --> Kc = %f Ti = %f Td = %f\r\n", Kc, Ti, Td); + OUTPUT(" MAJ PID -- Kc = %f Ti = %f Td = %f\r\n", Kc, Ti, Td); } else if (0 == strcmp(com, "cons")) { consigne = atoi(numb); control_Servo.setSetPoint(consigne); @@ -1135,8 +1141,12 @@ //Update du PID if (FLAG_PID == 1 && EN_MODE_SECU == false) { control_Servo.setProcessValue(ppO2); + // il faut sortir le output comme un débit entre 0 et 100% et faire le calcul d'angle ensuite + // on suppose pour simplifier que le débit est proportionnel à la surface projeté du papillon sur un plan perpendiculaire à al section du tuyau + // exemple pour 50% de débit, l'angle à ouvrir est de Acos(0.5)=60degrés + float angle = 90 + acos(1-pid_output/100)*180/3.14159265f; //Nouvelle sortie servo poumon si on est pas en mode SECU - Consigne_poumon = 90 - control_Servo.compute(); + Consigne_poumon = 90 - angle; // mode volets asservis (simule un seul moteur) Consigne_fuite = 90 - Consigne_poumon; }