De sensorcontroller van het TLS2 project.

Dependencies:   mbed

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?

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