...

Dependencies:   mbed

Revision:
0:84ce715fc33b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Wed Sep 03 22:00:33 2014 +0000
@@ -0,0 +1,176 @@
+#include "mbed.h"
+// APIs
+Serial pc(USBTX, USBRX); // tx, rx for serial USB interface to pc
+SPI spi_max1270(p5, p6, p7);
+SPI spi(p5, p6, p7);
+DigitalOut max1270_cs(p8);  //MAX1270 ADC CS
+DigitalOut mot1_ph1(p21);
+DigitalOut mot1_ph2(p22);
+PwmOut mot_en1(p23);
+
+LocalFileSystem local("local"); // Create the local filesystem under the name "local"
+
+int read_max1270(int chan, int range, int bipol){
+    int cword=0x80;     //set the start bit
+    
+    spi_max1270.frequency(10000000);
+    spi_max1270.format(8, 0);   // 8 data bits, CPOL0, and CPHA0 (datasheet Digital Interface)
+        
+    cword |= (chan << 4);   //shift channel
+    cword |= (range << 3);
+    cword |= (bipol << 2);
+            
+    max1270_cs = 0;
+           
+    spi_max1270.write(cword);
+    wait_us(15);    //15us
+    spi_max1270.format(12, 3);
+    
+    int result = spi_max1270.write(0);
+    
+    max1270_cs = 1;
+    spi_max1270.format(8, 0);
+    return result;
+}
+
+float read_max1270_volts(int chan, int range, int bipol){
+    float rangevolts=0.0;
+    float volts=0.0;
+    int adc_res;
+
+    //read the ADC converter
+    adc_res = read_max1270(chan, range, bipol) & 0xFFF;
+        
+   //Determine the voltage range
+   if(range)  //RNG bit 
+     rangevolts=10.0;
+   else
+     rangevolts=5.0;
+             
+   //bi-polar input range
+   if(bipol){ //BIP is set, input is +/-
+     if(adc_res < 0x800){ //if result was positive
+      volts = ((float)adc_res/0x7FF) * rangevolts;      
+     }       
+     else{  //result was negative
+      volts = -(-((float)adc_res/0x7FF) * rangevolts) - (rangevolts * 2.0); 
+     }
+   }
+   else{  //input is positive polarity only
+      volts = ((float)adc_res/0xFFF) * rangevolts;   
+   }
+   
+   return volts;     
+}
+
+float Tank1,Tank2,dt,h1,h2;
+float Ts = 1.0; // Sampling period 1/Ts Hz 
+
+//float Tl = XXXX; // Logging period
+//float c1 = XX.X/(X.XX-X.XX); // cm/V
+//float c2 = XX.X/(X.XX-X.XX); // cm/V
+//float v10 = -X.XX; // V
+//float v20 = -X.XX; // V
+
+// Arrays for data storage
+float etime[200];
+float t1v[200];
+float t2v[200];
+//float t1h[200];
+//float t2h[200];
+float dcp[200];
+Timer t;
+
+ // Open "results.M" on the local file system for writing
+FILE *fp = fopen("/local/results.M", "w");
+
+float cntr;
+float dc;
+int k;
+
+int main ()
+{
+    pc.baud(921600); // Establish baud rate 
+    mot_en1.period_us(50); // Set PWM length to 50 us   
+    max1270_cs = 1; // Activate A/D
+    cntr = 0.0; // cntr used to keep track of sample period and elpased time
+    
+    // initialize data vectors
+    for(k=0;k<200;k++)
+  { etime[k] = 0.0;
+    t1v[k] = 0.0;
+    t2v[k]    = 0.0;
+    //t1h[k]    = 0.0;
+    //t2h[k]    = 0.0;
+    dcp[k]    = 0.0;    
+  }
+  k = 0; // Reset index counter
+    
+    while(cntr*Ts <= 180) {
+        t.start(); // start measuring comp time
+        
+        // Read pressure sensors        
+        Tank1 = read_max1270_volts(1, 1, 1);
+        Tank2 = read_max1270_volts(0, 1, 1);
+        
+        // Convert pressure voltage to tank height
+        //h1 = c1*(Tank1 - v10);
+        //h2 = c2*(Tank2 - v20);
+                
+        // Drive pump for ID
+        //if (cntr*Ts <= 5) {
+        //    dc = 0.0;
+       // } else 
+        if (cntr*Ts <= 180) {
+            dc = -0.7;      //<***CHANGE THIS***>
+        } else {
+            dc = 0.0;
+        }                
+        
+        if(dc > 0.0){
+            mot1_ph2 = 0;
+            mot1_ph1 = 1;
+            mot_en1 = dc;
+        }
+        else if(dc < -0.0){
+            mot1_ph1 = 0;
+            mot1_ph2 = 1;
+            mot_en1 = abs(dc);}
+        // Log data
+        etime[k] = cntr*Ts;
+        t1v[k] = Tank1;
+        t2v[k] = Tank2;
+        //t1h[k] = h1;
+        //t2h[k] = h2;
+        dcp[k] = -dc;
+        k++;
+              
+        t.stop(); // end measuring comp time
+        dt = Ts-t.read();
+        pc.printf("%5.2f %5.2f %5.2f %5.2f \n\r",cntr*Ts,Tank1,Tank2,dc);
+        //pc.printf("%5.2f %5.2f %5.2f %5.2f %5.2f %5.2f \n\r",cntr*Ts,Tank1,Tank2,h1,h2,dc);        
+        t.reset();
+        cntr=cntr+1;
+        wait(dt); // wait to ensure sampling period set by Ts    
+    }//while
+    mot1_ph2 = 0;
+    mot_en1 = 0.0;
+    
+    // Print out log variables in MATLAB structured variable format.
+    pc.printf("Printing log variables to file on mBed           ... ");
+    if(1) {
+        for(k=0; k<180; k++) {
+            fprintf(fp,"t(%d,1) = %.5f;\n",k+1,etime[k]);
+            fprintf(fp,"t1v(%d,1) = %.5f;\n",k+1,t1v[k]);
+            fprintf(fp,"t2v(%d,1)    = %.5f;\n",k+1,t2v[k]);
+            //fprintf(fp,"t1h(%d,1)    = %.5f;\n",k+1,t1h[k]);
+            //fprintf(fp,"t2h(%d,1)    = %.5f;\n",k+1,t2h[k]);
+            fprintf(fp,"dcp(%d,1)    = %.5f;\n",k+1,dcp[k]);            
+        }        
+    }
+    printf("done.\r\n");
+
+    // Close file
+    fclose(fp);
+    
+}//main
\ No newline at end of file