Hesu-eco
/
limiteur_vitesse
premiere ebauche
main.cpp@2:06f128641b62, 2018-10-18 (annotated)
- Committer:
- shovelcat
- Date:
- Thu Oct 18 02:20:14 2018 +0000
- Revision:
- 2:06f128641b62
- Parent:
- 1:c6b4ccebd483
- Child:
- 3:4da392d2bae8
tests on vehicule succeeded
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
shovelcat | 0:011f69c1276c | 1 | #include "mbed.h" |
shovelcat | 2:06f128641b62 | 2 | #include "speedlimiter.hpp" |
shovelcat | 0:011f69c1276c | 3 | |
shovelcat | 0:011f69c1276c | 4 | /* |
shovelcat | 0:011f69c1276c | 5 | ############################## |
shovelcat | 1:c6b4ccebd483 | 6 | uC I/O |
shovelcat | 1:c6b4ccebd483 | 7 | ############################## |
shovelcat | 1:c6b4ccebd483 | 8 | */ |
shovelcat | 2:06f128641b62 | 9 | AnalogIn pedalInHi(PA_3); |
shovelcat | 2:06f128641b62 | 10 | AnalogIn pedalInLo(PC_0); |
shovelcat | 2:06f128641b62 | 11 | AnalogOut pedalOutHi(PA_4); |
shovelcat | 2:06f128641b62 | 12 | AnalogOut pedalOutLo(PA_5); |
shovelcat | 1:c6b4ccebd483 | 13 | |
shovelcat | 1:c6b4ccebd483 | 14 | // test i/o |
shovelcat | 1:c6b4ccebd483 | 15 | InterruptIn b1(PC_13); |
shovelcat | 1:c6b4ccebd483 | 16 | DigitalOut led(LED1); |
shovelcat | 1:c6b4ccebd483 | 17 | DigitalOut canLed(LED2); |
shovelcat | 1:c6b4ccebd483 | 18 | Serial pc(USBTX, USBRX); // for communication / debugging |
shovelcat | 1:c6b4ccebd483 | 19 | CAN can1(PD_0, PD_1); |
shovelcat | 1:c6b4ccebd483 | 20 | |
shovelcat | 1:c6b4ccebd483 | 21 | /* |
shovelcat | 1:c6b4ccebd483 | 22 | ############################## |
shovelcat | 0:011f69c1276c | 23 | Constants |
shovelcat | 0:011f69c1276c | 24 | ############################## |
shovelcat | 0:011f69c1276c | 25 | */ |
shovelcat | 2:06f128641b62 | 26 | const float ADC_INPUT_MAX_VALUE = 3.3; |
shovelcat | 2:06f128641b62 | 27 | const float ADC_OUTPUT_MAX_VALUE = 3.3; |
shovelcat | 0:011f69c1276c | 28 | |
shovelcat | 0:011f69c1276c | 29 | const float PEDAL_HI_MIN_VALUE = 0.48; |
shovelcat | 0:011f69c1276c | 30 | const float PEDAL_HI_MAX_VALUE = 2.96; |
shovelcat | 0:011f69c1276c | 31 | const float PEDAL_LO_MIN_VALUE = 0.25; |
shovelcat | 0:011f69c1276c | 32 | const float PEDAL_LO_MAX_VALUE = 1.48; |
shovelcat | 0:011f69c1276c | 33 | |
shovelcat | 1:c6b4ccebd483 | 34 | const float SPEED_MAX = 40.0; |
shovelcat | 1:c6b4ccebd483 | 35 | |
shovelcat | 2:06f128641b62 | 36 | const float DISABLE_ECO_ALGO_TRIGGER = 999; |
shovelcat | 2:06f128641b62 | 37 | |
shovelcat | 0:011f69c1276c | 38 | /* |
shovelcat | 0:011f69c1276c | 39 | ############################## |
shovelcat | 0:011f69c1276c | 40 | Static variables and functions |
shovelcat | 0:011f69c1276c | 41 | ############################## |
shovelcat | 0:011f69c1276c | 42 | */ |
shovelcat | 2:06f128641b62 | 43 | static float __reference_speed = DISABLE_ECO_ALGO_TRIGGER; |
shovelcat | 0:011f69c1276c | 44 | static float __measured_speed = 0; |
shovelcat | 0:011f69c1276c | 45 | |
shovelcat | 0:011f69c1276c | 46 | static void setReferenceSpeed(const float speed) { |
shovelcat | 0:011f69c1276c | 47 | // TODO insert mutex here |
shovelcat | 0:011f69c1276c | 48 | __reference_speed = speed; |
shovelcat | 0:011f69c1276c | 49 | } |
shovelcat | 0:011f69c1276c | 50 | |
shovelcat | 0:011f69c1276c | 51 | static void setMeasuredSpeed(const float speed) { |
shovelcat | 0:011f69c1276c | 52 | // TODO insert mutex here |
shovelcat | 0:011f69c1276c | 53 | __measured_speed = speed; |
shovelcat | 0:011f69c1276c | 54 | } |
shovelcat | 0:011f69c1276c | 55 | |
shovelcat | 0:011f69c1276c | 56 | static float getReferenceSpeed() { |
shovelcat | 0:011f69c1276c | 57 | // TODO insert mutex here |
shovelcat | 0:011f69c1276c | 58 | return __reference_speed; |
shovelcat | 0:011f69c1276c | 59 | } |
shovelcat | 0:011f69c1276c | 60 | static float getMeasuredSpeed() { |
shovelcat | 0:011f69c1276c | 61 | // TODO insert mutex here |
shovelcat | 0:011f69c1276c | 62 | return __measured_speed; |
shovelcat | 0:011f69c1276c | 63 | } |
shovelcat | 0:011f69c1276c | 64 | |
shovelcat | 0:011f69c1276c | 65 | /* |
shovelcat | 0:011f69c1276c | 66 | ############################## |
shovelcat | 0:011f69c1276c | 67 | Utility functions |
shovelcat | 0:011f69c1276c | 68 | ############################## |
shovelcat | 0:011f69c1276c | 69 | */ |
shovelcat | 0:011f69c1276c | 70 | |
shovelcat | 0:011f69c1276c | 71 | // Returns 'value' bounded between 'lowerBound' and 'upperBound' |
shovelcat | 0:011f69c1276c | 72 | float boundValue(float value, const float lowerBound, const float upperBound) { |
shovelcat | 0:011f69c1276c | 73 | if(value < lowerBound) { |
shovelcat | 0:011f69c1276c | 74 | value = lowerBound; |
shovelcat | 0:011f69c1276c | 75 | } |
shovelcat | 0:011f69c1276c | 76 | else if(value > upperBound) { |
shovelcat | 0:011f69c1276c | 77 | value = upperBound; |
shovelcat | 0:011f69c1276c | 78 | } |
shovelcat | 0:011f69c1276c | 79 | return value; |
shovelcat | 0:011f69c1276c | 80 | } |
shovelcat | 0:011f69c1276c | 81 | |
shovelcat | 0:011f69c1276c | 82 | // Returns "value/reference" as a percentage in decimal form (0.5 for 50%) |
shovelcat | 0:011f69c1276c | 83 | float toDecimalPercent(const float value, const float reference) { |
shovelcat | 0:011f69c1276c | 84 | return value/reference; |
shovelcat | 0:011f69c1276c | 85 | } |
shovelcat | 0:011f69c1276c | 86 | |
shovelcat | 0:011f69c1276c | 87 | // Returns voltage read on analog input port chosen for pedal input 1 |
shovelcat | 0:011f69c1276c | 88 | float readAdcPedalHi() { |
shovelcat | 2:06f128641b62 | 89 | const float decPcValue = pedalInHi.read(); |
shovelcat | 0:011f69c1276c | 90 | const float voltage = decPcValue * ADC_INPUT_MAX_VALUE; |
shovelcat | 0:011f69c1276c | 91 | return voltage; |
shovelcat | 0:011f69c1276c | 92 | } |
shovelcat | 0:011f69c1276c | 93 | |
shovelcat | 0:011f69c1276c | 94 | // Returns voltage read on analog input port chosen for pedal input 2 |
shovelcat | 0:011f69c1276c | 95 | float readAdcPedalLo() { |
shovelcat | 2:06f128641b62 | 96 | const float decPcValue = pedalInLo.read(); |
shovelcat | 0:011f69c1276c | 97 | const float voltage = decPcValue * ADC_INPUT_MAX_VALUE; |
shovelcat | 0:011f69c1276c | 98 | return voltage; |
shovelcat | 0:011f69c1276c | 99 | } |
shovelcat | 0:011f69c1276c | 100 | |
shovelcat | 0:011f69c1276c | 101 | |
shovelcat | 0:011f69c1276c | 102 | // Accepts a value in volts, converts to % and sets ADC for pedal output 1 |
shovelcat | 0:011f69c1276c | 103 | void writeAdcPedalHi(const float voltage) { |
shovelcat | 0:011f69c1276c | 104 | const float boundedValue = boundValue(voltage, PEDAL_HI_MIN_VALUE, PEDAL_HI_MAX_VALUE); |
shovelcat | 0:011f69c1276c | 105 | const float decPcValue = toDecimalPercent(boundedValue, ADC_OUTPUT_MAX_VALUE); |
shovelcat | 2:06f128641b62 | 106 | pedalOutHi.write(decPcValue); |
shovelcat | 0:011f69c1276c | 107 | } |
shovelcat | 0:011f69c1276c | 108 | |
shovelcat | 0:011f69c1276c | 109 | // Accepts a value in volts, converts to % and sets ADC for pedal output 2 |
shovelcat | 0:011f69c1276c | 110 | void writeAdcPedalLo(const float voltage) { |
shovelcat | 0:011f69c1276c | 111 | const float boundedValue = boundValue(voltage, PEDAL_LO_MIN_VALUE, PEDAL_LO_MAX_VALUE); |
shovelcat | 0:011f69c1276c | 112 | const float decPcValue = toDecimalPercent(boundedValue, ADC_OUTPUT_MAX_VALUE); |
shovelcat | 2:06f128641b62 | 113 | pedalOutLo.write(decPcValue); |
shovelcat | 2:06f128641b62 | 114 | } |
shovelcat | 2:06f128641b62 | 115 | |
shovelcat | 2:06f128641b62 | 116 | float ecoDisabledAlgorithm() { |
shovelcat | 2:06f128641b62 | 117 | const float value = readAdcPedalHi(); |
shovelcat | 2:06f128641b62 | 118 | pc.printf("%s : %f\n\r",__FUNCTION__, value); |
shovelcat | 2:06f128641b62 | 119 | return value; |
shovelcat | 0:011f69c1276c | 120 | } |
shovelcat | 0:011f69c1276c | 121 | |
shovelcat | 2:06f128641b62 | 122 | float ecoEnabledAlgorithm() { |
shovelcat | 2:06f128641b62 | 123 | pc.printf("%s\n\r",__FUNCTION__); |
shovelcat | 2:06f128641b62 | 124 | // valeurs anterieurs |
shovelcat | 2:06f128641b62 | 125 | static float x1 = 0.0; |
shovelcat | 2:06f128641b62 | 126 | static float y1 = 0.0; |
shovelcat | 2:06f128641b62 | 127 | |
shovelcat | 2:06f128641b62 | 128 | // constantes calcules avec matlab |
shovelcat | 2:06f128641b62 | 129 | const float b0 = 10793.0; |
shovelcat | 2:06f128641b62 | 130 | const float b1 = -8513.5; |
shovelcat | 2:06f128641b62 | 131 | const float a1 = -1.0; |
shovelcat | 2:06f128641b62 | 132 | |
shovelcat | 2:06f128641b62 | 133 | const float TRANS_k_gear = 20.5; //Gearbox ratio |
shovelcat | 2:06f128641b62 | 134 | const float TRANS_eff = 0.91; // Efficiency of the transmission |
shovelcat | 2:06f128641b62 | 135 | const float TRANS_R_wheel = 0.3175; // Radius of the wheel [m] |
shovelcat | 2:06f128641b62 | 136 | const float TRANS_k = TRANS_k_gear/TRANS_R_wheel; // Global ratio of the transmission [m] |
shovelcat | 2:06f128641b62 | 137 | |
shovelcat | 2:06f128641b62 | 138 | const float G_forceToTorque = (1/TRANS_k) * TRANS_eff; |
shovelcat | 2:06f128641b62 | 139 | |
shovelcat | 2:06f128641b62 | 140 | // calculs |
shovelcat | 2:06f128641b62 | 141 | const float x0 = getMeasuredSpeed(); |
shovelcat | 2:06f128641b62 | 142 | const float y0 = ( (-a1*y1) + (b0*x0) + (b1*x1) ) * G_forceToTorque; |
shovelcat | 2:06f128641b62 | 143 | |
shovelcat | 2:06f128641b62 | 144 | // update des valeurs anterieurs |
shovelcat | 2:06f128641b62 | 145 | x1 = x0; |
shovelcat | 2:06f128641b62 | 146 | y1 = y0; |
shovelcat | 2:06f128641b62 | 147 | |
shovelcat | 2:06f128641b62 | 148 | return y0; |
shovelcat | 2:06f128641b62 | 149 | } |
shovelcat | 2:06f128641b62 | 150 | |
shovelcat | 2:06f128641b62 | 151 | |
shovelcat | 0:011f69c1276c | 152 | // main transfer function |
shovelcat | 1:c6b4ccebd483 | 153 | void limvitCallback() { |
shovelcat | 2:06f128641b62 | 154 | const float referenceSpeed = getReferenceSpeed(); |
shovelcat | 2:06f128641b62 | 155 | float outputAdcVoltageHi = 0; |
shovelcat | 2:06f128641b62 | 156 | float outputAdcVoltageLo = 0; |
shovelcat | 1:c6b4ccebd483 | 157 | |
shovelcat | 2:06f128641b62 | 158 | if(referenceSpeed == DISABLE_ECO_ALGO_TRIGGER) { |
shovelcat | 2:06f128641b62 | 159 | outputAdcVoltageHi = ecoDisabledAlgorithm(); |
shovelcat | 2:06f128641b62 | 160 | } |
shovelcat | 2:06f128641b62 | 161 | else { |
shovelcat | 2:06f128641b62 | 162 | outputAdcVoltageHi = ecoEnabledAlgorithm(); |
shovelcat | 2:06f128641b62 | 163 | } |
shovelcat | 2:06f128641b62 | 164 | |
shovelcat | 2:06f128641b62 | 165 | outputAdcVoltageLo = outputAdcVoltageHi / 2; |
shovelcat | 2:06f128641b62 | 166 | writeAdcPedalHi(outputAdcVoltageHi); |
shovelcat | 2:06f128641b62 | 167 | writeAdcPedalLo(outputAdcVoltageLo); |
shovelcat | 0:011f69c1276c | 168 | } |
shovelcat | 0:011f69c1276c | 169 | |
shovelcat | 1:c6b4ccebd483 | 170 | // Main loop to be run in thread |
shovelcat | 1:c6b4ccebd483 | 171 | void limvitMain() { |
shovelcat | 1:c6b4ccebd483 | 172 | // const float period = 0.001; |
shovelcat | 2:06f128641b62 | 173 | const float period = 0.1; |
shovelcat | 1:c6b4ccebd483 | 174 | Ticker limvitSync; |
shovelcat | 1:c6b4ccebd483 | 175 | limvitSync.attach(&limvitCallback, period); |
shovelcat | 2:06f128641b62 | 176 | while(1); |
shovelcat | 1:c6b4ccebd483 | 177 | } |
shovelcat | 0:011f69c1276c | 178 | |
shovelcat | 1:c6b4ccebd483 | 179 | void canCallback() { |
shovelcat | 1:c6b4ccebd483 | 180 | CANMessage msg; |
shovelcat | 1:c6b4ccebd483 | 181 | canLed = true; |
shovelcat | 1:c6b4ccebd483 | 182 | wait(1.0); |
shovelcat | 1:c6b4ccebd483 | 183 | canLed = false; |
shovelcat | 1:c6b4ccebd483 | 184 | int status = can1.read(msg); |
shovelcat | 1:c6b4ccebd483 | 185 | if(status) { |
shovelcat | 1:c6b4ccebd483 | 186 | pc.printf("CAN msg received: %x\n\r", msg.data); |
shovelcat | 1:c6b4ccebd483 | 187 | } |
shovelcat | 1:c6b4ccebd483 | 188 | else { |
shovelcat | 1:c6b4ccebd483 | 189 | pc.printf("Error: %d\n\r", status); |
shovelcat | 1:c6b4ccebd483 | 190 | } |
shovelcat | 1:c6b4ccebd483 | 191 | } |
shovelcat | 1:c6b4ccebd483 | 192 | |
shovelcat | 1:c6b4ccebd483 | 193 | void b1Callback() { |
shovelcat | 1:c6b4ccebd483 | 194 | static bool state = false; |
shovelcat | 1:c6b4ccebd483 | 195 | pc.printf("User pressed b1.\n\r"); |
shovelcat | 1:c6b4ccebd483 | 196 | if (state) { |
shovelcat | 1:c6b4ccebd483 | 197 | // reset speed |
shovelcat | 1:c6b4ccebd483 | 198 | setReferenceSpeed(0.0); |
shovelcat | 1:c6b4ccebd483 | 199 | state = !state; |
shovelcat | 1:c6b4ccebd483 | 200 | } |
shovelcat | 1:c6b4ccebd483 | 201 | else { |
shovelcat | 1:c6b4ccebd483 | 202 | setReferenceSpeed(30.0); |
shovelcat | 1:c6b4ccebd483 | 203 | state = !state; |
shovelcat | 1:c6b4ccebd483 | 204 | } |
shovelcat | 1:c6b4ccebd483 | 205 | pc.printf("%s\n\r", can1.rderror()); |
shovelcat | 1:c6b4ccebd483 | 206 | canCallback(); |
shovelcat | 1:c6b4ccebd483 | 207 | } |
shovelcat | 0:011f69c1276c | 208 | |
shovelcat | 0:011f69c1276c | 209 | int main() { |
shovelcat | 2:06f128641b62 | 210 | // SpeedLimiter speedLimiter(PA_3, PC_0, PA_4, PA_5); |
shovelcat | 2:06f128641b62 | 211 | |
shovelcat | 1:c6b4ccebd483 | 212 | pc.printf("\n\rAnalogIn example\n\r"); |
shovelcat | 2:06f128641b62 | 213 | // setReferenceSpeed(0); |
shovelcat | 0:011f69c1276c | 214 | setMeasuredSpeed(0); |
shovelcat | 1:c6b4ccebd483 | 215 | b1.rise(&b1Callback); |
shovelcat | 0:011f69c1276c | 216 | |
shovelcat | 1:c6b4ccebd483 | 217 | // CAN test |
shovelcat | 1:c6b4ccebd483 | 218 | can1.frequency(500000); |
shovelcat | 1:c6b4ccebd483 | 219 | can1.attach(&canCallback, CAN::RxIrq); |
shovelcat | 1:c6b4ccebd483 | 220 | |
shovelcat | 1:c6b4ccebd483 | 221 | limvitMain(); |
shovelcat | 0:011f69c1276c | 222 | while(1) { |
shovelcat | 2:06f128641b62 | 223 | pc.printf("Current reference speed: %f\n\r", getReferenceSpeed()); |
shovelcat | 1:c6b4ccebd483 | 224 | wait(1.0); |
shovelcat | 0:011f69c1276c | 225 | } |
shovelcat | 0:011f69c1276c | 226 | } |
shovelcat | 2:06f128641b62 | 227 |