Upload to Component Test

Dependencies:   BridgeDriver_NA FrontPanelButtons MCP23017 TextLCD mbed

Revision:
0:1d73f030c262
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Tue Jan 20 04:21:28 2015 +0000
@@ -0,0 +1,271 @@
+#include "mbed.h"
+#include "LocalPinNames.h"
+#include "BridgeDriver.h"
+#include "FrontPanelButtons.h"
+#include "TextLCD.h"
+
+I2C i2c( P0_10, P0_11 ); // I2C bus (SDA, SCL)
+BridgeDriver bridges( &i2c ); // bridge
+TextLCD_I2C lcd( &i2c, MCP23008_SA0, TextLCD::LCD20x4 ); // LCD
+FrontPanelButtons buttons( &i2c );    // front panel buttons
+
+DigitalIn TDC(DIO0, PullDown);
+AnalogIn signal(AI0);
+
+Ticker ErrorWatch;
+Timer timer; //initialize a timer
+Timer avgCycTimer;
+
+float totaltime = 0;
+
+SPI spi(P0_9, P0_8, P0_7); // mosi(out), miso(in), sclk(clock)
+DigitalOut cs_Current(P1_0); // cs (the chip select signal)
+
+float stateDir = 0;
+int numCycles = 200000;
+int cycleCount = 1;
+
+void errorCheck(){
+    
+    if (timer.read() > 3.0){
+        bridges.drive( BridgeDriver::MOTOR_B, 0.0 );
+        
+        lcd.cls(); //clear the display
+        lcd.setAddress ( 0, 0 );
+        lcd.printf( "<Error Occurred>" );
+        lcd.setAddress ( 0, 1 );
+        lcd.printf( "Timeout, transition greater than 3      seconds" );
+        lcd.setAddress ( 0, 3 );
+        lcd.printf( "<Press Sel to Resume" );
+        while (!buttons.readSel());
+        lcd.cls(); //clear the display
+        
+        lcd.setAddress( 0, 0 );
+        lcd.printf( "Cycle %d/%3d", cycleCount, numCycles );
+        lcd.setAddress( 0, 1 );
+        lcd.printf( "Avg t(sec): %1.3f", (totaltime / cycleCount));
+
+        timer.reset();
+        timer.start();
+        
+        bridges.drive( BridgeDriver::MOTOR_B, stateDir );
+    }   
+}
+
+
+
+float calcCurrent(int channel){
+        
+    // Select the device by seting chip select low
+    cs_Current = 0;
+
+    // sending the 6 bits + 1 bit to ignore the null bit
+    // coming from the device, so the data that is sent is 1100000
+    // get data for channel 0
+    //spi.write(0x68); // 1101000
+    
+    // create the message to send in order to get the appropriate data transmitted from the ADC
+    unsigned char channelBits = (channel-1) << 2; // shift the channel bits into there position
+    unsigned char msg = 96 + channelBits;
+    spi.write(msg);
+    
+    // now the device sends back the readings 12 bits, 7 bits at a time
+    uint8_t high = spi.write(0x00);
+    uint8_t low = spi.write(0x00);
+
+    // shift out the right bits
+    low = ( high << 5 ) | (low >> 2);
+    high = high >> 3;
+    
+    
+    float DigOutVal = ( high << 8 ) | low; // shift and or the result together
+
+    cs_Current = 1; // Deselect the device
+    
+    //return current;
+    return DigOutVal;
+}
+
+int main() {
+   
+    //initialize Ticker
+    ErrorWatch.attach(&errorCheck, 3);
+    
+    // Setup the spi for 7 bit data, high steady state clock,
+    // second edge capture, with a 1MHz clock rate
+    spi.format(7,0);
+    spi.frequency(1000000);
+
+    i2c.frequency(1000000);
+    lcd.setBacklight(TextLCD::LightOn);
+    wait(.6);
+    lcd.cls(); //clear the display
+    lcd.setAddress(0,0); //set cursor to 0,0
+       
+    int count = 0;
+    
+    bridges.enablePwm    (  0,  1,  0,  0 );
+    bridges.drive( BridgeDriver::MOTOR_B, 0.0 );
+
+    lcd.cls(); //clear the display
+    lcd.setAddress ( 0, 2 );
+    lcd.printf( "<Press Sel to start>" );
+    
+    while (!buttons.readSel()){
+        if(buttons.readUp() && numCycles < 999999 ){
+            numCycles += 500;
+            wait(0.2); //so that the speed of changing the numbers is more controllable, should mean you can move 20 digits per second
+        }
+        else if (buttons.readDown() && numCycles > 0 ){
+            numCycles -= 500;
+            wait(0.2); //so that the speed of changing the numbers is more controllable, should mean you can move 20 digits per second
+        }
+        lcd.setAddress ( 0, 0 );
+        lcd.printf( "<Cycles: %d >" , numCycles );
+    }
+        
+    bridges.drive( 2, 1 ); //turn on the hall sensor voltage
+    
+    int hallCount = 109;
+    
+    //Initialize the spoiler by rotating to stall currents and finding how many ticks the hall sensor takes through the rotation
+    bridges.drive( BridgeDriver::MOTOR_B, -1.0 );
+    while (calcCurrent(4) < 2200);
+    bridges.drive( BridgeDriver::MOTOR_B, 0.0 );
+//    wait(1);
+//    bridges.drive( BridgeDriver::MOTOR_B, 1.0 );
+//    wait(1);
+//    
+//    int flag = 0;
+//    while (calcCurrent(3) < 2200){
+//        if(signal.read() >= 0.8 && flag == 0){
+//                flag = 1;
+//                hallCount++;
+//            }
+//        else if (signal.read() < 0.8 && flag == 1)
+//            flag = 0;
+//    }
+
+    bridges.drive( BridgeDriver::MOTOR_B, 0.0 );
+    wait(3);
+    
+    
+    lcd.cls(); //clear the display
+    
+    while(cycleCount <= numCycles){
+        
+        avgCycTimer.reset();
+        avgCycTimer.start();
+        
+        lcd.setAddress( 0, 0 );
+        lcd.printf( "Cycle %d/%3d", cycleCount, numCycles );
+        
+        stateDir = 1;
+        bridges.drive( BridgeDriver::MOTOR_B, 1.0 );
+        timer.reset();
+        timer.start();
+        
+        int flag = 0;
+        count = 0;
+        
+        while (TDC.read() == 1){ //while not at TDC
+            if(signal.read() >= 0.8 && flag == 0){
+                flag = 1;
+                count++;
+            }
+            else if (signal.read() < 0.8 && flag == 1)
+                flag = 0;
+        }
+        
+        timer.stop();
+    
+        //Pause at TDC for 5 seconds before continuing
+        stateDir = 0;
+        bridges.drive( BridgeDriver::MOTOR_B, 0.0 );
+        wait(1);
+        stateDir = 1;
+        bridges.drive( BridgeDriver::MOTOR_B, 1.0 );
+        
+        timer.reset();
+        timer.start();
+        
+        int stopCount = 0;
+        while (stopCount < (hallCount - count - 20)){
+            if(signal.read() >= 0.8 && flag == 0){
+                flag = 1;
+                stopCount++;
+            }
+            else if (signal.read() < 0.8 && flag == 1)
+                flag = 0;
+        }
+        
+        timer.stop();
+        
+        //Pause at the end state before rotating back
+        stateDir = 0;
+        bridges.drive( BridgeDriver::MOTOR_B, 0.0 );
+        wait(1);
+        stateDir = -1;
+        bridges.drive( BridgeDriver::MOTOR_B, -1.0 );
+        
+        timer.reset();
+        timer.start();
+        
+        flag = 0;
+        count = 0;
+        while (TDC.read() == 1){ //while not at TDC
+            if(signal.read() >= 0.8 && flag == 0){
+                flag = 1;
+                count++;
+            }
+            else if (signal.read() < 0.8 && flag == 1)
+                flag = 0;
+        }
+        
+        timer.stop();
+        
+        //Pause at TDC for 5 seconds before continuing
+        stateDir = 0;
+        bridges.drive( BridgeDriver::MOTOR_B, 0.0 );
+        wait(1);
+        stateDir = -1;
+        bridges.drive( BridgeDriver::MOTOR_B, -1.0 );
+        
+        timer.reset();
+        timer.start();
+        
+        stopCount = 0;
+        while (stopCount < (hallCount - count - 15)){
+            if(signal.read() >= 0.8 && flag == 0){
+                flag = 1;
+                stopCount++;
+            }
+            else if (signal.read() < 0.8 && flag == 1)
+                flag = 0;
+        }
+        
+        timer.stop();
+        
+        //Pause at TDC for 5 seconds before continuing
+        stateDir = 0;
+        bridges.drive( BridgeDriver::MOTOR_B, 0.0 );
+        wait(1);  
+        
+        avgCycTimer.stop();
+        
+        totaltime += avgCycTimer.read();
+        lcd.setAddress( 0, 1 );
+        lcd.printf( "Avg t(sec): %1.3f", (totaltime / cycleCount));
+        wait(0.2);
+        
+        cycleCount++;
+    } 
+    
+    lcd.cls(); //clear the display   
+    lcd.setAddress(0,0);
+    lcd.printf("END OF PROGRAM");
+    lcd.setAddress(0,1);
+    lcd.printf("Num Cycles Met");
+    return 0;
+    
+}