Richard Hoekstra
/
TLS2-Sensorcontroller
De sensorcontroller van het TLS2 project.
main.cpp@2:4c5952cf26d0, 2016-11-14 (annotated)
- Committer:
- RichardHoekstra
- Date:
- Mon Nov 14 18:39:42 2016 +0000
- Revision:
- 2:4c5952cf26d0
- Parent:
- 1:c9fae063e6f3
- Child:
- 3:8e50fc7b82b7
Added a few checks and made the standard size of the sample array 100.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
RichardHoekstra | 0:eea3cc9d2701 | 1 | #include "mbed.h" |
RichardHoekstra | 0:eea3cc9d2701 | 2 | |
RichardHoekstra | 0:eea3cc9d2701 | 3 | |
RichardHoekstra | 0:eea3cc9d2701 | 4 | /* De sensor controller heeft de volgende taken |
RichardHoekstra | 0:eea3cc9d2701 | 5 | 1. Sensoren uitlezen |
RichardHoekstra | 0:eea3cc9d2701 | 6 | 1. De frequentie moet per sensor aanpasbaar zijn. |
RichardHoekstra | 0:eea3cc9d2701 | 7 | 2. Reageren op I2C data requests |
RichardHoekstra | 0:eea3cc9d2701 | 8 | 3. Indien mogelijk meerdere samples nemen van de hoogste prioriteit sensor |
RichardHoekstra | 0:eea3cc9d2701 | 9 | |
RichardHoekstra | 0:eea3cc9d2701 | 10 | De volgende 'dingen' moeten kunnen worden ingesteld |
RichardHoekstra | 0:eea3cc9d2701 | 11 | 1. 'Hoofd'sensor |
RichardHoekstra | 0:eea3cc9d2701 | 12 | 2. Sample rate _per_ sensor |
RichardHoekstra | 0:eea3cc9d2701 | 13 | 3. Moving Average van 'Hoofd'sensor |
RichardHoekstra | 0:eea3cc9d2701 | 14 | */ |
RichardHoekstra | 0:eea3cc9d2701 | 15 | |
RichardHoekstra | 1:c9fae063e6f3 | 16 | |
RichardHoekstra | 0:eea3cc9d2701 | 17 | void i2c_request(){ |
RichardHoekstra | 0:eea3cc9d2701 | 18 | //To be written |
RichardHoekstra | 0:eea3cc9d2701 | 19 | } |
RichardHoekstra | 0:eea3cc9d2701 | 20 | |
RichardHoekstra | 0:eea3cc9d2701 | 21 | |
RichardHoekstra | 0:eea3cc9d2701 | 22 | float sensorVal[3] = {0}; |
RichardHoekstra | 0:eea3cc9d2701 | 23 | //Index 0: druksensor waarde |
RichardHoekstra | 0:eea3cc9d2701 | 24 | //Index 1: flowsensor waarde |
RichardHoekstra | 0:eea3cc9d2701 | 25 | //Index 2: temperatuursenor waarde |
RichardHoekstra | 0:eea3cc9d2701 | 26 | #define druksensor 0 |
RichardHoekstra | 0:eea3cc9d2701 | 27 | #define flowsensor 1 |
RichardHoekstra | 1:c9fae063e6f3 | 28 | #define tempsensor 2 |
RichardHoekstra | 1:c9fae063e6f3 | 29 | |
RichardHoekstra | 1:c9fae063e6f3 | 30 | bool pressure_is_main = true; //Determine the most important sensor as in, on which value is the motor controller regulating |
RichardHoekstra | 1:c9fae063e6f3 | 31 | bool smoothing = true; //Determine to activate the moving average |
RichardHoekstra | 1:c9fae063e6f3 | 32 | |
RichardHoekstra | 1:c9fae063e6f3 | 33 | |
RichardHoekstra | 2:4c5952cf26d0 | 34 | //In: nieuwe waarde en hoeveel samples er worden gebruikt |
RichardHoekstra | 2:4c5952cf26d0 | 35 | //Out: moving average van x elementen |
RichardHoekstra | 2:4c5952cf26d0 | 36 | //Explanation: deze functie 'smooth' de waardes die binnenkomen van |
RichardHoekstra | 2:4c5952cf26d0 | 37 | // bijvoorbeeld de druksensor. Zoals een condensator, |
RichardHoekstra | 2:4c5952cf26d0 | 38 | // de smoothing factor kan worden ingesteld door de hoeveelheid |
RichardHoekstra | 2:4c5952cf26d0 | 39 | // samples in de moving average aan te passen. |
RichardHoekstra | 2:4c5952cf26d0 | 40 | // Met maximaal 100 samples. |
RichardHoekstra | 1:c9fae063e6f3 | 41 | float calc_moving_average(float val, int samples = 10){ |
RichardHoekstra | 2:4c5952cf26d0 | 42 | static float sample_arr[100] = {0}; //[0] is the newest |
RichardHoekstra | 1:c9fae063e6f3 | 43 | float moving_average = 0; |
RichardHoekstra | 2:4c5952cf26d0 | 44 | if(samples > 0 && samples < 100){ //Sanity check |
RichardHoekstra | 2:4c5952cf26d0 | 45 | //Put the new val into the sample_arr and push out the oldest one |
RichardHoekstra | 2:4c5952cf26d0 | 46 | for(int i=samples-1; i>0; i--){ |
RichardHoekstra | 2:4c5952cf26d0 | 47 | //[9]<-[8]<-[7] |
RichardHoekstra | 2:4c5952cf26d0 | 48 | sample_arr[i] = sample_arr[i-1]; |
RichardHoekstra | 2:4c5952cf26d0 | 49 | } |
RichardHoekstra | 2:4c5952cf26d0 | 50 | sample_arr[0] = val; |
RichardHoekstra | 2:4c5952cf26d0 | 51 | //Calculate the moving average |
RichardHoekstra | 2:4c5952cf26d0 | 52 | for(int i=0; i<samples; i++){ |
RichardHoekstra | 2:4c5952cf26d0 | 53 | moving_average += sample_arr[i]; |
RichardHoekstra | 2:4c5952cf26d0 | 54 | } |
RichardHoekstra | 2:4c5952cf26d0 | 55 | return moving_average/(float)samples; |
RichardHoekstra | 2:4c5952cf26d0 | 56 | } else { |
RichardHoekstra | 2:4c5952cf26d0 | 57 | return 3.1415926; //Improv error code |
RichardHoekstra | 1:c9fae063e6f3 | 58 | } |
RichardHoekstra | 1:c9fae063e6f3 | 59 | } |
RichardHoekstra | 1:c9fae063e6f3 | 60 | |
RichardHoekstra | 0:eea3cc9d2701 | 61 | int main() { |
RichardHoekstra | 0:eea3cc9d2701 | 62 | //Pins |
RichardHoekstra | 0:eea3cc9d2701 | 63 | AnalogIn drukSensor(A0); |
RichardHoekstra | 0:eea3cc9d2701 | 64 | AnalogIn flowSensor(A1); |
RichardHoekstra | 0:eea3cc9d2701 | 65 | AnalogIn tempSensor(A2); |
RichardHoekstra | 0:eea3cc9d2701 | 66 | |
RichardHoekstra | 0:eea3cc9d2701 | 67 | //Sample time |
RichardHoekstra | 0:eea3cc9d2701 | 68 | int tick_ms_druksensor = 10, //100 Hz |
RichardHoekstra | 0:eea3cc9d2701 | 69 | tick_ms_flowsensor = 10, //100 Hz |
RichardHoekstra | 0:eea3cc9d2701 | 70 | tick_ms_tempsensor = 1000; //1 Hz |
RichardHoekstra | 0:eea3cc9d2701 | 71 | |
RichardHoekstra | 0:eea3cc9d2701 | 72 | //mbed ondersteund onneindig veel timers |
RichardHoekstra | 0:eea3cc9d2701 | 73 | Timer t_druk, |
RichardHoekstra | 0:eea3cc9d2701 | 74 | t_flow, |
RichardHoekstra | 0:eea3cc9d2701 | 75 | t_temp; |
RichardHoekstra | 0:eea3cc9d2701 | 76 | |
RichardHoekstra | 0:eea3cc9d2701 | 77 | t_druk.start(); |
RichardHoekstra | 0:eea3cc9d2701 | 78 | t_flow.start(); |
RichardHoekstra | 0:eea3cc9d2701 | 79 | t_temp.start(); |
RichardHoekstra | 0:eea3cc9d2701 | 80 | while(1) { |
RichardHoekstra | 0:eea3cc9d2701 | 81 | if(t_druk.read_ms() >= tick_ms_druksensor){ |
RichardHoekstra | 1:c9fae063e6f3 | 82 | //Lees de druksensor uit |
RichardHoekstra | 1:c9fae063e6f3 | 83 | if(pressure_is_main == true && smoothing == true){ |
RichardHoekstra | 1:c9fae063e6f3 | 84 | calc_moving_average(drukSensor.read()); |
RichardHoekstra | 1:c9fae063e6f3 | 85 | } else { |
RichardHoekstra | 1:c9fae063e6f3 | 86 | sensorVal[druksensor] = drukSensor.read(); |
RichardHoekstra | 1:c9fae063e6f3 | 87 | } |
RichardHoekstra | 0:eea3cc9d2701 | 88 | t_druk.reset(); |
RichardHoekstra | 0:eea3cc9d2701 | 89 | } |
RichardHoekstra | 0:eea3cc9d2701 | 90 | if(t_flow.read_ms() >= tick_ms_flowsensor){ |
RichardHoekstra | 0:eea3cc9d2701 | 91 | //Lees de flowsensor uit |
RichardHoekstra | 1:c9fae063e6f3 | 92 | if(pressure_is_main == false && smoothing == true){ |
RichardHoekstra | 1:c9fae063e6f3 | 93 | calc_moving_average(flowSensor.read()); |
RichardHoekstra | 1:c9fae063e6f3 | 94 | } else { |
RichardHoekstra | 1:c9fae063e6f3 | 95 | sensorVal[flowsensor] = flowSensor.read(); |
RichardHoekstra | 1:c9fae063e6f3 | 96 | } |
RichardHoekstra | 0:eea3cc9d2701 | 97 | t_flow.reset(); |
RichardHoekstra | 0:eea3cc9d2701 | 98 | } |
RichardHoekstra | 0:eea3cc9d2701 | 99 | if(t_temp.read_ms() >= tick_ms_tempsensor){ |
RichardHoekstra | 0:eea3cc9d2701 | 100 | //Lees de temperatuursensor uit |
RichardHoekstra | 0:eea3cc9d2701 | 101 | sensorVal[tempsensor] = tempSensor.read(); |
RichardHoekstra | 0:eea3cc9d2701 | 102 | t_temp.reset(); |
RichardHoekstra | 0:eea3cc9d2701 | 103 | } |
RichardHoekstra | 0:eea3cc9d2701 | 104 | } |
RichardHoekstra | 0:eea3cc9d2701 | 105 | } |