Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: BCEmotor Battery_Linear_Actuator_ Controller_ IMU_code_ LTC1298_7_14 MODSERIAL PosVelFilter_7_14 System_ mbed
Fork of 7_14_17_FSG_working by
main.cpp
- Committer:
- mdavis30
- Date:
- 2017-06-09
- Revision:
- 0:381a84fad08b
- Child:
- 2:c3cb3ea3c9fa
File content as of revision 0:381a84fad08b:
#include "mbed.h" #include "MODSERIAL.h" //for IMU (and got rid of regular serial library) #include "IMU_code.h" #include "StaticDefs.hpp" #include "ltc1298.hpp" #include <cstdlib> #include <string> using namespace std; #include "IMU_code.h" //IMU code #include "Battery_Linear_Actuator.h" //Battery Linear Actuator code (TROY) (FIX INCLUSION ISSUES, ports) Serial PC(USBTX,USBRX); //tx, rx extern "C" void mbed_reset(); //utilized to reset the mbed through the serial terminal char Key; string IMU_STRING = ""; DigitalOut pin_ENA(p23); //ENA //DigitalOut PinName (pin) //Troy: IF WE NEED IT DigitalOut pin_IN1(p22); //IN1 (changed from pin11 and 12) DigitalOut pin_IN2(p21); //IN2 //should I use wait or interrupt to control this? DigitalOut led1(LED1); DigitalOut led2(LED2); DigitalOut led3(LED3); DigitalOut led4(LED4); DigitalOut enab(p9); // a/d converter enable AnalogIn pressure_analog_in(A5); //Initialize pin20 (read is float value) /* ************ These tickers work independent of any while loops ********** */ Ticker IMU_ticker; //ticker for printing IMU //https://developer.mbed.org/handbook/Ticker Ticker BE_position_ticker; //probably delete soon Ticker PRESSURE_ticker; Ticker BCE_ticker; //new 6/5/17 /*float motor_cmd = 0.0; float positionCmd = 250.0; float P = 0.10; float I = 0.00; float D = 0.00; */ float positionCmd = 250.0; /* ************************************************************************* */ void IMU_ticking() { led1 = !led1; //flash the IMU LED if (!IMU_STRING.empty()) PC.printf("%s\n", IMU_STRING); //if there's something there, print it } void PRESSURE_ticking() { PC.printf("Pressure sensor (PSI)\nPRESS_PSI: %3.3f\n", 3.3*1.503*10 * pressure_analog_in.read()); //read the analog pin //this voltage has been checked and scaled properly (5/19/2017) } void BCE_ticking() //new 6/5/17 { PC.printf("BE_pos: %3.0f mm BE_vel: %2.2f mm/s Set Point %3.0f controller output: % 1.3f \n", pvf().getPosition(), pvf().getVelocity(), positionCmd, posCon().getOutput()); } int main() { PC.baud(115200); //mbed to PC serial connection speed //PC.baud(230400); //got screwy when i changed it hBridge().stop(); //start up the system timer so the position velocity estimator has a time signal systemTime().start(); enab=1; //setup and start the adc. This runs on a fixed interval and is interrupt driven adc().initialize(); adc().start(); //Initialize the position velocity filter. This will consume a couple of seconds for //the filter to converge pvf().init(); ////CHANGED TO GLOBAL VARIABLES float motor_cmd = 0.0; // float positionCmd = 250.0; float P = 0.10; float I = 0.00; float D = 0.00; float count = 0.0; //char userInput; //from Trent's code? hBridge().run(motor_cmd); //set the intial gains for the position controller posCon().setPgain(P); posCon().setIgain(I); posCon().setDgain(D); //posCon().writeSetPoint(positionCmd); /* *************************** LED *************************** */ led1 = 1; //initial values led2 = 1; led3 = 1; led4 = 1; /* *************************** LED *************************** */ PC.printf("Program Started 6/5/17\n"); //PC.printf("Hit shift + \"H\" to home the battery Linear Actuator\n"); /* *************************** Potentiometer *************************** */ PRESSURE_ticker.attach(&PRESSURE_ticking, 2.0); /* *************************** Potentiometer *************************** */ /* *************************** MOTOR CONTROLLER *************************** */ Battery_Linear_Actuator BLA_object; //create the IMU object from the imported class /* *************************** MOTOR CONTROLLER *************************** */ /* *************************** IMU *************************** */ IMU_code IMU_object; //create the IMU object from the imported class IMU_ticker.attach(&IMU_ticking, 2.0); /* *************************** IMU *************************** */ /* *************************** BCE *************************** */ float previous_positionCmd = -1; BCE_ticker.attach(&BCE_ticking, 2.0); /* *************************** BCE *************************** */ while(1) { /* *************************** IMU *************************** */ IMU_STRING = IMU_object.IMU_run(); //grab the IMU string each iteration through the loop /* *************************** IMU *************************** */ /* Buoyancy Engine */ // update the position velocity filter pvf().update(); //update the controller with the current numbers in the position guesser posCon().update(pvf().getPosition(), pvf().getVelocity(), pvf().getDt()) ; hBridge().run(posCon().getOutput()); /* Buoyancy Engine */ //FOR DEBUGGING //PC.printf("BE_pos: %3.0f mm BE_vel: %2.2f mm/s Set Point %3.0f controller output: % 1.3f P: %1.3f I: %1.4f D: %1.4f\r", pvf().getPosition(), pvf().getVelocity(), positionCmd, posCon().getOutput(), P, I, D); //PC.printf("WHILE LOOP\n"); //DEBUG if (PC.readable()) { //PC.printf("PC IS READABLE\n"); //DEBUG Key=PC.getc(); if(Key=='a' or Key =='A') { PC.printf("%s\n", BLA_object.Keyboard_A()); } else if(Key=='d' or Key =='D') { PC.printf("%s\n", BLA_object.Keyboard_D()); } else if(Key=='w' or Key =='W') { PC.printf("\nW received!\n"); posCon().writeSetPoint(positionCmd); //posCon().setPgain(P); //posCon().setIgain(I); //posCon().setDgain(D); hBridge().run(posCon().getOutput()); hBridge().reset(); count = 0; } else if(Key =='Q') //motor disabled { PC.printf("%s\n", BLA_object.Keyboard_Q()); } else if(Key =='E') //motor enabled { PC.printf("%s\n", BLA_object.Keyboard_E()); } else if(Key=='-' or Key =='_') { PC.printf("%s\n", BLA_object.Keyboard_DASH_KEY()); //decrease step size } else if(Key=='+' or Key=='=') { PC.printf("%s\n", BLA_object.Keyboard_EQUAL_KEY()); //increase step size } else if(Key==']') //100 to 30000, INCREASE (100 increments) { PC.printf("%s\n", BLA_object.Keyboard_RIGHT_BRACKET()); //motor speed } else if(Key=='[') //30000 to 100, DECREASE (100 increments) { PC.printf("%s\n", BLA_object.Keyboard_LEFT_BRACKET()); //motor speed } else if(Key=='!') //RESET THE MBED { PC.printf("MBED RESET KEY (!) PRESSED\n"); PC.printf("Linear Actuator Motor disabled! Please re-enable.\n"); //disable the motor BLA_object.Keyboard_Q(); //DISABLE THE MOTOR wait(0.5); //500 milliseconds mbed_reset(); //reset the mbed! } else if(Key =='H') //homing sequence { PC.printf("%s\n", BLA_object.Keyboard_H()); //home linear actuator manually } //check command against desired control buttons else if (Key == 'z' or Key =='Z') { //increment the duty cycle positionCmd += 10.0 ; PC.printf("The position for the buoyancy motor is\nBEP: %3.0f\n", positionCmd); //to read in MATLAB } else if (Key == 'x' or Key == 'X') { //decrement the duty cycle positionCmd -= 10.0 ; PC.printf("The position for the buoyancy motor is\nBEP: %3.0f\n", positionCmd); //to read in MATLAB } else { PC.printf("\n%c received!\n", Key); PC.printf("\nDoing nothing.\n"); } wait_us(100); //for PC readable } wait_us(100); //for PC readable (0.1 ms) if(BLA_object.MC_readable()) //if you can read the motor controller do this... { //PC.printf("BATTERY LINEAR ACTUATOR"); //PC.printf("Motor Controller response:\n"); // while(MC.readable()) // { // PC.putc(MC.getc()); //this is a pass-through of the MC (getc) to the PC (putc) // wait_ms(1); //1000, 10, 20, 100 (needed at least 1 ms, verified through testing) // } } if ((abs(pvf().getVelocity())<0.1) && (posCon().getOutput()>0.0)) { count ++; //pc().printf("We have a small issue\n"); if(count==10) { pc().printf("Bad pot issue\n"); hBridge().stop(); } } //string snaps else if (pvf().getVelocity() > 100) { //hBridge().stop(); pc().printf("********** String broke? *********\n"); } } }