...

Dependencies:   mbed Matrix

Committer:
riobrien
Date:
Thu Aug 07 17:55:45 2014 +0000
Revision:
1:daaa91186ace
Parent:
0:722b391fe228
Child:
2:a9366dce183b
...;

Who changed what in which revision?

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