De motorcontroller van het TLS2 project.

Dependencies:   mbed PID

Revision:
8:648c3963a8e0
Child:
9:1bdf5107920f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Control.h	Tue Nov 22 22:01:20 2016 +0000
@@ -0,0 +1,96 @@
+#include "mbed.h"
+#define CURVE_BUFFER_SIZE 100
+class Control {
+private: 
+    //----- SETTINGS -----
+    //Curve
+    enum curve_t    { OFF=0, CONSTANT_PRESSURE, CONSTANT_FLOW, CONSTANT_SPEED, MODE_SINUS, MODE_ARTERIAL
+                    } curve_mode;
+    float curve_buffer[CURVE_BUFFER_SIZE];
+    float curve_min;    //[mmHg]
+    float curve_max;   //[mmHg]
+    float curve_period; //[ms]
+    int curve_step;
+    
+    //Motor output    
+    float gradient; //pressure/percentagemaxpowerorjustvoltiguess
+    PwmOut motorOut;
+    
+    
+    //----- PRIVATE FUNCTIONS -----
+    void outputToPin(float input){
+        float temp = gradient*input;   
+        if(temp > 1){
+            motorOut = 1;
+        } else if(temp < 0){
+            motorOut = 0;
+        } else {
+            motorOut = temp;
+        }    
+    }
+    void run(){
+        switch(curve_mode){
+            case CONSTANT_PRESSURE:
+                break;
+            case CONSTANT_FLOW:
+                break;
+            case CONSTANT_SPEED:
+                break;
+            case MODE_SINUS:
+                outputToPin(curve_buffer[curve_step]);
+                curve_step++;
+                if(curve_step >= CURVE_BUFFER_SIZE){
+                    curve_step = 0;   
+                }
+                break;
+            case MODE_ARTERIAL:
+                break;    
+        }   
+        
+    }
+    
+public:
+    Control(PinName n_pin) : motorOut(n_pin){
+        curve_step = 0;
+        curve_min = 80;    //[mmHg]
+        curve_max = 120;   //[mmHg]
+        curve_period = 1000; //[ms]
+    }    
+    void normalize(AnalogIn& sensor){
+        //f'(x) = a
+        //f'(x) = dy/dx
+        //g(x) = a*x+b
+        //volt(pressure) = gradient*pressure+offset
+        //gradient = dVolt/dPressure
+        float   p1 = 0,
+                p2 = 0;
+        motorOut = 0.1;
+        wait(2);
+        p1 = sensor.read();
+        motorOut = 0.2;
+        wait(2);
+        p2 = sensor.read();
+        gradient = (p2-p1)/((float)0.1);
+    }
+    void set_curve(float min, float max, float period){
+        curve_min = min;
+        curve_max = max;
+        curve_period = period;       
+    }
+    void set_mode(int mode){
+        curve_mode = (curve_t)mode;    
+    }
+    void rebuild_buffer_sinus(){
+        float amplitude = (curve_max - curve_min)/2; //amplitude*sin(t) //van -amplitude naar +amplitude
+        //Als sin(x) = 0, moet de curve exact in het midden van max en min zitten
+        float offset = (curve_max+curve_min)/2;
+        //Genereer een volle periode en zet het in de buffer
+        float step = 2*3.1415926/CURVE_BUFFER_SIZE;
+        for(int i=0;i<CURVE_BUFFER_SIZE;i++){        
+            curve_buffer[i] = offset+amplitude*sin(step*i);
+        }
+    }
+    void rebuild_buffer_arterial(){
+        //Coming to a cinema near you... soon!         
+    } 
+};