Code required for data acquisition of couple tanks system with WSE sbc

Dependencies:   mbed mbedWSEsbc

Committer:
jdawkins
Date:
Mon Sep 19 12:04:31 2016 +0000
Revision:
2:a69d07fe0e62
Parent:
1:a87d98b19444
Fixed overflow safety by removing break. Also changed safety values to 4.1 volts which is about 24 cm on the tank.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jdawkins 0:e42d1cc6513e 1 #include "mbed.h"
jdawkins 0:e42d1cc6513e 2 #include "mbedWSEsbc.h"
jdawkins 0:e42d1cc6513e 3
jdawkins 0:e42d1cc6513e 4 #define PI 3.14159
jdawkins 0:e42d1cc6513e 5 #define LOG_FREQ 1.0
jdawkins 0:e42d1cc6513e 6 #define CTRL_FREQ 10.0
jdawkins 0:e42d1cc6513e 7
jdawkins 0:e42d1cc6513e 8 float tstop,pwm,log_timer,log_start,loop_time;
jdawkins 0:e42d1cc6513e 9 float duty_cycle;
jdawkins 0:e42d1cc6513e 10 bool run_flag;
jdawkins 0:e42d1cc6513e 11 double dt;
jdawkins 0:e42d1cc6513e 12
jdawkins 0:e42d1cc6513e 13 bool readAndParse(Serial *port);
jdawkins 0:e42d1cc6513e 14 int main()
jdawkins 0:e42d1cc6513e 15 {
jdawkins 0:e42d1cc6513e 16 run_flag = false;
jdawkins 0:e42d1cc6513e 17 log_timer = 0; //initialize variable for log timer
jdawkins 0:e42d1cc6513e 18 log_start = 0;
jdawkins 0:e42d1cc6513e 19 loop_time = 0;
jdawkins 0:e42d1cc6513e 20 tstop = 120;
jdawkins 0:e42d1cc6513e 21 pwm = 0.7;
jdawkins 0:e42d1cc6513e 22 led1 = led2 = led3 = led4 = 0;
jdawkins 0:e42d1cc6513e 23 dt = (1/CTRL_FREQ);
jdawkins 0:e42d1cc6513e 24 mbedWSEsbcInit(115200); //Initialize the mbed WSE Project SBC
jdawkins 0:e42d1cc6513e 25 wait(.2); //delay at beginning for voltage settle purposes
jdawkins 0:e42d1cc6513e 26 t.start(); // Set up timer
jdawkins 0:e42d1cc6513e 27 pc.printf("Quanser Twin Tank Control Data Aquisition Program\r\n");
jdawkins 0:e42d1cc6513e 28
jdawkins 0:e42d1cc6513e 29 t.reset(); // zero timer
jdawkins 0:e42d1cc6513e 30
jdawkins 0:e42d1cc6513e 31 while(1) {
jdawkins 0:e42d1cc6513e 32 loop_time = t.read();
jdawkins 0:e42d1cc6513e 33 readAndParse(&pc);
jdawkins 0:e42d1cc6513e 34 //Emergency Stop check
jdawkins 0:e42d1cc6513e 35 /*if(pc.readable()) { //if any key is hit turn of motor and break while loop
jdawkins 0:e42d1cc6513e 36 mot_control(1, 0.0);
jdawkins 0:e42d1cc6513e 37 break;
jdawkins 0:e42d1cc6513e 38 }*/
jdawkins 0:e42d1cc6513e 39 // read analog to digital chip for presssure sensors
jdawkins 0:e42d1cc6513e 40 if(run_flag) {
jdawkins 0:e42d1cc6513e 41 float tank2 = read_max1270_volts(0, 1, 1); //chan, range, bipol
jdawkins 0:e42d1cc6513e 42 float tank1 = read_max1270_volts(1, 1, 1);
jdawkins 0:e42d1cc6513e 43
jdawkins 0:e42d1cc6513e 44 //Logic to exit loop if tank gets too full
jdawkins 2:a69d07fe0e62 45 if(tank1 > 4.1 || tank2 > 4.1) {
jdawkins 2:a69d07fe0e62 46 pc.printf("%.2f, %.3f, %.3f, %.3f\r\n", t.read() -log_start,tank1,tank2,pwm);
jdawkins 2:a69d07fe0e62 47 run_flag = false;
jdawkins 0:e42d1cc6513e 48 }
jdawkins 0:e42d1cc6513e 49
jdawkins 0:e42d1cc6513e 50
jdawkins 0:e42d1cc6513e 51 // Saturate PWM command to send no more than maximum value
jdawkins 0:e42d1cc6513e 52 if(pwm>1.0) {
jdawkins 0:e42d1cc6513e 53 pwm =1.0;
jdawkins 0:e42d1cc6513e 54 }
jdawkins 0:e42d1cc6513e 55 if(pwm<-1.0) {
jdawkins 0:e42d1cc6513e 56 pwm = -1.0;
jdawkins 0:e42d1cc6513e 57 }
jdawkins 0:e42d1cc6513e 58
jdawkins 0:e42d1cc6513e 59 //Set the new output.
jdawkins 0:e42d1cc6513e 60 mot_control(1, -pwm); // negative value required due to polarity of pump motor
jdawkins 0:e42d1cc6513e 61
jdawkins 0:e42d1cc6513e 62 float log_dt = t.read()- log_timer;
jdawkins 0:e42d1cc6513e 63 float time = t.read() -log_start;
jdawkins 0:e42d1cc6513e 64 if( log_dt >= (1.0/LOG_FREQ)) { //If log sample time has passed since last write
jdawkins 0:e42d1cc6513e 65 log_timer = t.read();
jdawkins 0:e42d1cc6513e 66 pc.printf("%.2f,%.3f,%.3f,%.3f\r\n",time,tank1,tank2,pwm); //write data to screen
jdawkins 0:e42d1cc6513e 67 // xbee.printf("%.2f,%.3f,%.3f,%.3f\r\n",time,tank1,tank2,pwm); //write data to screen
jdawkins 0:e42d1cc6513e 68
jdawkins 0:e42d1cc6513e 69 }
jdawkins 0:e42d1cc6513e 70
jdawkins 0:e42d1cc6513e 71 led1 = !led1;
jdawkins 0:e42d1cc6513e 72 led2 = !led2;
jdawkins 0:e42d1cc6513e 73 led3 = !led3;
jdawkins 0:e42d1cc6513e 74 led4 = !led4;
jdawkins 0:e42d1cc6513e 75 // float loop_dur = (t.read()-loop_time);
jdawkins 0:e42d1cc6513e 76 // printf("Loop Time %f %f %f\r\n", t.read()-loop_time, dt, loop_dur);
jdawkins 0:e42d1cc6513e 77 wait(dt); //Wait for sample time of loop frequency
jdawkins 0:e42d1cc6513e 78
jdawkins 0:e42d1cc6513e 79 } //if run flag
jdawkins 0:e42d1cc6513e 80 else { // Slow flash LED When system is not running
jdawkins 0:e42d1cc6513e 81 led1 = !led1;
jdawkins 0:e42d1cc6513e 82 led2 = !led2;
jdawkins 0:e42d1cc6513e 83 led3 = !led3;
jdawkins 0:e42d1cc6513e 84 led4 = !led4;
jdawkins 0:e42d1cc6513e 85 mot_control(1, 0); // negative value required due to polarity of pump motor
jdawkins 0:e42d1cc6513e 86 wait(0.5);
jdawkins 0:e42d1cc6513e 87 }
jdawkins 0:e42d1cc6513e 88 }//while
jdawkins 0:e42d1cc6513e 89 }//main
jdawkins 0:e42d1cc6513e 90
jdawkins 0:e42d1cc6513e 91 bool readAndParse(Serial *port)
jdawkins 0:e42d1cc6513e 92 {
jdawkins 0:e42d1cc6513e 93
jdawkins 0:e42d1cc6513e 94 char msg[64];
jdawkins 0:e42d1cc6513e 95 int i = 0;
jdawkins 0:e42d1cc6513e 96
jdawkins 0:e42d1cc6513e 97 if(port->readable()) {
jdawkins 0:e42d1cc6513e 98 char c = port->getc();
jdawkins 0:e42d1cc6513e 99 if(c=='$') {
jdawkins 0:e42d1cc6513e 100 msg[i] = c;
jdawkins 0:e42d1cc6513e 101 i++;
jdawkins 0:e42d1cc6513e 102 while(1) {
jdawkins 0:e42d1cc6513e 103 msg[i] = port->getc();
jdawkins 0:e42d1cc6513e 104 if(msg[i]=='\n' || msg[i]=='\r') {
jdawkins 0:e42d1cc6513e 105 break;
jdawkins 0:e42d1cc6513e 106 }
jdawkins 0:e42d1cc6513e 107 i++;
jdawkins 0:e42d1cc6513e 108 }
jdawkins 0:e42d1cc6513e 109 }
jdawkins 0:e42d1cc6513e 110 }
jdawkins 0:e42d1cc6513e 111
jdawkins 0:e42d1cc6513e 112 if(!strncmp(msg, "$RUN", 4)) {
jdawkins 0:e42d1cc6513e 113 run_flag = true;
jdawkins 0:e42d1cc6513e 114 log_timer = 0;
jdawkins 0:e42d1cc6513e 115 log_start = t.read();
jdawkins 0:e42d1cc6513e 116 return true;
jdawkins 0:e42d1cc6513e 117 } else if(!strncmp(msg, "$STOP", 5)) {
jdawkins 0:e42d1cc6513e 118 mot_control(1, 0.0); // Turn off Pump once test is finished
jdawkins 0:e42d1cc6513e 119 run_flag = false;
jdawkins 0:e42d1cc6513e 120 return true;
jdawkins 0:e42d1cc6513e 121
jdawkins 0:e42d1cc6513e 122 } else if(!strncmp(msg, "$PWM", 4)) {
jdawkins 0:e42d1cc6513e 123 sscanf(msg,"$PWM,%f\n",&pwm);
jdawkins 0:e42d1cc6513e 124 return true;
jdawkins 0:e42d1cc6513e 125 } else {
jdawkins 0:e42d1cc6513e 126 return false;
jdawkins 0:e42d1cc6513e 127 }
jdawkins 0:e42d1cc6513e 128
jdawkins 0:e42d1cc6513e 129 }
jdawkins 0:e42d1cc6513e 130