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.
Fork of TestAnalogInPins by
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 | } |
