Hesu-eco
/
limiteur_vitesse
premiere ebauche
main.cpp@0:011f69c1276c, 2018-10-11 (annotated)
- Committer:
- shovelcat
- Date:
- Thu Oct 11 21:05:52 2018 +0000
- Revision:
- 0:011f69c1276c
- Child:
- 1:c6b4ccebd483
premiere ebauche
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
shovelcat | 0:011f69c1276c | 1 | #include "mbed.h" |
shovelcat | 0:011f69c1276c | 2 | |
shovelcat | 0:011f69c1276c | 3 | /* |
shovelcat | 0:011f69c1276c | 4 | ############################## |
shovelcat | 0:011f69c1276c | 5 | Constants |
shovelcat | 0:011f69c1276c | 6 | ############################## |
shovelcat | 0:011f69c1276c | 7 | */ |
shovelcat | 0:011f69c1276c | 8 | const float ADC_INPUT_MAX_VALUE = 5; |
shovelcat | 0:011f69c1276c | 9 | const float ADC_OUTPUT_MAX_VALUE = 5; |
shovelcat | 0:011f69c1276c | 10 | |
shovelcat | 0:011f69c1276c | 11 | const float PEDAL_HI_MIN_VALUE = 0.48; |
shovelcat | 0:011f69c1276c | 12 | const float PEDAL_HI_MAX_VALUE = 2.96; |
shovelcat | 0:011f69c1276c | 13 | const float PEDAL_LO_MIN_VALUE = 0.25; |
shovelcat | 0:011f69c1276c | 14 | const float PEDAL_LO_MAX_VALUE = 1.48; |
shovelcat | 0:011f69c1276c | 15 | |
shovelcat | 0:011f69c1276c | 16 | /* |
shovelcat | 0:011f69c1276c | 17 | ############################## |
shovelcat | 0:011f69c1276c | 18 | Static variables and functions |
shovelcat | 0:011f69c1276c | 19 | ############################## |
shovelcat | 0:011f69c1276c | 20 | */ |
shovelcat | 0:011f69c1276c | 21 | static float __reference_speed = 0; |
shovelcat | 0:011f69c1276c | 22 | static float __measured_speed = 0; |
shovelcat | 0:011f69c1276c | 23 | |
shovelcat | 0:011f69c1276c | 24 | static void setReferenceSpeed(const float speed) { |
shovelcat | 0:011f69c1276c | 25 | // TODO insert mutex here |
shovelcat | 0:011f69c1276c | 26 | __reference_speed = speed; |
shovelcat | 0:011f69c1276c | 27 | } |
shovelcat | 0:011f69c1276c | 28 | |
shovelcat | 0:011f69c1276c | 29 | static void setMeasuredSpeed(const float speed) { |
shovelcat | 0:011f69c1276c | 30 | // TODO insert mutex here |
shovelcat | 0:011f69c1276c | 31 | __measured_speed = speed; |
shovelcat | 0:011f69c1276c | 32 | } |
shovelcat | 0:011f69c1276c | 33 | |
shovelcat | 0:011f69c1276c | 34 | static float getReferenceSpeed() { |
shovelcat | 0:011f69c1276c | 35 | // TODO insert mutex here |
shovelcat | 0:011f69c1276c | 36 | return __reference_speed; |
shovelcat | 0:011f69c1276c | 37 | } |
shovelcat | 0:011f69c1276c | 38 | static float getMeasuredSpeed() { |
shovelcat | 0:011f69c1276c | 39 | // TODO insert mutex here |
shovelcat | 0:011f69c1276c | 40 | return __measured_speed; |
shovelcat | 0:011f69c1276c | 41 | } |
shovelcat | 0:011f69c1276c | 42 | |
shovelcat | 0:011f69c1276c | 43 | /* |
shovelcat | 0:011f69c1276c | 44 | ############################## |
shovelcat | 0:011f69c1276c | 45 | uC I/O |
shovelcat | 0:011f69c1276c | 46 | ############################## |
shovelcat | 0:011f69c1276c | 47 | */ |
shovelcat | 0:011f69c1276c | 48 | AnalogIn pedal_in_hi(A0); |
shovelcat | 0:011f69c1276c | 49 | AnalogIn pedal_in_lo(A1); |
shovelcat | 0:011f69c1276c | 50 | AnalogOut pedal_out_hi(A2); |
shovelcat | 0:011f69c1276c | 51 | AnalogOut pedal_out_lo(A3); |
shovelcat | 0:011f69c1276c | 52 | DigitalOut led(LED1); |
shovelcat | 0:011f69c1276c | 53 | |
shovelcat | 0:011f69c1276c | 54 | /* |
shovelcat | 0:011f69c1276c | 55 | ############################## |
shovelcat | 0:011f69c1276c | 56 | Utility functions |
shovelcat | 0:011f69c1276c | 57 | ############################## |
shovelcat | 0:011f69c1276c | 58 | */ |
shovelcat | 0:011f69c1276c | 59 | |
shovelcat | 0:011f69c1276c | 60 | // Returns 'value' bounded between 'lowerBound' and 'upperBound' |
shovelcat | 0:011f69c1276c | 61 | float boundValue(float value, const float lowerBound, const float upperBound) { |
shovelcat | 0:011f69c1276c | 62 | if(value < lowerBound) { |
shovelcat | 0:011f69c1276c | 63 | value = lowerBound; |
shovelcat | 0:011f69c1276c | 64 | } |
shovelcat | 0:011f69c1276c | 65 | else if(value > upperBound) { |
shovelcat | 0:011f69c1276c | 66 | value = upperBound; |
shovelcat | 0:011f69c1276c | 67 | } |
shovelcat | 0:011f69c1276c | 68 | return value; |
shovelcat | 0:011f69c1276c | 69 | } |
shovelcat | 0:011f69c1276c | 70 | |
shovelcat | 0:011f69c1276c | 71 | // Returns "value/reference" as a percentage in decimal form (0.5 for 50%) |
shovelcat | 0:011f69c1276c | 72 | float toDecimalPercent(const float value, const float reference) { |
shovelcat | 0:011f69c1276c | 73 | return value/reference; |
shovelcat | 0:011f69c1276c | 74 | } |
shovelcat | 0:011f69c1276c | 75 | |
shovelcat | 0:011f69c1276c | 76 | // Returns voltage read on analog input port chosen for pedal input 1 |
shovelcat | 0:011f69c1276c | 77 | float readAdcPedalHi() { |
shovelcat | 0:011f69c1276c | 78 | const float decPcValue = pedal_in_hi.read(); |
shovelcat | 0:011f69c1276c | 79 | const float voltage = decPcValue * ADC_INPUT_MAX_VALUE; |
shovelcat | 0:011f69c1276c | 80 | return voltage; |
shovelcat | 0:011f69c1276c | 81 | } |
shovelcat | 0:011f69c1276c | 82 | |
shovelcat | 0:011f69c1276c | 83 | // Returns voltage read on analog input port chosen for pedal input 2 |
shovelcat | 0:011f69c1276c | 84 | float readAdcPedalLo() { |
shovelcat | 0:011f69c1276c | 85 | const float decPcValue = pedal_in_lo.read(); |
shovelcat | 0:011f69c1276c | 86 | const float voltage = decPcValue * ADC_INPUT_MAX_VALUE; |
shovelcat | 0:011f69c1276c | 87 | return voltage; |
shovelcat | 0:011f69c1276c | 88 | } |
shovelcat | 0:011f69c1276c | 89 | |
shovelcat | 0:011f69c1276c | 90 | |
shovelcat | 0:011f69c1276c | 91 | // Accepts a value in volts, converts to % and sets ADC for pedal output 1 |
shovelcat | 0:011f69c1276c | 92 | void writeAdcPedalHi(const float voltage) { |
shovelcat | 0:011f69c1276c | 93 | const float boundedValue = boundValue(voltage, PEDAL_HI_MIN_VALUE, PEDAL_HI_MAX_VALUE); |
shovelcat | 0:011f69c1276c | 94 | const float decPcValue = toDecimalPercent(boundedValue, ADC_OUTPUT_MAX_VALUE); |
shovelcat | 0:011f69c1276c | 95 | pedal_out_hi.write(decPcValue); |
shovelcat | 0:011f69c1276c | 96 | } |
shovelcat | 0:011f69c1276c | 97 | |
shovelcat | 0:011f69c1276c | 98 | // Accepts a value in volts, converts to % and sets ADC for pedal output 2 |
shovelcat | 0:011f69c1276c | 99 | void writeAdcPedalLo(const float voltage) { |
shovelcat | 0:011f69c1276c | 100 | const float boundedValue = boundValue(voltage, PEDAL_LO_MIN_VALUE, PEDAL_LO_MAX_VALUE); |
shovelcat | 0:011f69c1276c | 101 | const float decPcValue = toDecimalPercent(boundedValue, ADC_OUTPUT_MAX_VALUE); |
shovelcat | 0:011f69c1276c | 102 | pedal_out_lo.write(decPcValue); |
shovelcat | 0:011f69c1276c | 103 | } |
shovelcat | 0:011f69c1276c | 104 | |
shovelcat | 0:011f69c1276c | 105 | |
shovelcat | 0:011f69c1276c | 106 | |
shovelcat | 0:011f69c1276c | 107 | // main transfer function |
shovelcat | 0:011f69c1276c | 108 | void controlFunctionCallback() { |
shovelcat | 0:011f69c1276c | 109 | // const float Ki = 1.0; |
shovelcat | 0:011f69c1276c | 110 | // const float Kp = 1.0; |
shovelcat | 0:011f69c1276c | 111 | // const float Kc = 1.0; |
shovelcat | 0:011f69c1276c | 112 | // |
shovelcat | 0:011f69c1276c | 113 | // const float Vref = getReferenceSpeed(); |
shovelcat | 0:011f69c1276c | 114 | // const float Vmes = getMeasuredSpeed(); |
shovelcat | 0:011f69c1276c | 115 | // const float err = Vref - Vmes; |
shovelcat | 0:011f69c1276c | 116 | // const float errKi = err * Ki; |
shovelcat | 0:011f69c1276c | 117 | // const float err2 = errKi - Vmes; |
shovelcat | 0:011f69c1276c | 118 | // const float Ud = err2 * Kp * Kc; |
shovelcat | 0:011f69c1276c | 119 | const float udHi = readAdcPedalHi(); |
shovelcat | 0:011f69c1276c | 120 | const float udLo = readAdcPedalLo(); |
shovelcat | 0:011f69c1276c | 121 | writeAdcPedalHi(udHi); |
shovelcat | 0:011f69c1276c | 122 | writeAdcPedalLo(udLo); |
shovelcat | 0:011f69c1276c | 123 | } |
shovelcat | 0:011f69c1276c | 124 | |
shovelcat | 0:011f69c1276c | 125 | |
shovelcat | 0:011f69c1276c | 126 | |
shovelcat | 0:011f69c1276c | 127 | int main() { |
shovelcat | 0:011f69c1276c | 128 | printf("\nAnalogIn example\n"); |
shovelcat | 0:011f69c1276c | 129 | setReferenceSpeed(0); |
shovelcat | 0:011f69c1276c | 130 | setMeasuredSpeed(0); |
shovelcat | 0:011f69c1276c | 131 | printf("%f", getReferenceSpeed()); |
shovelcat | 0:011f69c1276c | 132 | printf("%f", getMeasuredSpeed()); |
shovelcat | 0:011f69c1276c | 133 | |
shovelcat | 0:011f69c1276c | 134 | while(1) { |
shovelcat | 0:011f69c1276c | 135 | controlFunctionCallback(); |
shovelcat | 0:011f69c1276c | 136 | led.write(!led.read()); |
shovelcat | 0:011f69c1276c | 137 | wait(0.2); // 200 ms |
shovelcat | 0:011f69c1276c | 138 | } |
shovelcat | 0:011f69c1276c | 139 | } |