Sami Kanderian / Mbed 2 deprecated TestAnalogInPins

Dependencies:   mbed

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?

UserRevisionLine numberNew 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 }