Skeleton code for ES306 coupled Tanks experiment.

Dependencies:   mbed mbedWSEsbc

Files at this revision

API Documentation at this revision

Comitter:
jdawkins
Date:
Tue Mar 07 14:44:39 2017 +0000
Commit message:
Initial Commit for ES306 Coupled Tank Control Experiment skeleton program

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
mbedWSEsbc.lib Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r 76487bb2de87 main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Tue Mar 07 14:44:39 2017 +0000
@@ -0,0 +1,138 @@
+#include "mbed.h"
+#include "mbedWSEsbc.h"
+
+#define PI 3.14159
+#define LOG_FREQ 2.0
+#define CTRL_FREQ 200.0
+
+
+DigitalOut myled(LED1);
+
+int main()
+{
+    float log_timer = 0;  //initialize variable for log timer
+    bool run_flag = false;
+    bool run_ctrl = false;
+
+    mbedWSEsbcInit(9600);  //Initialize the mbed WSE Project SBC
+    wait(.2);   //delay at beginning for voltage settle purposes
+    t.start();  // Set up timer
+
+    pc.printf("Quanser Twin Tank Control Data Aquisition Program\r\n");
+
+    t.reset(); // zero timer
+    float sampT = t.read();
+    float tstop = 180;   //initialize stop time
+    float dc = 0;      //initialize dc variable
+    float dt = 1/CTRL_FREQ; // set control loop sample time
+
+    while(1) {
+
+        if(pc.readable()) {
+            char c = pc.getc();
+            if(c == 'H' || c == 'h') {
+                pc.printf("Command List...\r\n");
+                pc.printf("c - run closed loop controller\r\n");
+                pc.printf("o - run open loop control\r\n");
+                pc.printf("h - display this prompt and exit\r\n");            
+                pc.printf("Enter Command\r\n");
+
+            }
+            if(c == 'C' || c == 'c') {
+                
+                pc.printf("Enter test duration in seconds...\r\n");
+                pc.scanf("%f",&tstop);
+                pc.printf("Test duration set to %.1f seconds.\r\n",tstop);
+                
+                pc.printf("Running Closed Loop Control for %.1f seconds, press any key to stop test...\r\n",tstop);
+                run_flag = true;
+                run_ctrl = true;
+            }
+
+            if(c == 'O' || c == 'o') {
+
+                pc.printf("Enter desired duty cycle for test as a decimal between 0.00-1.00 \r\n",tstop);
+                pc.scanf("%f",&dc);
+                pc.printf("Duty Cycle is set to %.2f \r\n",dc);
+
+                pc.printf("Enter test duration in seconds...\r\n");
+                pc.scanf("%f",&tstop);
+                pc.printf("Test duration set to %.1f seconds.\r\n",tstop);
+
+                pc.printf("Running test for %.1f seconds, press any key to stop test...\r\n",tstop);
+                run_flag = true;
+                run_ctrl = false;
+            }
+
+ 
+
+            if(run_flag) {
+
+                //Prime the pump for a few seconds
+                mot_control(1,-1.0);
+                wait(1);
+                t.reset();
+                log_timer = 0;
+                while(t.read() < tstop) {
+
+                    //Emergency Stop check
+                    if(pc.readable()) { //if any key is hit turn of motor and break while loop
+                        mot_control(1, 0.0);
+                        break;
+                    }
+
+                    // read analog to digital chip for presssure sensors
+                    float tank2 = read_max1270_volts(0, 1, 1);   //chan, range, bipol
+                    float tank1 = read_max1270_volts(1, 1, 1);
+
+                    //Logic to exit loop if tank gets too full
+                    if(tank1 > 4.1 || tank2 > 4.1) { 
+                        pc.printf("%.2f, %.3f, %.3f, %.3f\r\n", t.read(),tank1,tank2,dc);
+                        break;
+                    }
+
+                    //Convert Voltage to Height
+
+
+                    if(run_ctrl) { //If controller is active
+                        
+
+                        // Control Law Goes Here
+                                                
+                        
+                        //Convert flow rate to duty cycle;
+
+                    }else{ // if open loop test
+                        
+                    }
+                    
+                    
+                    // Saturate dc command to send no more than maximum value
+                    if(dc>1.0) {
+                        dc =1.0;
+                    }
+                    if(dc<-1.0) {
+                        dc = -1.0;
+                    }
+
+                    //Set the new output.
+
+                    mot_control(1, -dc); // negative value required due to polarity of pump motor
+
+
+                    if( (t.read()- log_timer) >= (1.0/LOG_FREQ)) { //If log sample time has passed since last write
+                        pc.printf("%.2f, %.3f, %.3f, %.3f\r\n", t.read(),tank1,tank2,dc); //write data to scren
+                        log_timer = t.read();
+                    }
+
+                    led3=!led3;  //Flash Led to Indicate program is running
+                    wait(dt);   //Wait for sample time of loop frequency
+                }  // while t < tstop
+                mot_control(1, 0.0); // Turn off Pump once test is finished
+                run_flag = false;
+                run_ctrl = false;
+                pc.printf("\r\nEnter Command\r\n");
+            } //if run flag
+        } // if pc.readable
+    }//while
+}//main
diff -r 000000000000 -r 76487bb2de87 mbed.bld
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Tue Mar 07 14:44:39 2017 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/9ad691361fac
\ No newline at end of file
diff -r 000000000000 -r 76487bb2de87 mbedWSEsbc.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbedWSEsbc.lib	Tue Mar 07 14:44:39 2017 +0000
@@ -0,0 +1,1 @@
+https://developer.mbed.org/teams/USNA-WSE-ES306/code/mbedWSEsbc/#7f471453ebeb