Robotcontrol groep 2
Dependencies: Encoder MODSERIAL mbed HIDScope
Diff: main.cpp
- Revision:
- 2:f3e8a27d376c
- Parent:
- 1:a010e434a360
- Child:
- 3:611fd72c9d46
diff -r a010e434a360 -r f3e8a27d376c main.cpp --- a/main.cpp Fri Oct 31 12:03:55 2014 +0000 +++ b/main.cpp Fri Oct 31 13:50:14 2014 +0000 @@ -11,10 +11,14 @@ // Outputs van de motor Encoder encoderA(PTD5,PTA13); +Encoder encoder1(PTD0,PTD2); + // Outputs naar de motor PwmOut pwm(PTC8); DigitalOut dir(PTC9); +PwmOut pwm1(PTA5); +DigitalOut dir1(PTA4); // Vaststellen van het datatype van de outputs naar de motor float s_speed1; @@ -85,7 +89,8 @@ int armstand=0; int armspeed=0; bool speeddone=0; - +int a; //wordt gebruikt in gotopos +float out1; //pid voor armpositie // Teller voor hoeveel metingen er zijn gedaan uint16_t teller=0; @@ -286,7 +291,6 @@ badjes=1; check=0; } - else { check=0; badjes = 2; @@ -307,18 +311,19 @@ check=1; } else if (y1>0) { if (speed>0) { - speed=speed-1; + speed+=1; } else { check=0; } } else if (y2>0 ) { if (speed<2) { - speed=speed+1; + speed-=1; } else { check=0; } } else { check=0; + } return speed; } @@ -349,9 +354,104 @@ } +void clamp(float * in, float min, float max) +{ +*in > min ? *in < max? : *in = max: *in = min; +} + +float pid1(float setpoint, float measurement) +{ + float error; + static float prev_error = 0; + float out_p = 0; + + float out_d = 0; + error = setpoint-measurement; + out_p = error*K_P; + out_i += error*K_I; + out_d = (error-prev_error)*K_D; + clamp(&out_i,-I_LIMIT,I_LIMIT); + prev_error = error; + out1 = out_i+out_p+out_d; + return out1; +} + +float getv(float delta_t) +{ + int n =0 ; + while(n<3) { + wait(delta_t); + enc = encoderA.getPosition(); + enca2 = enca1; + enca1 = enc; + n++; + + } + + counts = (enca1 - enca2)/delta_t; + v = (counts)*((2*3.14159265359)/1550); + return v; +} + + +float gotopos(float pos) +{ + switch(a) { + case 1: + pos = 100; + break; + + case 2: + pos = 200; + break; + + case 3: + pos = 250; + break; + } + enc = encoder1.getPosition(); + while((abs(pos-encoder1.getPosition()) >6)|| (v!= 0)) { + + while(!looptimerflag); + looptimerflag = false; + out1 = pid1(pos,encoder1.getPosition()); + + if(out>0) { + dir1 = 1; + + } else if(out<0) { + dir1 = 0; + } + pwm1 = fabs(out); + v = getv(0.001); + } + pwm1 =0; + + return pwm1; +} + +float reset() +{ + v = 1; + while(v !=0) { + + dir = 0; + speed = 0.1; + pwm = speed; + v =getv(0.1); + } + pwm = 0; + dir =1; + encoderA.setPosition(0); + zero = encoderA.getPosition(); + + return pwm; +} + // Main code int main() { + v = 1; rood = 0; blauw = 1; groen = 1; @@ -397,7 +497,7 @@ } else if (badjedone==1) { // Als de snelheid van de arm ook al klaar is, zorg ervoor dat de rest iet meer gebeurt if (speeddone==1) { - armspeed=armstand+1; + badjedone=0; speeddone=0; badjestand=1; @@ -405,6 +505,7 @@ // Anders, pas de hoek van de arm aan naar de stand die hoort bij de huidig geselecteerde snelheid } else { armstand=velocity(y1,y2); + gotopos(armstand); } } @@ -412,6 +513,8 @@ // Verzend data naar de scopes viewer(); + reset(); + }