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.
Diff: main.cpp
- Revision:
- 19:a71ef54d9e94
- Parent:
- 18:5e9b288793bb
- Child:
- 21:26a459e4201c
--- a/main.cpp Thu Nov 04 09:17:40 2021 +0000 +++ b/main.cpp Thu Nov 04 11:29:12 2021 +0000 @@ -172,6 +172,7 @@ double Ax, Ay, Az, Mag; static double MagFil, lastAx, lastAy, lastAz; static double lastErrorDot; + bool isTestComplete = 0; while(1){ semMotorControl.wait();//wait for a signal @@ -206,39 +207,59 @@ //int deltaT = encoderTimer.read();//read current time in seconds if(state == STATE_RUNNING){//need to check if this is the best condition to look for. - //calculate current demand - if ( (SPIN_T[0] <= Tnow) && (Tnow < SPIN_T[1]) ) {//test is in warmup + + } + + switch(state){ + case STATE_RUNNING: + //calculate current demand + if ( (SPIN_T[0] <= Tnow) && (Tnow < SPIN_T[1]) ) {//test is in warmup + demandSpeed_RPM = 0.0; + isTestComplete = 0; + //printf("warm up %f\r\n", demandSpeed_RPM); + //deactivate motor? + } + if ((SPIN_T[1] <= Tnow)&&(Tnow < SPIN_T[2])){//test is in ramp up + + double a = Tnow - SPIN_T[1]; + demandSpeed_RPM = a * targetSpeed_RPM / T_RAMP; + isTestComplete = 0; + //printf("ramp up %f\r\n", demandSpeed_RPM); + } + if ((SPIN_T[2] <= Tnow)&&(Tnow < SPIN_T[3])){//test is in coast + demandSpeed_RPM = targetSpeed_RPM; + isTestComplete = 0; + //printf("coast %f\r\n", demandSpeed_RPM); + } + if ((SPIN_T[3] <= Tnow)&&(Tnow < SPIN_T[4])){//test is in ramp down + double a = Tnow - SPIN_T[3]; + demandSpeed_RPM = targetSpeed_RPM - (a/T_RAMP*targetSpeed_RPM); + isTestComplete = 0; + //printf("ramp down %f\r\n", demandSpeed_RPM); + } + if ((SPIN_T[4] <= Tnow)&&(Tnow < SPIN_T[5])){//test is in cooldown + demandSpeed_RPM = 0.0; + isTestComplete = 1; + //printf("cool down %f\r\n", demandSpeed_RPM); + //deactivate motor? + } + break; + case STATE_ERROR: + demandSpeed_RPM -=66.7*SAMPLE_TIME_US/1000000; + if(demandSpeed_RPM < 0.0){ + isTestComplete = 1; + } else { + isTestComplete = 0; + } + break; + case STATE_READY: demandSpeed_RPM = 0.0; - //printf("warm up %f\r\n", demandSpeed_RPM); - //deactivate motor? - } - if ((SPIN_T[1] <= Tnow)&&(Tnow < SPIN_T[2])){//test is in ramp up - - double a = Tnow - SPIN_T[1]; - demandSpeed_RPM = a * targetSpeed_RPM / T_RAMP; - //printf("ramp up %f\r\n", demandSpeed_RPM); - } - if ((SPIN_T[2] <= Tnow)&&(Tnow < SPIN_T[3])){//test is in coast - demandSpeed_RPM = targetSpeed_RPM; - //printf("coast %f\r\n", demandSpeed_RPM); - } - if ((SPIN_T[3] <= Tnow)&&(Tnow < SPIN_T[4])){//test is in ramp down - double a = Tnow - SPIN_T[3]; - demandSpeed_RPM = targetSpeed_RPM - (a/T_RAMP*targetSpeed_RPM); - //printf("ramp down %f\r\n", demandSpeed_RPM); - } - if ((SPIN_T[4] <= Tnow)&&(Tnow < SPIN_T[5])){//test is in cooldown + break; + default: demandSpeed_RPM = 0.0; - //printf("cool down %f\r\n", demandSpeed_RPM); - //deactivate motor? - } - } - - if(state == STATE_ERROR){ - demandSpeed_RPM -=66.7*SAMPLE_TIME_US/1000000; + break; } - demandSpeed_RPM = LimitDouble(demandSpeed_RPM,0.0,MAX_SPEED_RPM);//limit demand currentPulses = encoder.getPulses();//calculate current speed double deltaPulses = currentPulses - lastPulses; @@ -267,15 +288,7 @@ PHA.write(1); output = -1*output; } - -// if(demandSpeed_RPM = 0.0){ -// output = 0.0; -// } - -// if(state == STATE_ERROR){ -// output = 0; -// } - + PWMA.write(output);//write to motor lastPulses = currentPulses;//update lastError = error; @@ -283,9 +296,14 @@ lastErrorDot = errorDot; //exit when test has completed - if (Tnow >= SPIN_T[5]){ + if(isTestComplete){ //printf("Terminating Test %f \t %f\r\n", Tnow, SPIN_T[5]); - state = STATE_READY;//change state + if(state = STATE_ERROR){ + state = STATE_ERROR;//change state + } + else { + state = STATE_READY; + } testTimer.stop(); //stop and reset timers testTimer.reset(); Tnow = testTimer.read();