De motorcontroller van het TLS2 project.

Dependencies:   mbed PID

Committer:
RichardHoekstra
Date:
Wed Nov 16 15:49:30 2016 +0000
Revision:
2:b9449fc96691
Parent:
1:9e6c4011eef6
Child:
3:10c6e7aaf375
Added back in the sinus curve creation.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
RichardHoekstra 0:48c10918dabf 1 #include "mbed.h"
RichardHoekstra 1:9e6c4011eef6 2 #define motor_addr 0x91
RichardHoekstra 1:9e6c4011eef6 3 //I2C settings
RichardHoekstra 1:9e6c4011eef6 4 #define SDA D14
RichardHoekstra 1:9e6c4011eef6 5 #define SCL D15
RichardHoekstra 1:9e6c4011eef6 6 #define I2C_BUFFER_SIZE 10
RichardHoekstra 1:9e6c4011eef6 7 I2CSlave slave(SDA,SCL);
RichardHoekstra 0:48c10918dabf 8
RichardHoekstra 2:b9449fc96691 9 #define CURVE_BUFFER_SIZE 100
RichardHoekstra 2:b9449fc96691 10
RichardHoekstra 2:b9449fc96691 11 //Curve settings
RichardHoekstra 2:b9449fc96691 12 float curve_buffer[CURVE_BUFFER_SIZE];
RichardHoekstra 2:b9449fc96691 13 float curve_min=80; //[mmHg]
RichardHoekstra 2:b9449fc96691 14 float curve_max=120; //[mmHg]
RichardHoekstra 2:b9449fc96691 15 float curve_period=10; //[ms]
RichardHoekstra 2:b9449fc96691 16
RichardHoekstra 2:b9449fc96691 17 //Note: om de frequentie aan te passen speel je de buffer sneller af. Hierbij neemt nauwkeurigheid wel af. Om dit te verminderen
RichardHoekstra 2:b9449fc96691 18 //heb je meer punten in de buffer nodig.
RichardHoekstra 2:b9449fc96691 19 float curve_sinus(){
RichardHoekstra 2:b9449fc96691 20 float amplitude = (curve_max - curve_min)/2; //amplitude*sin(t) //van -amplitude naar +amplitude
RichardHoekstra 2:b9449fc96691 21 //Als sin(x) = 0, moet de curve exact in het midden van max en min zitten
RichardHoekstra 2:b9449fc96691 22 float offset = (curve_max+curve_min)/2;
RichardHoekstra 2:b9449fc96691 23 //Genereer een volle periode en zet het in de buffer
RichardHoekstra 2:b9449fc96691 24 float step = 2*3.1415926/CURVE_BUFFER_SIZE;
RichardHoekstra 2:b9449fc96691 25 for(int i=0;i<CURVE_BUFFER_SIZE;i++){
RichardHoekstra 2:b9449fc96691 26 curve_buffer[i] = offset+amplitude*sin(step*x);
RichardHoekstra 2:b9449fc96691 27 }
RichardHoekstra 2:b9449fc96691 28 }
RichardHoekstra 2:b9449fc96691 29
RichardHoekstra 2:b9449fc96691 30 float curve_arterial(){
RichardHoekstra 2:b9449fc96691 31 //Help.
RichardHoekstra 2:b9449fc96691 32 }
RichardHoekstra 1:9e6c4011eef6 33
RichardHoekstra 0:48c10918dabf 34
RichardHoekstra 1:9e6c4011eef6 35 int main() {
RichardHoekstra 1:9e6c4011eef6 36 slave.address(motor_addr); //Set the correct address for this module
RichardHoekstra 1:9e6c4011eef6 37 char buffer[I2C_BUFFER_SIZE] = {0}; //Create the buffer for I2C
RichardHoekstra 1:9e6c4011eef6 38 bool buffer_changed;
RichardHoekstra 1:9e6c4011eef6 39 while(1) {
RichardHoekstra 1:9e6c4011eef6 40 int i = slave.receive();
RichardHoekstra 1:9e6c4011eef6 41 switch (i) {
RichardHoekstra 1:9e6c4011eef6 42 case I2CSlave::ReadAddressed:
RichardHoekstra 1:9e6c4011eef6 43 //Received a request to be read
RichardHoekstra 1:9e6c4011eef6 44 //Irrelevant for now
RichardHoekstra 1:9e6c4011eef6 45 break;
RichardHoekstra 1:9e6c4011eef6 46 case I2CSlave::WriteGeneral:
RichardHoekstra 1:9e6c4011eef6 47 //Received a request to be written to
RichardHoekstra 1:9e6c4011eef6 48 slave.read(buffer,I2C_BUFFER_SIZE);
RichardHoekstra 1:9e6c4011eef6 49 buffer_changed = true;
RichardHoekstra 1:9e6c4011eef6 50 break;
RichardHoekstra 1:9e6c4011eef6 51 case I2CSlave::WriteAddressed:
RichardHoekstra 1:9e6c4011eef6 52 //Received a request to be written to a specific location
RichardHoekstra 1:9e6c4011eef6 53 slave.read(buffer,I2C_BUFFER_SIZE);
RichardHoekstra 1:9e6c4011eef6 54 buffer_changed = true;
RichardHoekstra 1:9e6c4011eef6 55 break;
RichardHoekstra 1:9e6c4011eef6 56 }
RichardHoekstra 1:9e6c4011eef6 57 //Do shit depending on the command it received in the first data block
RichardHoekstra 1:9e6c4011eef6 58 if(buffer_changed == true){
RichardHoekstra 1:9e6c4011eef6 59 int command = buffer[0];
RichardHoekstra 1:9e6c4011eef6 60 switch(command){
RichardHoekstra 1:9e6c4011eef6 61 case 0:
RichardHoekstra 1:9e6c4011eef6 62 break;
RichardHoekstra 1:9e6c4011eef6 63 case 1:
RichardHoekstra 1:9e6c4011eef6 64 break;
RichardHoekstra 1:9e6c4011eef6 65 case 2:
RichardHoekstra 1:9e6c4011eef6 66 break;
RichardHoekstra 1:9e6c4011eef6 67 case default:
RichardHoekstra 1:9e6c4011eef6 68 //No command was valid
RichardHoekstra 1:9e6c4011eef6 69 //Create some kind of error? Maybe, blinking led.
RichardHoekstra 1:9e6c4011eef6 70 break;
RichardHoekstra 1:9e6c4011eef6 71 }
RichardHoekstra 1:9e6c4011eef6 72
RichardHoekstra 1:9e6c4011eef6 73 }
RichardHoekstra 1:9e6c4011eef6 74 //Clear the buffer for the next iteration
RichardHoekstra 1:9e6c4011eef6 75 if(buffer_changed == true){
RichardHoekstra 1:9e6c4011eef6 76 for(int i=0;i<I2C_BUFFER_SIZE;i++){
RichardHoekstra 1:9e6c4011eef6 77 buffer[i] = 0;
RichardHoekstra 1:9e6c4011eef6 78 }
RichardHoekstra 1:9e6c4011eef6 79 buffer_changed = false;
RichardHoekstra 1:9e6c4011eef6 80 }
RichardHoekstra 0:48c10918dabf 81
RichardHoekstra 0:48c10918dabf 82 }
RichardHoekstra 0:48c10918dabf 83 }