Hesu-eco
/
limiteur_vitesse
premiere ebauche
Diff: speedlimiter.cpp
- Revision:
- 6:1a4ed88c9a4b
- Parent:
- 5:aef1fc6c0df1
- Child:
- 7:d636d073b942
--- a/speedlimiter.cpp Thu Oct 25 17:43:21 2018 +0000 +++ b/speedlimiter.cpp Thu Oct 25 22:30:50 2018 +0000 @@ -93,32 +93,68 @@ return value; } +//// Proportionnel 3s +//float SpeedLimiter::ecoEnabledAlgorithm() +//{ +// static bool first_acquisition = true; +// +// // constantes calcules dans MATLAB +// double Kp = 1.6783e+03; //3.1848e+03 +// +// // valeurs anterieures +// static double ie = 0.0; +// +// // calculs +// double Vm = getMeasuredSpeed(); +// double Vd = getReferenceSpeed(); +// double out = 0.0; +// if (readAdcPedalHi() > 1) { +// double e = Vd - Vm; +// const double dt = TRANSFER_FUNCTION_PERIOD; +// ie = ie + e*dt; +// +// out = Kp*e; +// +// // out est maintenant en 'force' +// out = (out / 133240.0 * (PEDAL_HI_MAX_VALUE-PEDAL_HI_MIN_VALUE)) + PEDAL_HI_MIN_VALUE; +// +// if(first_acquisition) { +// pc->printf("Acquisition start:\n\r"); +// first_acquisition = false; +// } +// } else { +// ie = 0.00000000001; +// first_acquisition = true; +// } +// +// pc->printf("Vm: %.2f\t Vd: %.2f\t Eh: %.2f\t El: %.2f\n\r", Vm, Vd, out, out/2); +// +// return (float)out; +//} + +// PI 3s (meilleur a date) float SpeedLimiter::ecoEnabledAlgorithm() { static bool first_acquisition = true; - + // constantes calcules dans MATLAB - const double b0 = 3312.0; - const double b1 = -3061.0; - const double a1 = -1.0; + double var = readAdcTest(); + double Kp = 18000 ; //3.1848e+03 + double Ki = 4300.0; // 2.5181e+03 // valeurs anterieures - static double lastE = 0.0; - static double lastOut = 0.0; + static double ie = 0.0; // calculs double Vm = getMeasuredSpeed(); - double Vd = getReferenceSpeed(); + double Vd = 40 * var; double out = 0.0; if (readAdcPedalHi() > 1) { - - const double e = Vd - Vm; - - // y(n) = b0 * x(n) + b1 * x(n-1) - a1 * y(n-1) - out = (b0 * e) + (b1 * lastE) - (a1 * lastOut); - - lastE = e; - lastOut = out; + double e = Vd - Vm; + const double dt = TRANSFER_FUNCTION_PERIOD; + ie = ie + e*dt; + + out = Kp*e + Ki*ie; // out est maintenant en 'force' out = (out / 133240.0 * (PEDAL_HI_MAX_VALUE-PEDAL_HI_MIN_VALUE)) + PEDAL_HI_MIN_VALUE; @@ -127,63 +163,207 @@ pc->printf("Acquisition start:\n\r"); first_acquisition = false; } -// pc->printf("%f;", Vm); -// wait(5); - } else { - lastE = 0.00000000001; - lastOut = 0.00000000001; + ie = 0.00000000001; first_acquisition = true; } - pc->printf("Vm: %.2f\t Vd: %.2f\t Eh: %.2f\t El: %.2f\n\r", Vm, Vd, out, out/2); + pc->printf("Vm: %.2f\t Vd: %.2f\t Eh: %.2f\t Kp: %.2f\tVar: %.2f\n\r", Vm, Vd, out, Ki, var); return (float)out; } - - +//// essai routier: lim = 10 kmh, overshoot de 50%, un seul ronflement +//// max 15 kmh, min 7 kmh. +//// temps de stabilisation 3s //float SpeedLimiter::ecoEnabledAlgorithm() //{ -// // valeurs anterieures -// static double x1 = 0.0; -// static double y1 = 0.0; +// static bool first_acquisition = true; // -// // constantes calcules avec matlab -// const double b0 = 10793.0; -// const double b1 = -8513.5; +// // constantes calcules dans MATLAB +// const double b0 = 3312.0; +// const double b1 = -3061.0; // const double a1 = -1.0; // -// const double TRANS_k_gear = 20.5; //Gearbox ratio -// const double TRANS_eff = 0.91; // Efficiency of the transmission -// const double TRANS_R_wheel = 0.3175; // Radius of the wheel [m] -// const double TRANS_k = TRANS_k_gear/TRANS_R_wheel; // Global ratio of the transmission [m] +// // valeurs anterieures +// static double lastE = 0.0; +// static double lastOut = 0.0; +// +// // calculs +// double Vm = getMeasuredSpeed(); +// double Vd = getReferenceSpeed(); +// double out = 0.0; +// if (readAdcPedalHi() > 1) { +// const double e = Vd - Vm; +// +// // y(n) = b0 * x(n) + b1 * x(n-1) - a1 * y(n-1) +// out = (b0 * e) + (b1 * lastE) - (a1 * lastOut); +// +// lastE = e; +// lastOut = out; +// +// // out est maintenant en 'force' +// out = (out / 133240.0 * (PEDAL_HI_MAX_VALUE-PEDAL_HI_MIN_VALUE)) + PEDAL_HI_MIN_VALUE; // -// const double G_forceToTorque = (1/TRANS_k) * TRANS_eff; +// if(first_acquisition) { +// pc->printf("Acquisition start:\n\r"); +// first_acquisition = false; +// } +// } else { +// lastE = 0.00000000001; +// lastOut = 0.00000000001; +// first_acquisition = true; +// } +// +// pc->printf("Vm: %.2f\t Vd: %.2f\t Eh: %.2f\t El: %.2f\n\r", Vm, Vd, out, out/2); +// +// return (float)out; +//} + +//// temps de stabilisation 1s +//// oscillation, grand overshoot (20 kmh), consigne 10 kmh +//float SpeedLimiter::ecoEnabledAlgorithm() +//{ +// static bool first_acquisition = true; +// +// // constantes calcules dans MATLAB +// const double b0 = 10790.0; +// const double b1 = -8514.0; +// const double a1 = -1.0; +// +// // valeurs anterieures +// static double lastE = 0.0; +// static double lastOut = 0.0; // // // calculs -// const float Vm = getMeasuredSpeed(); -// const float Vd = getReferenceSpeed(); -// double y0 = 0.0; +// double Vm = getMeasuredSpeed(); +// double Vd = getReferenceSpeed(); +// double out = 0.0; // if (readAdcPedalHi() > 1) { -// const double x0 = Vd - Vm; -// y0 = ( (-a1*y1) + (b0*x0) + (b1*x1) ) * G_forceToTorque; +// const double e = Vd - Vm; +// +// // y(n) = b0 * x(n) + b1 * x(n-1) - a1 * y(n-1) +// out = (b0 * e) + (b1 * lastE) - (a1 * lastOut); +// +// lastE = e; +// lastOut = out; // -// const double deltaT = 20.0; -// const double deltaE = PEDAL_HI_MAX_VALUE - PEDAL_HI_MIN_VALUE; -// const double ratioTtoE = deltaE / deltaT / 159.63 * deltaE; -// y0 = y0 * ratioTtoE + PEDAL_HI_MIN_VALUE; +// // out est maintenant en 'force' +// out = (out / 133240.0 * (PEDAL_HI_MAX_VALUE-PEDAL_HI_MIN_VALUE)) + PEDAL_HI_MIN_VALUE; // -// // update des valeurs anterieurs -// x1 = x0; -// y1 = y0; +// if(first_acquisition) { +// pc->printf("Acquisition start:\n\r"); +// first_acquisition = false; +// } +// } else { +// lastE = 0.00000000001; +// lastOut = 0.00000000001; +// first_acquisition = true; // } // -// pc->printf("Vm: %f\t Vd: %f\t Eh: %f\t El\n\r", Vm, Vd, y0, y0/2); +// pc->printf("Vm: %.2f\t Vd: %.2f\t Eh: %.2f\t El: %.2f\n\r", Vm, Vd, out, out/2); +// +// return (float)out; +//} + +//// implementation du PID 2s de stab +//// overshoot significatif, ronflement constant +//float SpeedLimiter::ecoEnabledAlgorithm() +//{ +// static bool first_acquisition = true; +// +// // constantes calcules dans MATLAB +// const double b0 = 4.246e04; +// const double b1 = -7.958e04; +// const double b2 = 3.768e04; +// const double a1 = -1.0; +// +// // valeurs anterieures +// static double lastE = 0.0; +// static double lastlastE = 0.0; +// static double lastOut = 0.0; +// static double lastlastOut = 0.0; +// +// // calculs +// double Vm = getMeasuredSpeed(); +// double Vd = getReferenceSpeed(); +// double out = 0.0; +// if (readAdcPedalHi() > 1) { +// const double e = Vd - Vm; +// +// // y(n) = b0 * x(n) + b1 * x(n-1) - a1 * y(n-1) +// out = (b0 * e) + (b1 * lastE) + (b2 * lastlastE) - (a1 * lastOut); +// +// lastlastE = lastE; +// lastE = e; +// lastlastOut = lastOut; +// lastOut = out; +// +// // out est maintenant en 'force' +// out = (out / 133240.0 * (PEDAL_HI_MAX_VALUE-PEDAL_HI_MIN_VALUE)) + PEDAL_HI_MIN_VALUE; +// +// if(first_acquisition) { +// pc->printf("Acquisition start:\n\r"); +// first_acquisition = false; +// } +// } else { +// lastE = 0.00000000001; +// lastOut = 0.00000000001; +// first_acquisition = true; +// } // -// return (float)y0; +// pc->printf("Vm: %.2f\t Vd: %.2f\t Eh: %.2f\t El: %.2f\n\r", Vm, Vd, out, out/2); +// +// return (float)out; //} +//// overshoot ~17, oscillation / ronflement +//float SpeedLimiter::ecoEnabledAlgorithm() +//{ +// static bool first_acquisition = true; +// +// // constantes calcules dans MATLAB +// double Kp = 4.7772e+03; +// double Ki = 5.6658e+03; +// double Kd = 4000.0; +// +// // valeurs anterieures +// static double ie = 0.0; +// static double lastE = 0.0; +// +// // calculs +// double Vm = getMeasuredSpeed(); +// double Vd = getReferenceSpeed(); +// double out = 0.0; +// if (readAdcPedalHi() > 1) { +// double e = Vd - Vm; +// const double dt = TRANSFER_FUNCTION_PERIOD; +// ie = ie + e*dt; +// double de = (e - lastE)/dt; +// +// out = Kp*e + Ki*ie + Kd*de; +// +// lastE = e; +// +// // out est maintenant en 'force' +// out = (out / 133240.0 * (PEDAL_HI_MAX_VALUE-PEDAL_HI_MIN_VALUE)) + PEDAL_HI_MIN_VALUE; +// +// if(first_acquisition) { +// pc->printf("Acquisition start:\n\r"); +// first_acquisition = false; +// } +// } else { +// lastE = 0.00000000001; +// ie = 0.00000000001; +// first_acquisition = true; +// } +// +// pc->printf("Vm: %.2f\t Vd: %.2f\t Eh: %.2f\t El: %.2f\n\r", Vm, Vd, out, out/2); +// +// return (float)out; +//} + + // Returns 'value' bounded between 'lowerBound' and 'upperBound' float SpeedLimiter::boundValue(float value, const float lowerBound, const float upperBound) {