...

Dependencies:   mbed Matrix

Committer:
riobrien
Date:
Wed Feb 11 21:03:39 2015 +0000
Revision:
2:a9366dce183b
Parent:
1:daaa91186ace
none

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 2:a9366dce183b 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 2:a9366dce183b 68
riobrien 2:a9366dce183b 69 // Calibration constant: change for your system
riobrien 2:a9366dce183b 70 float v10 = 0;// V
riobrien 2:a9366dce183b 71 float v20 = 0; //V
riobrien 2:a9366dce183b 72 float c1 = 1; // cm/V
riobrien 2:a9366dce183b 73 float c2 = 1;// cm/V
riobrien 2:a9366dce183b 74
riobrien 2:a9366dce183b 75 int leng = 200;
riobrien 1:daaa91186ace 76 // Arrays for data storage
riobrien 1:daaa91186ace 77 float etime[200];
riobrien 1:daaa91186ace 78 float t1v[200];
riobrien 1:daaa91186ace 79 float t2v[200];
riobrien 2:a9366dce183b 80 float t1h[200];
riobrien 2:a9366dce183b 81 float t2h[200];
riobrien 1:daaa91186ace 82 float dcp[200];
riobrien 0:722b391fe228 83 Timer t;
riobrien 0:722b391fe228 84
riobrien 1:daaa91186ace 85 // Open "results.M" on the local file system for writing
riobrien 2:a9366dce183b 86 FILE *fp = fopen("/local/cal.M","w");
riobrien 1:daaa91186ace 87
riobrien 0:722b391fe228 88 float cntr;
riobrien 0:722b391fe228 89 float dc;
riobrien 1:daaa91186ace 90 int k;
riobrien 1:daaa91186ace 91
riobrien 0:722b391fe228 92 int main ()
riobrien 0:722b391fe228 93 {
riobrien 1:daaa91186ace 94 pc.baud(921600); // Establish baud rate
riobrien 1:daaa91186ace 95 mot_en1.period_us(50); // Set PWM length to 50 us
riobrien 1:daaa91186ace 96 max1270_cs = 1; // Activate A/D
riobrien 1:daaa91186ace 97 cntr = 0.0; // cntr used to keep track of sample period and elpased time
riobrien 1:daaa91186ace 98
riobrien 1:daaa91186ace 99 // initialize data vectors
riobrien 2:a9366dce183b 100 for(k=0;k<leng;k++)
riobrien 1:daaa91186ace 101 { etime[k] = 0.0;
riobrien 1:daaa91186ace 102 t1v[k] = 0.0;
riobrien 2:a9366dce183b 103 t2v[k] = 0.0;
riobrien 2:a9366dce183b 104 t1h[k] = 0.0;
riobrien 2:a9366dce183b 105 t2h[k] = 0.0;
riobrien 2:a9366dce183b 106 dcp[k] = 0.0;
riobrien 1:daaa91186ace 107 }
riobrien 1:daaa91186ace 108 k = 0; // Reset index counter
riobrien 2:a9366dce183b 109 pc.printf(" Time Tank1 Tank2 H1 H2 DC \n\r");
riobrien 2:a9366dce183b 110 while(cntr*Ts <= leng) {
riobrien 0:722b391fe228 111 t.start(); // start measuring comp time
riobrien 1:daaa91186ace 112
riobrien 1:daaa91186ace 113 // Read pressure sensors
riobrien 1:daaa91186ace 114 Tank1 = read_max1270_volts(1, 1, 1);
riobrien 1:daaa91186ace 115 Tank2 = read_max1270_volts(0, 1, 1);
riobrien 1:daaa91186ace 116
riobrien 1:daaa91186ace 117 // Convert pressure voltage to tank height
riobrien 2:a9366dce183b 118 h1 = c1*(Tank1 - v10);
riobrien 2:a9366dce183b 119 h2 = c2*(Tank2 - v20);
riobrien 0:722b391fe228 120
riobrien 1:daaa91186ace 121 // Drive pump for ID
riobrien 2:a9366dce183b 122 if (cntr*Ts <= 10) {
riobrien 0:722b391fe228 123 dc = 0.0;
riobrien 2:a9366dce183b 124 } else if (cntr*Ts <= 200) {
riobrien 1:daaa91186ace 125 dc = -0.7;
riobrien 0:722b391fe228 126 } else {
riobrien 0:722b391fe228 127 dc = 0.0;
riobrien 2:a9366dce183b 128 }
riobrien 2:a9366dce183b 129 //dc = -0.7;
riobrien 0:722b391fe228 130
riobrien 0:722b391fe228 131 if(dc > 0.0){
riobrien 2:a9366dce183b 132 //mot1_ph2 = 0;
riobrien 0:722b391fe228 133 mot1_ph1 = 1;
riobrien 0:722b391fe228 134 mot_en1 = dc;
riobrien 0:722b391fe228 135 }
riobrien 0:722b391fe228 136 else if(dc < -0.0){
riobrien 0:722b391fe228 137 mot1_ph1 = 0;
riobrien 2:a9366dce183b 138 //mot1_ph2 = 1;
riobrien 0:722b391fe228 139 mot_en1 = abs(dc);}
riobrien 1:daaa91186ace 140 // Log data
riobrien 1:daaa91186ace 141 etime[k] = cntr*Ts;
riobrien 1:daaa91186ace 142 t1v[k] = Tank1;
riobrien 1:daaa91186ace 143 t2v[k] = Tank2;
riobrien 2:a9366dce183b 144 t1h[k] = h1;
riobrien 2:a9366dce183b 145 t2h[k] = h2;
riobrien 1:daaa91186ace 146 dcp[k] = -dc;
riobrien 1:daaa91186ace 147 k++;
riobrien 1:daaa91186ace 148
riobrien 0:722b391fe228 149 t.stop(); // end measuring comp time
riobrien 0:722b391fe228 150 dt = Ts-t.read();
riobrien 2:a9366dce183b 151 //pc.printf("%5.2f %5.2f %5.2f %5.2f \n\r",cntr*Ts,Tank1,Tank2,dc);
riobrien 2:a9366dce183b 152 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 153 t.reset();
riobrien 0:722b391fe228 154 cntr=cntr+1;
riobrien 0:722b391fe228 155 wait(dt); // wait to ensure sampling period set by Ts
riobrien 0:722b391fe228 156 }//while
riobrien 2:a9366dce183b 157 //mot1_ph2 = 0;
riobrien 0:722b391fe228 158 mot_en1 = 0.0;
riobrien 1:daaa91186ace 159
riobrien 1:daaa91186ace 160 // Print out log variables in MATLAB structured variable format.
riobrien 1:daaa91186ace 161 pc.printf("Printing log variables to file on mBed ... ");
riobrien 1:daaa91186ace 162 if(1) {
riobrien 1:daaa91186ace 163 for(k=0; k<200; k++) {
riobrien 1:daaa91186ace 164 fprintf(fp,"t(%d,1) = %.5f;\n",k+1,etime[k]);
riobrien 1:daaa91186ace 165 fprintf(fp,"t1v(%d,1) = %.5f;\n",k+1,t1v[k]);
riobrien 1:daaa91186ace 166 fprintf(fp,"t2v(%d,1) = %.5f;\n",k+1,t2v[k]);
riobrien 2:a9366dce183b 167 fprintf(fp,"t1h(%d,1) = %.5f;\n",k+1,t1h[k]);
riobrien 2:a9366dce183b 168 fprintf(fp,"t2h(%d,1) = %.5f;\n",k+1,t2h[k]);
riobrien 1:daaa91186ace 169 fprintf(fp,"dcp(%d,1) = %.5f;\n",k+1,dcp[k]);
riobrien 1:daaa91186ace 170 }
riobrien 1:daaa91186ace 171 }
riobrien 1:daaa91186ace 172 printf("done.\r\n");
riobrien 1:daaa91186ace 173
riobrien 1:daaa91186ace 174 // Close file
riobrien 1:daaa91186ace 175 fclose(fp);
riobrien 1:daaa91186ace 176
riobrien 0:722b391fe228 177 }//main