Sami Kanderian / Mbed 2 deprecated TestAnalogInPins

Dependencies:   mbed

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?

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