![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Upload to Component Test
Dependencies: BridgeDriver_NA FrontPanelButtons MCP23017 TextLCD mbed
Diff: main.cpp
- 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; + +}