Mbed code for the lab

Dependencies:   mbed

Committer:
DCamuti
Date:
Thu Oct 01 03:40:31 2015 +0000
Revision:
1:abca5455262a
Parent:
0:108062801773
Coupled Tank System

Who changed what in which revision?

UserRevisionLine numberNew contents of line
DCamuti 1:abca5455262a 1 //Daniel Camuti and Hannah Hjelmstrom
DCamuti 1:abca5455262a 2 //ES301 - Coupled Tank System Part 2
DCamuti 1:abca5455262a 3
DCamuti 0:108062801773 4 #include "mbed.h"
DCamuti 0:108062801773 5 // APIs
DCamuti 0:108062801773 6 Serial pc(USBTX, USBRX); // tx, rx for serial USB interface to pc
DCamuti 0:108062801773 7 SPI spi_max1270(p5, p6, p7);
DCamuti 0:108062801773 8 SPI spi(p5, p6, p7);
DCamuti 0:108062801773 9 DigitalOut max1270_cs(p8); //MAX1270 ADC CS
DCamuti 0:108062801773 10 DigitalOut mot1_ph1(p21);
DCamuti 0:108062801773 11 //DigitalOut mot1_ph2(p22);
DCamuti 0:108062801773 12 PwmOut mot_en1(p23);
DCamuti 0:108062801773 13
DCamuti 0:108062801773 14 LocalFileSystem local("local"); // Create the local filesystem under the name "local"
DCamuti 0:108062801773 15
DCamuti 1:abca5455262a 16 int read_max1270(int chan, int range, int bipol)
DCamuti 1:abca5455262a 17 {
DCamuti 0:108062801773 18 int cword=0x80; //set the start bit
DCamuti 1:abca5455262a 19
DCamuti 0:108062801773 20 spi_max1270.frequency(10000000);
DCamuti 0:108062801773 21 spi_max1270.format(8, 0); // 8 data bits, CPOL0, and CPHA0 (datasheet Digital Interface)
DCamuti 1:abca5455262a 22
DCamuti 0:108062801773 23 cword |= (chan << 4); //shift channel
DCamuti 0:108062801773 24 cword |= (range << 3);
DCamuti 0:108062801773 25 cword |= (bipol << 2);
DCamuti 1:abca5455262a 26
DCamuti 0:108062801773 27 max1270_cs = 0;
DCamuti 1:abca5455262a 28
DCamuti 0:108062801773 29 spi_max1270.write(cword);
DCamuti 0:108062801773 30 wait_us(15); //15us
DCamuti 0:108062801773 31 spi_max1270.format(12, 3);
DCamuti 1:abca5455262a 32
DCamuti 0:108062801773 33 int result = spi_max1270.write(0);
DCamuti 1:abca5455262a 34
DCamuti 0:108062801773 35 max1270_cs = 1;
DCamuti 0:108062801773 36 spi_max1270.format(8, 0);
DCamuti 0:108062801773 37 return result;
DCamuti 0:108062801773 38 }
DCamuti 0:108062801773 39
DCamuti 1:abca5455262a 40 float read_max1270_volts(int chan, int range, int bipol)
DCamuti 1:abca5455262a 41 {
DCamuti 0:108062801773 42 float rangevolts=0.0;
DCamuti 0:108062801773 43 float volts=0.0;
DCamuti 0:108062801773 44 int adc_res;
DCamuti 0:108062801773 45
DCamuti 0:108062801773 46 //read the ADC converter
DCamuti 0:108062801773 47 adc_res = read_max1270(chan, range, bipol) & 0xFFF;
DCamuti 1:abca5455262a 48
DCamuti 1:abca5455262a 49 //Determine the voltage range
DCamuti 1:abca5455262a 50 if(range) //RNG bit
DCamuti 1:abca5455262a 51 rangevolts=10.0;
DCamuti 1:abca5455262a 52 else
DCamuti 1:abca5455262a 53 rangevolts=5.0;
DCamuti 1:abca5455262a 54
DCamuti 1:abca5455262a 55 //bi-polar input range
DCamuti 1:abca5455262a 56 if(bipol) { //BIP is set, input is +/-
DCamuti 1:abca5455262a 57 if(adc_res < 0x800) { //if result was positive
DCamuti 1:abca5455262a 58 volts = ((float)adc_res/0x7FF) * rangevolts;
DCamuti 1:abca5455262a 59 } else { //result was negative
DCamuti 1:abca5455262a 60 volts = -(-((float)adc_res/0x7FF) * rangevolts) - (rangevolts * 2.0);
DCamuti 1:abca5455262a 61 }
DCamuti 1:abca5455262a 62 } else { //input is positive polarity only
DCamuti 1:abca5455262a 63 volts = ((float)adc_res/0xFFF) * rangevolts;
DCamuti 1:abca5455262a 64 }
DCamuti 1:abca5455262a 65
DCamuti 1:abca5455262a 66 return volts;
DCamuti 0:108062801773 67 }
DCamuti 0:108062801773 68
DCamuti 0:108062801773 69 float Tank1,Tank2,dt;
DCamuti 0:108062801773 70 float Ts = 1.0; // Sampling period 1/Ts Hz
DCamuti 0:108062801773 71
DCamuti 0:108062801773 72 // Arrays for data storage
DCamuti 0:108062801773 73 float etime[200];
DCamuti 0:108062801773 74 float t1v[200];
DCamuti 0:108062801773 75 float t2v[200];
DCamuti 0:108062801773 76 float dcp[200];
DCamuti 0:108062801773 77 Timer t;
DCamuti 0:108062801773 78
DCamuti 0:108062801773 79
DCamuti 0:108062801773 80 float cntr;
DCamuti 0:108062801773 81 float dc;
DCamuti 0:108062801773 82 int k;
DCamuti 0:108062801773 83
DCamuti 0:108062801773 84 int main ()
DCamuti 0:108062801773 85 {
DCamuti 1:abca5455262a 86 pc.baud(921600); // Establish baud rate
DCamuti 1:abca5455262a 87 mot_en1.period_us(50); // Set PWM length to 50 us
DCamuti 0:108062801773 88 max1270_cs = 1; // Activate A/D
DCamuti 0:108062801773 89 cntr = 0.0; // cntr used to keep track of sample period and elpased time
DCamuti 1:abca5455262a 90
DCamuti 0:108062801773 91 // initialize data vectors
DCamuti 1:abca5455262a 92 for(k=0; k<100; k++) {
DCamuti 1:abca5455262a 93 etime[k] = 0.0;
DCamuti 1:abca5455262a 94 t1v[k] = 0.0;
DCamuti 1:abca5455262a 95 t2v[k] = 0.0;
DCamuti 1:abca5455262a 96 dcp[k] = 0.0;
DCamuti 1:abca5455262a 97 }
DCamuti 1:abca5455262a 98 k = 0; // Reset index counter
DCamuti 1:abca5455262a 99 pc.printf("Time Tank1 Tank2 DC \n\r");
DCamuti 1:abca5455262a 100 while(cntr*Ts <= 200) {
DCamuti 0:108062801773 101 t.start(); // start measuring comp time
DCamuti 1:abca5455262a 102
DCamuti 1:abca5455262a 103 // Read pressure sensors
DCamuti 0:108062801773 104 Tank1 = read_max1270_volts(1, 1, 1); // in volt
DCamuti 0:108062801773 105 Tank2 = read_max1270_volts(0, 1, 1);
DCamuti 1:abca5455262a 106
DCamuti 1:abca5455262a 107 // Select pump duty cycle, start time, and end time
DCamuti 1:abca5455262a 108 if (cntr*Ts <= 20) { //start time
DCamuti 0:108062801773 109 dc = 0.0;
DCamuti 1:abca5455262a 110 } else if (cntr*Ts <= 200) { //end time
DCamuti 1:abca5455262a 111 //
DCamuti 1:abca5455262a 112 //dc = -0.80; // duty cycle (must be negative)
DCamuti 1:abca5455262a 113 //dc=-0.60;
DCamuti 1:abca5455262a 114 //dc=-0.65;
DCamuti 1:abca5455262a 115 dc=-0.70;
DCamuti 1:abca5455262a 116 //dc=-0.75;
DCamuti 1:abca5455262a 117 //dc = -0.0;
DCamuti 0:108062801773 118 } else {
DCamuti 0:108062801773 119 dc = 0.0;
DCamuti 0:108062801773 120 }
DCamuti 1:abca5455262a 121
DCamuti 1:abca5455262a 122 if(dc > 0.0) {
DCamuti 0:108062801773 123 //mot1_ph2 = 0;
DCamuti 0:108062801773 124 mot1_ph1 = 1;
DCamuti 0:108062801773 125 mot_en1 = dc;
DCamuti 1:abca5455262a 126 } else if(dc <=0.0) {
DCamuti 0:108062801773 127 mot1_ph1 = 0;
DCamuti 0:108062801773 128 //mot1_ph2 = 1;
DCamuti 1:abca5455262a 129 mot_en1 = abs(dc);
DCamuti 1:abca5455262a 130 }
DCamuti 1:abca5455262a 131
DCamuti 0:108062801773 132 // Log data
DCamuti 0:108062801773 133 etime[k] = cntr*Ts;
DCamuti 0:108062801773 134 t1v[k] = Tank1;
DCamuti 0:108062801773 135 t2v[k] = Tank2;
DCamuti 0:108062801773 136 dcp[k] = -dc;
DCamuti 0:108062801773 137 k++;
DCamuti 1:abca5455262a 138
DCamuti 0:108062801773 139 t.stop(); // end measuring comp time
DCamuti 0:108062801773 140 dt = Ts-t.read();
DCamuti 0:108062801773 141 //pc.printf("%5.2f %5.2f %5.2f %5.2f \n\r",cntr*Ts,Tank1,Tank2,dc);
DCamuti 1:abca5455262a 142 pc.printf("%5.2f %5.2f %5.2f %5.2f \n\r",cntr*Ts,Tank1,Tank2,dc);
DCamuti 0:108062801773 143 t.reset();
DCamuti 0:108062801773 144 cntr=cntr+1;
DCamuti 1:abca5455262a 145 wait(dt); // wait to ensure sampling period set by Ts
DCamuti 0:108062801773 146 }//while
DCamuti 0:108062801773 147 //mot1_ph2 = 0;
DCamuti 0:108062801773 148 mot_en1 = 0.0;
DCamuti 1:abca5455262a 149
DCamuti 0:108062801773 150
DCamuti 0:108062801773 151 }//main