![](/media/cache/group/default_image.jpg.50x50_q85.jpg)
...
Dependencies: mbed
main.cpp@0:84ce715fc33b, 2014-09-03 (annotated)
- Committer:
- brianconnett
- Date:
- Wed Sep 03 22:00:33 2014 +0000
- Revision:
- 0:84ce715fc33b
...
Who changed what in which revision?
User | Revision | Line number | New 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 |