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.
main.cpp@1:610dc7763656, 2015-07-23 (annotated)
- Committer:
- skanderian
- Date:
- Thu Jul 23 18:39:24 2015 +0000
- Revision:
- 1:610dc7763656
- Parent:
- 0:ce79b04fc2ca
- Child:
- 2:f2583b56777e
Working pump control but without serial interrupt
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
skanderian | 0:ce79b04fc2ca | 1 | #include "mbed.h" |
skanderian | 1:610dc7763656 | 2 | //#include "rtos.h" |
skanderian | 1:610dc7763656 | 3 | |
skanderian | 0:ce79b04fc2ca | 4 | //Declare hardware inputs |
skanderian | 0:ce79b04fc2ca | 5 | Timer timer; |
skanderian | 0:ce79b04fc2ca | 6 | AnalogIn potSet(A0); |
skanderian | 1:610dc7763656 | 7 | AnalogIn pressureDAQZO(A1); |
skanderian | 0:ce79b04fc2ca | 8 | PwmOut pumpStep(D8); |
skanderian | 0:ce79b04fc2ca | 9 | DigitalOut dir(D9); |
skanderian | 0:ce79b04fc2ca | 10 | DigitalOut visDir(LED2); |
skanderian | 0:ce79b04fc2ca | 11 | PwmOut r(LED_RED); |
skanderian | 0:ce79b04fc2ca | 12 | PwmOut g(LED_GREEN); |
skanderian | 0:ce79b04fc2ca | 13 | PwmOut b(LED_BLUE); |
skanderian | 0:ce79b04fc2ca | 14 | |
skanderian | 0:ce79b04fc2ca | 15 | //Declare globals |
skanderian | 1:610dc7763656 | 16 | char bufferIn[10]; |
skanderian | 1:610dc7763656 | 17 | char bufferOut[8]; |
skanderian | 1:610dc7763656 | 18 | char hexCCIn[2]; |
skanderian | 1:610dc7763656 | 19 | char hexDDDDIn[4]; |
skanderian | 1:610dc7763656 | 20 | int decCCIn; |
skanderian | 1:610dc7763656 | 21 | int decDDDDIn; |
skanderian | 1:610dc7763656 | 22 | |
skanderian | 1:610dc7763656 | 23 | unsigned long lastTime; //start it at 0, so at least one run of computePressureCommand is guaranteed |
skanderian | 1:610dc7763656 | 24 | float outputCmd, iTerm; |
skanderian | 1:610dc7763656 | 25 | float kp=2/9.9; |
skanderian | 0:ce79b04fc2ca | 26 | float ki=0; |
skanderian | 1:610dc7763656 | 27 | float setPoint=0.000f; |
skanderian | 0:ce79b04fc2ca | 28 | int sampleTime = 250; //1/4 sec |
skanderian | 0:ce79b04fc2ca | 29 | float outMin=-1.0; |
skanderian | 0:ce79b04fc2ca | 30 | float outMax=1.0; |
skanderian | 1:610dc7763656 | 31 | float smallChange=0.01*9.9/5; |
skanderian | 0:ce79b04fc2ca | 32 | float oldOutputCmd; //dont need |
skanderian | 0:ce79b04fc2ca | 33 | bool runPump=false; |
skanderian | 0:ce79b04fc2ca | 34 | |
skanderian | 0:ce79b04fc2ca | 35 | //------------------------------------ |
skanderian | 0:ce79b04fc2ca | 36 | // Hyperterminal configuration 9600 bauds, 8N |
skanderian | 0:ce79b04fc2ca | 37 | //------------------------------------ |
skanderian | 0:ce79b04fc2ca | 38 | Serial pc(USBTX, USBRX); |
skanderian | 0:ce79b04fc2ca | 39 | |
skanderian | 0:ce79b04fc2ca | 40 | void ledConfirmReceive() |
skanderian | 0:ce79b04fc2ca | 41 | { |
skanderian | 0:ce79b04fc2ca | 42 | r=1; |
skanderian | 0:ce79b04fc2ca | 43 | g=1; |
skanderian | 0:ce79b04fc2ca | 44 | b=0.9; |
skanderian | 0:ce79b04fc2ca | 45 | } |
skanderian | 0:ce79b04fc2ca | 46 | |
skanderian | 0:ce79b04fc2ca | 47 | void ledConfirmSent() |
skanderian | 0:ce79b04fc2ca | 48 | { |
skanderian | 0:ce79b04fc2ca | 49 | r=1; |
skanderian | 0:ce79b04fc2ca | 50 | g=0.9; |
skanderian | 0:ce79b04fc2ca | 51 | b=1; |
skanderian | 0:ce79b04fc2ca | 52 | } |
skanderian | 0:ce79b04fc2ca | 53 | |
skanderian | 1:610dc7763656 | 54 | |
skanderian | 0:ce79b04fc2ca | 55 | int hexToDec(char hex[]) |
skanderian | 0:ce79b04fc2ca | 56 | { |
skanderian | 0:ce79b04fc2ca | 57 | int decValue = strtol(hex, NULL, 16); |
skanderian | 1:610dc7763656 | 58 | |
skanderian | 0:ce79b04fc2ca | 59 | return decValue; |
skanderian | 0:ce79b04fc2ca | 60 | |
skanderian | 0:ce79b04fc2ca | 61 | } |
skanderian | 0:ce79b04fc2ca | 62 | |
skanderian | 0:ce79b04fc2ca | 63 | int hexToDecSub(char hex[], int st, int ed) |
skanderian | 0:ce79b04fc2ca | 64 | { |
skanderian | 0:ce79b04fc2ca | 65 | int n=ed-st+1; |
skanderian | 0:ce79b04fc2ca | 66 | char hexSubset[n]; |
skanderian | 0:ce79b04fc2ca | 67 | for(int i=st; i<ed+1; i++) { |
skanderian | 0:ce79b04fc2ca | 68 | hexSubset[i-st]=hex[i]; |
skanderian | 0:ce79b04fc2ca | 69 | } |
skanderian | 0:ce79b04fc2ca | 70 | |
skanderian | 0:ce79b04fc2ca | 71 | int decValue = strtol(hexSubset, NULL, 16); |
skanderian | 0:ce79b04fc2ca | 72 | return decValue; |
skanderian | 0:ce79b04fc2ca | 73 | |
skanderian | 0:ce79b04fc2ca | 74 | } |
skanderian | 0:ce79b04fc2ca | 75 | |
skanderian | 0:ce79b04fc2ca | 76 | void computePressureCommand() |
skanderian | 0:ce79b04fc2ca | 77 | { |
skanderian | 1:610dc7763656 | 78 | unsigned int now = timer.read_ms(); |
skanderian | 0:ce79b04fc2ca | 79 | int nSamplesToAverage=10; |
skanderian | 0:ce79b04fc2ca | 80 | int timeChange = (now - lastTime); |
skanderian | 0:ce79b04fc2ca | 81 | if(timeChange>=sampleTime) { |
skanderian | 1:610dc7763656 | 82 | |
skanderian | 1:610dc7763656 | 83 | float avePressureDAQZO=0; |
skanderian | 1:610dc7763656 | 84 | for (int i=0; i<nSamplesToAverage; i++) { |
skanderian | 1:610dc7763656 | 85 | avePressureDAQZO = avePressureDAQZO+pressureDAQZO; |
skanderian | 0:ce79b04fc2ca | 86 | } |
skanderian | 1:610dc7763656 | 87 | avePressureDAQZO=avePressureDAQZO/(double)(nSamplesToAverage); |
skanderian | 0:ce79b04fc2ca | 88 | //setPoint = potSet; |
skanderian | 1:610dc7763656 | 89 | float inputPressure=avePressureDAQZO*9.9; |
skanderian | 1:610dc7763656 | 90 | |
skanderian | 1:610dc7763656 | 91 | float error = setPoint - inputPressure; |
skanderian | 1:610dc7763656 | 92 | |
skanderian | 0:ce79b04fc2ca | 93 | iTerm+= (ki * error); |
skanderian | 0:ce79b04fc2ca | 94 | if(iTerm > outMax) iTerm= outMax; |
skanderian | 0:ce79b04fc2ca | 95 | else if(iTerm < outMin) iTerm= outMin; |
skanderian | 1:610dc7763656 | 96 | |
skanderian | 0:ce79b04fc2ca | 97 | outputCmd = kp * error + iTerm; |
skanderian | 0:ce79b04fc2ca | 98 | if(outputCmd > outMax) outputCmd = outMax; |
skanderian | 0:ce79b04fc2ca | 99 | else if(outputCmd < outMin) outputCmd = outMin; |
skanderian | 1:610dc7763656 | 100 | |
skanderian | 0:ce79b04fc2ca | 101 | visDir=0; |
skanderian | 0:ce79b04fc2ca | 102 | if (outputCmd < 0) { |
skanderian | 0:ce79b04fc2ca | 103 | dir=1; |
skanderian | 0:ce79b04fc2ca | 104 | visDir=1; |
skanderian | 0:ce79b04fc2ca | 105 | outputCmd = outputCmd * -1.0; |
skanderian | 1:610dc7763656 | 106 | } else dir=0; |
skanderian | 1:610dc7763656 | 107 | |
skanderian | 0:ce79b04fc2ca | 108 | if (abs(error) > smallChange) { |
skanderian | 0:ce79b04fc2ca | 109 | pumpStep.write(0.50f); // turn back on |
skanderian | 1:610dc7763656 | 110 | pumpStep.period_us((1.0/outputCmd)*200); |
skanderian | 1:610dc7763656 | 111 | } else pumpStep.write(0.0f); //shut off steps for too small change |
skanderian | 1:610dc7763656 | 112 | |
skanderian | 1:610dc7763656 | 113 | |
skanderian | 1:610dc7763656 | 114 | char signSetPoint='+'; |
skanderian | 1:610dc7763656 | 115 | if(setPoint<0) { |
skanderian | 1:610dc7763656 | 116 | signSetPoint='-'; |
skanderian | 0:ce79b04fc2ca | 117 | } |
skanderian | 1:610dc7763656 | 118 | char signinputVoltage='+'; |
skanderian | 1:610dc7763656 | 119 | if(setPoint<0) { |
skanderian | 1:610dc7763656 | 120 | signinputVoltage='-'; |
skanderian | 1:610dc7763656 | 121 | } |
skanderian | 1:610dc7763656 | 122 | |
skanderian | 1:610dc7763656 | 123 | |
skanderian | 1:610dc7763656 | 124 | pc.printf("%s%c%2.3f%s%c%2.3f%s","#SP",signSetPoint,abs(setPoint),"MP",signinputVoltage,abs(inputPressure),"SS^"); |
skanderian | 1:610dc7763656 | 125 | //printf("%f, %f, %f, %f, %f, %f \n\r ",setPoint, inputVoltage, outputCmd, kp*error, iTerm, (-0.5-dir.read())); |
skanderian | 1:610dc7763656 | 126 | ledConfirmSent(); |
skanderian | 0:ce79b04fc2ca | 127 | oldOutputCmd=outputCmd; //don't need |
skanderian | 0:ce79b04fc2ca | 128 | lastTime = now; /*Remember time for next time*/ |
skanderian | 1:610dc7763656 | 129 | }//end if timeChange |
skanderian | 1:610dc7763656 | 130 | |
skanderian | 0:ce79b04fc2ca | 131 | }//end computePressureVoltage |
skanderian | 0:ce79b04fc2ca | 132 | |
skanderian | 0:ce79b04fc2ca | 133 | |
skanderian | 1:610dc7763656 | 134 | void runWhenNewSerialIn() |
skanderian | 1:610dc7763656 | 135 | { |
skanderian | 1:610dc7763656 | 136 | |
skanderian | 1:610dc7763656 | 137 | |
skanderian | 1:610dc7763656 | 138 | |
skanderian | 1:610dc7763656 | 139 | bufferOut[0]=bufferIn[0]; |
skanderian | 1:610dc7763656 | 140 | |
skanderian | 1:610dc7763656 | 141 | for(int i=0; i<7; i++) { // duplicate bytes 0 to 9 for now; |
skanderian | 1:610dc7763656 | 142 | bufferOut[i]=bufferIn[i]; |
skanderian | 1:610dc7763656 | 143 | } |
skanderian | 1:610dc7763656 | 144 | bufferOut[7]='^';//IMPORTANT! |
skanderian | 1:610dc7763656 | 145 | |
skanderian | 1:610dc7763656 | 146 | |
skanderian | 1:610dc7763656 | 147 | //get hexCCIn |
skanderian | 1:610dc7763656 | 148 | for(int i=0; i<2; i++) { |
skanderian | 1:610dc7763656 | 149 | hexCCIn[i]=bufferIn[i+1]; |
skanderian | 1:610dc7763656 | 150 | } |
skanderian | 1:610dc7763656 | 151 | //pc.printf("hexCCIn= is %s\r\n", hexCCIn); |
skanderian | 1:610dc7763656 | 152 | |
skanderian | 1:610dc7763656 | 153 | for(int i=0; i<4; i++) { |
skanderian | 1:610dc7763656 | 154 | hexDDDDIn[i]=bufferIn[i+3]; |
skanderian | 1:610dc7763656 | 155 | } |
skanderian | 1:610dc7763656 | 156 | |
skanderian | 1:610dc7763656 | 157 | //pc.printf("hello test= is %s\r\n", test); |
skanderian | 1:610dc7763656 | 158 | |
skanderian | 1:610dc7763656 | 159 | //int value = strtol(hexDDDDIn, NULL, 16); |
skanderian | 1:610dc7763656 | 160 | decCCIn = hexToDec(hexCCIn); |
skanderian | 1:610dc7763656 | 161 | decDDDDIn = hexToDec(hexDDDDIn); |
skanderian | 1:610dc7763656 | 162 | //int decDDDDIn = hexToDec("0000"); |
skanderian | 1:610dc7763656 | 163 | |
skanderian | 1:610dc7763656 | 164 | //Make sure incoming checksum pans out: |
skanderian | 1:610dc7763656 | 165 | |
skanderian | 1:610dc7763656 | 166 | //Do action based on CC |
skanderian | 1:610dc7763656 | 167 | |
skanderian | 1:610dc7763656 | 168 | //pc.printf("hexCCIn= is %c%c\r\n", hexCCIn[0],hexCCIn[1]); |
skanderian | 1:610dc7763656 | 169 | //pc.printf("hexDDDDIn= is %c%c%c%c\r\n", hexDDDDIn[0],hexDDDDIn[1],hexDDDDIn[2],hexDDDDIn[3]); |
skanderian | 1:610dc7763656 | 170 | //pc.printf("decCCIn= is %d\r\n", decCCIn); |
skanderian | 1:610dc7763656 | 171 | //pc.printf("decDDDDIn= is %d\r\n", decDDDDIn); |
skanderian | 1:610dc7763656 | 172 | if (decCCIn==1) { //control built in LED |
skanderian | 1:610dc7763656 | 173 | //PwmOut led(LED_RED); //set to red just for now, change later if nec. |
skanderian | 1:610dc7763656 | 174 | //Get desired intensity |
skanderian | 1:610dc7763656 | 175 | double ledIntensity=(double)(hexToDecSub(bufferIn, 4, 5)); |
skanderian | 1:610dc7763656 | 176 | if (bufferIn[3]=='0') { //red |
skanderian | 1:610dc7763656 | 177 | //PwmOut r(LED_RED); |
skanderian | 1:610dc7763656 | 178 | r=(255-ledIntensity)/255; |
skanderian | 1:610dc7763656 | 179 | } else if(bufferIn[3]=='1') { |
skanderian | 1:610dc7763656 | 180 | //PwmOut g(LED_GREEN); |
skanderian | 1:610dc7763656 | 181 | g=(255-ledIntensity)/255; |
skanderian | 1:610dc7763656 | 182 | } else if (bufferIn[3]=='2') { |
skanderian | 1:610dc7763656 | 183 | //PwmOut led(LED_BLUE); |
skanderian | 1:610dc7763656 | 184 | b=(255-ledIntensity)/255; |
skanderian | 1:610dc7763656 | 185 | } |
skanderian | 1:610dc7763656 | 186 | |
skanderian | 1:610dc7763656 | 187 | pc.printf("%s", bufferOut); |
skanderian | 1:610dc7763656 | 188 | |
skanderian | 1:610dc7763656 | 189 | } else if(decCCIn==27) { //CC=1b, Enable pump |
skanderian | 1:610dc7763656 | 190 | pumpStep.write(0.50f); // set fixed duty cycle to 50% (hold position?) |
skanderian | 1:610dc7763656 | 191 | ledConfirmSent(); |
skanderian | 1:610dc7763656 | 192 | runPump=true; |
skanderian | 1:610dc7763656 | 193 | //pc.printf("%s\n", bufferOut); //No output SP & MP instead via computePressureCommand |
skanderian | 1:610dc7763656 | 194 | ledConfirmSent(); |
skanderian | 1:610dc7763656 | 195 | |
skanderian | 1:610dc7763656 | 196 | } else if(decCCIn==28) { //CC=1c, Define new pressure setPoint |
skanderian | 1:610dc7763656 | 197 | setPoint=((double)(decDDDDIn))/100; //converted fron hex above |
skanderian | 1:610dc7763656 | 198 | |
skanderian | 1:610dc7763656 | 199 | } else if (decCCIn==29) {//CC=1d, Deactivate pump |
skanderian | 1:610dc7763656 | 200 | pumpStep.write(0.0f); |
skanderian | 1:610dc7763656 | 201 | ledConfirmSent(); |
skanderian | 1:610dc7763656 | 202 | runPump=false; |
skanderian | 1:610dc7763656 | 203 | pc.printf("%s", bufferOut); |
skanderian | 1:610dc7763656 | 204 | ledConfirmSent(); |
skanderian | 1:610dc7763656 | 205 | } |
skanderian | 1:610dc7763656 | 206 | } |
skanderian | 0:ce79b04fc2ca | 207 | |
skanderian | 0:ce79b04fc2ca | 208 | int main() |
skanderian | 0:ce79b04fc2ca | 209 | { |
skanderian | 0:ce79b04fc2ca | 210 | r.period(0.001f); |
skanderian | 0:ce79b04fc2ca | 211 | g.period(0.001f); |
skanderian | 0:ce79b04fc2ca | 212 | b.period(0.001f); |
skanderian | 0:ce79b04fc2ca | 213 | |
skanderian | 0:ce79b04fc2ca | 214 | r=1; |
skanderian | 0:ce79b04fc2ca | 215 | g=1; |
skanderian | 0:ce79b04fc2ca | 216 | b=1; |
skanderian | 1:610dc7763656 | 217 | |
skanderian | 1:610dc7763656 | 218 | //pc.printf("\r\n"); //Important |
skanderian | 1:610dc7763656 | 219 | timer.start(); |
skanderian | 0:ce79b04fc2ca | 220 | |
skanderian | 0:ce79b04fc2ca | 221 | |
skanderian | 0:ce79b04fc2ca | 222 | while(1) { |
skanderian | 0:ce79b04fc2ca | 223 | |
skanderian | 0:ce79b04fc2ca | 224 | scanf("%10s", bufferIn); |
skanderian | 0:ce79b04fc2ca | 225 | //Turn built in LED blue (at half intensity) to confirm command recieved |
skanderian | 0:ce79b04fc2ca | 226 | ledConfirmReceive(); |
skanderian | 1:610dc7763656 | 227 | runWhenNewSerialIn(); |
skanderian | 0:ce79b04fc2ca | 228 | |
skanderian | 0:ce79b04fc2ca | 229 | //Always keep running computePressureCommand if requred |
skanderian | 1:610dc7763656 | 230 | if(runPump) { |
skanderian | 1:610dc7763656 | 231 | computePressureCommand(); |
skanderian | 1:610dc7763656 | 232 | } |
skanderian | 0:ce79b04fc2ca | 233 | //pc.printf("NEW value of '%s' is %ld\n", hexDDDDIn, decDDDDIn); |
skanderian | 0:ce79b04fc2ca | 234 | //Turn built in LED green (at half intensity) to confirm reponse sent back |
skanderian | 1:610dc7763656 | 235 | |
skanderian | 0:ce79b04fc2ca | 236 | } |
skanderian | 0:ce79b04fc2ca | 237 | } |