...

Dependencies:   mbed

Committer:
brianconnett
Date:
Wed Sep 03 22:00:33 2014 +0000
Revision:
0:84ce715fc33b
...

Who changed what in which revision?

UserRevisionLine numberNew contents of line
brianconnett 0:84ce715fc33b 1 #include "mbed.h"
brianconnett 0:84ce715fc33b 2 // APIs
brianconnett 0:84ce715fc33b 3 Serial pc(USBTX, USBRX); // tx, rx for serial USB interface to pc
brianconnett 0:84ce715fc33b 4 SPI spi_max1270(p5, p6, p7);
brianconnett 0:84ce715fc33b 5 SPI spi(p5, p6, p7);
brianconnett 0:84ce715fc33b 6 DigitalOut max1270_cs(p8); //MAX1270 ADC CS
brianconnett 0:84ce715fc33b 7 DigitalOut mot1_ph1(p21);
brianconnett 0:84ce715fc33b 8 DigitalOut mot1_ph2(p22);
brianconnett 0:84ce715fc33b 9 PwmOut mot_en1(p23);
brianconnett 0:84ce715fc33b 10
brianconnett 0:84ce715fc33b 11 LocalFileSystem local("local"); // Create the local filesystem under the name "local"
brianconnett 0:84ce715fc33b 12
brianconnett 0:84ce715fc33b 13 int read_max1270(int chan, int range, int bipol){
brianconnett 0:84ce715fc33b 14 int cword=0x80; //set the start bit
brianconnett 0:84ce715fc33b 15
brianconnett 0:84ce715fc33b 16 spi_max1270.frequency(10000000);
brianconnett 0:84ce715fc33b 17 spi_max1270.format(8, 0); // 8 data bits, CPOL0, and CPHA0 (datasheet Digital Interface)
brianconnett 0:84ce715fc33b 18
brianconnett 0:84ce715fc33b 19 cword |= (chan << 4); //shift channel
brianconnett 0:84ce715fc33b 20 cword |= (range << 3);
brianconnett 0:84ce715fc33b 21 cword |= (bipol << 2);
brianconnett 0:84ce715fc33b 22
brianconnett 0:84ce715fc33b 23 max1270_cs = 0;
brianconnett 0:84ce715fc33b 24
brianconnett 0:84ce715fc33b 25 spi_max1270.write(cword);
brianconnett 0:84ce715fc33b 26 wait_us(15); //15us
brianconnett 0:84ce715fc33b 27 spi_max1270.format(12, 3);
brianconnett 0:84ce715fc33b 28
brianconnett 0:84ce715fc33b 29 int result = spi_max1270.write(0);
brianconnett 0:84ce715fc33b 30
brianconnett 0:84ce715fc33b 31 max1270_cs = 1;
brianconnett 0:84ce715fc33b 32 spi_max1270.format(8, 0);
brianconnett 0:84ce715fc33b 33 return result;
brianconnett 0:84ce715fc33b 34 }
brianconnett 0:84ce715fc33b 35
brianconnett 0:84ce715fc33b 36 float read_max1270_volts(int chan, int range, int bipol){
brianconnett 0:84ce715fc33b 37 float rangevolts=0.0;
brianconnett 0:84ce715fc33b 38 float volts=0.0;
brianconnett 0:84ce715fc33b 39 int adc_res;
brianconnett 0:84ce715fc33b 40
brianconnett 0:84ce715fc33b 41 //read the ADC converter
brianconnett 0:84ce715fc33b 42 adc_res = read_max1270(chan, range, bipol) & 0xFFF;
brianconnett 0:84ce715fc33b 43
brianconnett 0:84ce715fc33b 44 //Determine the voltage range
brianconnett 0:84ce715fc33b 45 if(range) //RNG bit
brianconnett 0:84ce715fc33b 46 rangevolts=10.0;
brianconnett 0:84ce715fc33b 47 else
brianconnett 0:84ce715fc33b 48 rangevolts=5.0;
brianconnett 0:84ce715fc33b 49
brianconnett 0:84ce715fc33b 50 //bi-polar input range
brianconnett 0:84ce715fc33b 51 if(bipol){ //BIP is set, input is +/-
brianconnett 0:84ce715fc33b 52 if(adc_res < 0x800){ //if result was positive
brianconnett 0:84ce715fc33b 53 volts = ((float)adc_res/0x7FF) * rangevolts;
brianconnett 0:84ce715fc33b 54 }
brianconnett 0:84ce715fc33b 55 else{ //result was negative
brianconnett 0:84ce715fc33b 56 volts = -(-((float)adc_res/0x7FF) * rangevolts) - (rangevolts * 2.0);
brianconnett 0:84ce715fc33b 57 }
brianconnett 0:84ce715fc33b 58 }
brianconnett 0:84ce715fc33b 59 else{ //input is positive polarity only
brianconnett 0:84ce715fc33b 60 volts = ((float)adc_res/0xFFF) * rangevolts;
brianconnett 0:84ce715fc33b 61 }
brianconnett 0:84ce715fc33b 62
brianconnett 0:84ce715fc33b 63 return volts;
brianconnett 0:84ce715fc33b 64 }
brianconnett 0:84ce715fc33b 65
brianconnett 0:84ce715fc33b 66 float Tank1,Tank2,dt,h1,h2;
brianconnett 0:84ce715fc33b 67 float Ts = 1.0; // Sampling period 1/Ts Hz
brianconnett 0:84ce715fc33b 68
brianconnett 0:84ce715fc33b 69 //float Tl = XXXX; // Logging period
brianconnett 0:84ce715fc33b 70 //float c1 = XX.X/(X.XX-X.XX); // cm/V
brianconnett 0:84ce715fc33b 71 //float c2 = XX.X/(X.XX-X.XX); // cm/V
brianconnett 0:84ce715fc33b 72 //float v10 = -X.XX; // V
brianconnett 0:84ce715fc33b 73 //float v20 = -X.XX; // V
brianconnett 0:84ce715fc33b 74
brianconnett 0:84ce715fc33b 75 // Arrays for data storage
brianconnett 0:84ce715fc33b 76 float etime[200];
brianconnett 0:84ce715fc33b 77 float t1v[200];
brianconnett 0:84ce715fc33b 78 float t2v[200];
brianconnett 0:84ce715fc33b 79 //float t1h[200];
brianconnett 0:84ce715fc33b 80 //float t2h[200];
brianconnett 0:84ce715fc33b 81 float dcp[200];
brianconnett 0:84ce715fc33b 82 Timer t;
brianconnett 0:84ce715fc33b 83
brianconnett 0:84ce715fc33b 84 // Open "results.M" on the local file system for writing
brianconnett 0:84ce715fc33b 85 FILE *fp = fopen("/local/results.M", "w");
brianconnett 0:84ce715fc33b 86
brianconnett 0:84ce715fc33b 87 float cntr;
brianconnett 0:84ce715fc33b 88 float dc;
brianconnett 0:84ce715fc33b 89 int k;
brianconnett 0:84ce715fc33b 90
brianconnett 0:84ce715fc33b 91 int main ()
brianconnett 0:84ce715fc33b 92 {
brianconnett 0:84ce715fc33b 93 pc.baud(921600); // Establish baud rate
brianconnett 0:84ce715fc33b 94 mot_en1.period_us(50); // Set PWM length to 50 us
brianconnett 0:84ce715fc33b 95 max1270_cs = 1; // Activate A/D
brianconnett 0:84ce715fc33b 96 cntr = 0.0; // cntr used to keep track of sample period and elpased time
brianconnett 0:84ce715fc33b 97
brianconnett 0:84ce715fc33b 98 // initialize data vectors
brianconnett 0:84ce715fc33b 99 for(k=0;k<200;k++)
brianconnett 0:84ce715fc33b 100 { etime[k] = 0.0;
brianconnett 0:84ce715fc33b 101 t1v[k] = 0.0;
brianconnett 0:84ce715fc33b 102 t2v[k] = 0.0;
brianconnett 0:84ce715fc33b 103 //t1h[k] = 0.0;
brianconnett 0:84ce715fc33b 104 //t2h[k] = 0.0;
brianconnett 0:84ce715fc33b 105 dcp[k] = 0.0;
brianconnett 0:84ce715fc33b 106 }
brianconnett 0:84ce715fc33b 107 k = 0; // Reset index counter
brianconnett 0:84ce715fc33b 108
brianconnett 0:84ce715fc33b 109 while(cntr*Ts <= 180) {
brianconnett 0:84ce715fc33b 110 t.start(); // start measuring comp time
brianconnett 0:84ce715fc33b 111
brianconnett 0:84ce715fc33b 112 // Read pressure sensors
brianconnett 0:84ce715fc33b 113 Tank1 = read_max1270_volts(1, 1, 1);
brianconnett 0:84ce715fc33b 114 Tank2 = read_max1270_volts(0, 1, 1);
brianconnett 0:84ce715fc33b 115
brianconnett 0:84ce715fc33b 116 // Convert pressure voltage to tank height
brianconnett 0:84ce715fc33b 117 //h1 = c1*(Tank1 - v10);
brianconnett 0:84ce715fc33b 118 //h2 = c2*(Tank2 - v20);
brianconnett 0:84ce715fc33b 119
brianconnett 0:84ce715fc33b 120 // Drive pump for ID
brianconnett 0:84ce715fc33b 121 //if (cntr*Ts <= 5) {
brianconnett 0:84ce715fc33b 122 // dc = 0.0;
brianconnett 0:84ce715fc33b 123 // } else
brianconnett 0:84ce715fc33b 124 if (cntr*Ts <= 180) {
brianconnett 0:84ce715fc33b 125 dc = -0.7; //<***CHANGE THIS***>
brianconnett 0:84ce715fc33b 126 } else {
brianconnett 0:84ce715fc33b 127 dc = 0.0;
brianconnett 0:84ce715fc33b 128 }
brianconnett 0:84ce715fc33b 129
brianconnett 0:84ce715fc33b 130 if(dc > 0.0){
brianconnett 0:84ce715fc33b 131 mot1_ph2 = 0;
brianconnett 0:84ce715fc33b 132 mot1_ph1 = 1;
brianconnett 0:84ce715fc33b 133 mot_en1 = dc;
brianconnett 0:84ce715fc33b 134 }
brianconnett 0:84ce715fc33b 135 else if(dc < -0.0){
brianconnett 0:84ce715fc33b 136 mot1_ph1 = 0;
brianconnett 0:84ce715fc33b 137 mot1_ph2 = 1;
brianconnett 0:84ce715fc33b 138 mot_en1 = abs(dc);}
brianconnett 0:84ce715fc33b 139 // Log data
brianconnett 0:84ce715fc33b 140 etime[k] = cntr*Ts;
brianconnett 0:84ce715fc33b 141 t1v[k] = Tank1;
brianconnett 0:84ce715fc33b 142 t2v[k] = Tank2;
brianconnett 0:84ce715fc33b 143 //t1h[k] = h1;
brianconnett 0:84ce715fc33b 144 //t2h[k] = h2;
brianconnett 0:84ce715fc33b 145 dcp[k] = -dc;
brianconnett 0:84ce715fc33b 146 k++;
brianconnett 0:84ce715fc33b 147
brianconnett 0:84ce715fc33b 148 t.stop(); // end measuring comp time
brianconnett 0:84ce715fc33b 149 dt = Ts-t.read();
brianconnett 0:84ce715fc33b 150 pc.printf("%5.2f %5.2f %5.2f %5.2f \n\r",cntr*Ts,Tank1,Tank2,dc);
brianconnett 0:84ce715fc33b 151 //pc.printf("%5.2f %5.2f %5.2f %5.2f %5.2f %5.2f \n\r",cntr*Ts,Tank1,Tank2,h1,h2,dc);
brianconnett 0:84ce715fc33b 152 t.reset();
brianconnett 0:84ce715fc33b 153 cntr=cntr+1;
brianconnett 0:84ce715fc33b 154 wait(dt); // wait to ensure sampling period set by Ts
brianconnett 0:84ce715fc33b 155 }//while
brianconnett 0:84ce715fc33b 156 mot1_ph2 = 0;
brianconnett 0:84ce715fc33b 157 mot_en1 = 0.0;
brianconnett 0:84ce715fc33b 158
brianconnett 0:84ce715fc33b 159 // Print out log variables in MATLAB structured variable format.
brianconnett 0:84ce715fc33b 160 pc.printf("Printing log variables to file on mBed ... ");
brianconnett 0:84ce715fc33b 161 if(1) {
brianconnett 0:84ce715fc33b 162 for(k=0; k<180; k++) {
brianconnett 0:84ce715fc33b 163 fprintf(fp,"t(%d,1) = %.5f;\n",k+1,etime[k]);
brianconnett 0:84ce715fc33b 164 fprintf(fp,"t1v(%d,1) = %.5f;\n",k+1,t1v[k]);
brianconnett 0:84ce715fc33b 165 fprintf(fp,"t2v(%d,1) = %.5f;\n",k+1,t2v[k]);
brianconnett 0:84ce715fc33b 166 //fprintf(fp,"t1h(%d,1) = %.5f;\n",k+1,t1h[k]);
brianconnett 0:84ce715fc33b 167 //fprintf(fp,"t2h(%d,1) = %.5f;\n",k+1,t2h[k]);
brianconnett 0:84ce715fc33b 168 fprintf(fp,"dcp(%d,1) = %.5f;\n",k+1,dcp[k]);
brianconnett 0:84ce715fc33b 169 }
brianconnett 0:84ce715fc33b 170 }
brianconnett 0:84ce715fc33b 171 printf("done.\r\n");
brianconnett 0:84ce715fc33b 172
brianconnett 0:84ce715fc33b 173 // Close file
brianconnett 0:84ce715fc33b 174 fclose(fp);
brianconnett 0:84ce715fc33b 175
brianconnett 0:84ce715fc33b 176 }//main