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
- Committer:
- skanderian
- Date:
- 2015-07-16
- Revision:
- 0:ce79b04fc2ca
- Child:
- 1:610dc7763656
File content as of revision 0:ce79b04fc2ca:
#include "mbed.h" //Declare hardware inputs Timer timer; AnalogIn potSet(A0); AnalogIn pressure(A1); PwmOut pumpStep(D8); DigitalOut dir(D9); DigitalOut visDir(LED2); PwmOut r(LED_RED); PwmOut g(LED_GREEN); PwmOut b(LED_BLUE); //Declare globals unsigned long lastTime; float inputTemperature, outputCmd, iTerm; float kp=2; float ki=0; float setPoint; int sampleTime = 250; //1/4 sec float outMin=-1.0; float outMax=1.0; float smallChange=0.01; float oldOutputCmd; //dont need bool runPump=false; //------------------------------------ // Hyperterminal configuration 9600 bauds, 8N //------------------------------------ Serial pc(USBTX, USBRX); void ledConfirmReceive() { r=1; g=1; b=0.9; } void ledConfirmSent() { r=1; g=0.9; b=1; } int hexToDec(char hex[]) { int decValue = strtol(hex, NULL, 16); return decValue; } int hexToDecSub(char hex[], int st, int ed) { int n=ed-st+1; char hexSubset[n]; for(int i=st; i<ed+1; i++) { hexSubset[i-st]=hex[i]; } int decValue = strtol(hexSubset, NULL, 16); return decValue; } void computePressureCommand() { int i; unsigned int now = timer.read_ms(); int nSamplesToAverage=10; int timeChange = (now - lastTime); if(timeChange>=sampleTime) { inputTemperature=0; for (i=0; i<nSamplesToAverage; i++) { inputTemperature = inputTemperature+pressure; } inputTemperature=inputTemperature/(double)(nSamplesToAverage); //setPoint = potSet; float error = setPoint - inputTemperature; iTerm+= (ki * error); if(iTerm > outMax) iTerm= outMax; else if(iTerm < outMin) iTerm= outMin; outputCmd = kp * error + iTerm; if(outputCmd > outMax) outputCmd = outMax; else if(outputCmd < outMin) outputCmd = outMin; visDir=0; if (outputCmd < 0) { dir=1; visDir=1; outputCmd = outputCmd * -1.0; } else dir=0; if (abs(error) > smallChange) { pumpStep.write(0.50f); // turn back on pumpStep.period_us((1.0/outputCmd)*200); } else pumpStep.write(0.0f); //shut off steps for too small change printf("%f, %f \n\r ",setPoint, inputTemperature); //printf("%f, %f, %f, %f, %f, %f \n\r ",setPoint, inputTemperature, outputCmd, kp*error, iTerm, (-0.5-dir.read())); oldOutputCmd=outputCmd; //don't need lastTime = now; /*Remember time for next time*/ }//end if timeChange }//end computePressureVoltage int main() { //int testInt=0; char bufferIn[10]; char bufferOut[8]; char hexCCIn[2]; char hexDDDDIn[4]; r.period(0.001f); g.period(0.001f); b.period(0.001f); r=1; g=1; b=1; timer.start(); while(1) { scanf("%10s", bufferIn); //pc.printf("bufferIn= is %s\r\n", bufferIn); //pc.printf("bufferIn= is %c%c\r\n", bufferIn[0],bufferIn[1]); //Turn built in LED blue (at half intensity) to confirm command recieved ledConfirmReceive(); bufferOut[0]=bufferIn[0]; for(int i=0; i<7; i++) { // duplicate bytes 0 to 9 for now; bufferOut[i]=bufferIn[i]; } bufferOut[7]='^'; //get hexCCIn for(int i=0; i<2; i++) { hexCCIn[i]=bufferIn[i+1]; } //pc.printf("hexCCIn= is %s\r\n", hexCCIn); for(int i=0; i<4; i++) { hexDDDDIn[i]=bufferIn[i+3]; } //pc.printf("hello test= is %s\r\n", test); //int value = strtol(hexDDDDIn, NULL, 16); int decCCIn = hexToDec(hexCCIn); int decDDDDIn = hexToDec(hexDDDDIn); //int decDDDDIn = hexToDec("0000"); //Make sure incoming checksum pans out: //Do action based on CC //pc.printf("hexCCIn= is %c%c\r\n", hexCCIn[0],hexCCIn[1]); pc.printf("hexDDDDIn= is %c%c%c%c\r\n", hexDDDDIn[0],hexDDDDIn[1],hexDDDDIn[2],hexDDDDIn[3]); //pc.printf("decCCIn= is %d\r\n", decCCIn); pc.printf("decDDDDIn= is %d\r\n", decDDDDIn); if (decCCIn==1) { //control built in LED //PwmOut led(LED_RED); //set to red just for now, change later if nec. //Get desired intensity double ledIntensity=(double)(hexToDecSub(bufferIn, 4, 5)); if (bufferIn[3]=='0') { //red //PwmOut r(LED_RED); r=(255-ledIntensity)/255; } else if(bufferIn[3]=='1') { //PwmOut g(LED_GREEN); g=(255-ledIntensity)/255; } else if (bufferIn[3]=='2') { //PwmOut led(LED_BLUE); b=(255-ledIntensity)/255; } //led.period(0.001f); //led=(255-ledIntensity)/255; //led=1.000; //end built in LED control //pc.printf("%s\n", bufferOut); }else if(decCCIn==27) { //CC=1b, Enable pump pumpStep.write(0.50f); // set fixed duty cycle to 50% (hold position?) ledConfirmSent(); runPump=true; }else if(decCCIn==28) { //CC=1c, Define new pressure setPoint setPoint=((double)(decDDDDIn))/100; //converted fron hex above } else if (decCCIn==29) {//CC=1d, Deactivate pump pumpStep.write(0.0f); ledConfirmSent(); runPump=false; } //Always keep running computePressureCommand if requred computePressureCommand(); //pc.printf("NEW value of '%s' is %ld\n", hexDDDDIn, decDDDDIn); //Turn built in LED green (at half intensity) to confirm reponse sent back } }