premiere ebauche

Dependencies:   mbed PinDetect

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?

UserRevisionLine numberNew 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 }