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