g

Dependencies:   MODSERIAL mbed Encoder

Committer:
gerjan
Date:
Tue Nov 05 08:42:42 2013 +0000
Revision:
3:a3e4580af271
Parent:
2:103de31c8803
Child:
4:c79922420b70
wat maandag avond werkte;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Esther 0:e9e50c0a6502 1 #include "mbed.h"
Esther 0:e9e50c0a6502 2 #include "MODSERIAL.h"
Esther 1:8a0a39740897 3 #include "encoder.h"
Esther 1:8a0a39740897 4
Esther 1:8a0a39740897 5 volatile bool looptimerflag;
Esther 1:8a0a39740897 6
Esther 1:8a0a39740897 7 void setlooptimerflag(void)
Esther 1:8a0a39740897 8 {
Esther 1:8a0a39740897 9 looptimerflag=true;
Esther 1:8a0a39740897 10 }
Esther 0:e9e50c0a6502 11
Esther 0:e9e50c0a6502 12
Esther 0:e9e50c0a6502 13 int main()
Esther 0:e9e50c0a6502 14 {
Esther 1:8a0a39740897 15 //Communicatie met de pc
Esther 0:e9e50c0a6502 16 MODSERIAL pc(USBTX,USBRX,64,1024);
Esther 0:e9e50c0a6502 17 pc.baud(115200);
Esther 0:e9e50c0a6502 18
Esther 1:8a0a39740897 19 //Benoemen inputs
Esther 0:e9e50c0a6502 20 DigitalIn knop1(PTC2);
Esther 0:e9e50c0a6502 21 DigitalIn knop2(PTB3);
Esther 0:e9e50c0a6502 22 DigitalIn knop3(PTB2);
Esther 0:e9e50c0a6502 23
Esther 1:8a0a39740897 24 AnalogIn emg1(PTB0); //Analog input emg1
Esther 1:8a0a39740897 25 AnalogIn emg2(PTB1); //Analog input emg2
Esther 1:8a0a39740897 26
Esther 1:8a0a39740897 27 Encoder motor1(PTD0,PTC9);
Esther 1:8a0a39740897 28 Encoder motor2(PTD2,PTC8);
Esther 1:8a0a39740897 29
Esther 1:8a0a39740897 30 /* PWM control to motor */
Esther 1:8a0a39740897 31 PwmOut pwm_motor1(PTA12);
Esther 1:8a0a39740897 32 PwmOut pwm_motor2(PTA5);
Esther 1:8a0a39740897 33 /* Direction pin */
Esther 1:8a0a39740897 34 DigitalOut motor1dir(PTD3);
Esther 1:8a0a39740897 35 DigitalOut motor2dir(PTD1);
Esther 1:8a0a39740897 36
Esther 0:e9e50c0a6502 37 knop1.mode(PullUp);
Esther 0:e9e50c0a6502 38 knop2.mode(PullUp);
Esther 0:e9e50c0a6502 39 knop3.mode(PullUp);
Esther 0:e9e50c0a6502 40
Esther 1:8a0a39740897 41 //Variabelen voor menu
Esther 0:e9e50c0a6502 42 int state = 1;
Esther 0:e9e50c0a6502 43
Esther 1:8a0a39740897 44 bool calibratie_rust = false;
Esther 1:8a0a39740897 45 bool calibratie_max = false;
Esther 1:8a0a39740897 46 bool calibratie_motor = false;
Esther 1:8a0a39740897 47 bool meting = false;
Esther 1:8a0a39740897 48
Esther 1:8a0a39740897 49 //Variabelen EMG/motoren
Esther 1:8a0a39740897 50 double yy,z,zabs,w,y1,z1,zabs1,w1,y2,z2,zabs2,w2,e1,e2,e3,f1,f2,g1,g2,g3,h1,h2,byy,bz,bzabs,bw,by1,bz1,bzabs1,bw1,by2,bz2,bzabs2,bw2,be1,be2,be3,bf1,bf2,bg1,bg2,bg3,bh1,bh2;
Esther 1:8a0a39740897 51 double MaxsnelheidV,MaxsnelheidD,GrenswaardeD,GrenswaardeV,MaxwaardeD,MaxwaardeV,BereikD,BereikV,SnelheidV,SnelheidD,xbegin,ybegin,qbegin,x,y,q,deltas,deltaq,deltax,deltay;
gerjan 3:a3e4580af271 52
Esther 2:103de31c8803 53 // Variabelen benoemen voor regelaar motor.
Esther 2:103de31c8803 54 double theta, theta_pen, up_theta, kp_theta, kd_theta, dtheta, ei_theta, ui_theta, ki_theta, ed_theta, u_theta, ud_theta, theta_pwm,pi;
Esther 2:103de31c8803 55 double r, r_pen, up_r, kp_r, kd_r, dr, ei_r, ui_r, ki_r, ed_r, u_r, ud_r, r_pwm, dri, dri_1, utot_r, inputsinus;
Esther 2:103de31c8803 56 double motor1_maxu, motor2_maxu;
gerjan 3:a3e4580af271 57
Esther 2:103de31c8803 58
Esther 1:8a0a39740897 59 pi=3.14159265359;
Esther 1:8a0a39740897 60
Esther 1:8a0a39740897 61 e1= 0.855930601814815;
Esther 1:8a0a39740897 62 e2= -1.711861203629630;
Esther 1:8a0a39740897 63 e3= 0.855930601814815;
Esther 1:8a0a39740897 64 f1=-1.690996376887443;
Esther 1:8a0a39740897 65 f2= 0.732726030371816;
Esther 1:8a0a39740897 66
Esther 1:8a0a39740897 67 g1= 0.098259168204717*pow(10.0,-4.0);
Esther 1:8a0a39740897 68 g2= 0.196518336409435*pow(10.0,-4.0);
Esther 1:8a0a39740897 69 g3=0.098259168204717*pow(10.0,-4.0);
Esther 1:8a0a39740897 70 h1= -1.991114292201654;
Esther 1:8a0a39740897 71 h2=0.991153595868935;
Esther 1:8a0a39740897 72
Esther 1:8a0a39740897 73 be1=0.914969144113083;
Esther 1:8a0a39740897 74 be2= -1.829938288226165;
Esther 1:8a0a39740897 75 be3= 0.914969144113083;
Esther 1:8a0a39740897 76 bf1=-1.822694925196308;
Esther 1:8a0a39740897 77 bf2=0.837181651256022;
Esther 1:8a0a39740897 78
Esther 1:8a0a39740897 79 bg1= 0.246193004641015*pow(10.0,-5.0);
Esther 1:8a0a39740897 80 bg2= 0.492386009282031 *pow(10.0,-5.0);
Esther 1:8a0a39740897 81 bg3= 0.246193004641015*pow(10.0,-5.0);
Esther 1:8a0a39740897 82 bh1= -1.995557124345789;
Esther 1:8a0a39740897 83 bh2= 0.995566972065975;
Esther 1:8a0a39740897 84
Esther 1:8a0a39740897 85
Esther 1:8a0a39740897 86 y1 = 0; /*Initialize y(n-1) = 0*/
Esther 1:8a0a39740897 87 y2 = 0; /*Initialize y(n-2) = 0*/
Esther 1:8a0a39740897 88 z1 = 0; /*Initialize z(n-1) = 0*/
Esther 1:8a0a39740897 89 z2 = 0; /*Initialize z(n-2) = 0*/
Esther 1:8a0a39740897 90 zabs1 = 0; /*Initialize zabs(n-1) = 0*/
Esther 1:8a0a39740897 91 zabs2 = 0; /*Initialize zabs(n-2) = 0*/
Esther 1:8a0a39740897 92 w1 = 0; /*Initialize w(n-1) = 0*/
Esther 1:8a0a39740897 93 w2 = 0; /*Initialize w(n-2) = 0*/
Esther 0:e9e50c0a6502 94
Esther 1:8a0a39740897 95 by1 = 0; /*Initialize by(n-1) = 0*/
Esther 1:8a0a39740897 96 by2 = 0; /*Initialize by(n-2) = 0*/
Esther 1:8a0a39740897 97 bz1 = 0; /*Initialize bz(n-1) = 0*/
Esther 1:8a0a39740897 98 bz2 = 0; /*Initialize bz(n-2) = 0*/
Esther 1:8a0a39740897 99 bzabs1 = 0; /*Initialize bzabs(n-1) = 0*/
Esther 1:8a0a39740897 100 bzabs2 = 0; /*Initialize bzabs(n-2) = 0*/
Esther 1:8a0a39740897 101 bw1 = 0; /*Initialize bw(n-1) = 0*/
Esther 1:8a0a39740897 102 bw2 = 0; /*Initialize bw(n-2) = 0*/
Esther 1:8a0a39740897 103 const float Ts = 0.001; /*Sample Time, const(ant)*/
Esther 1:8a0a39740897 104
Esther 1:8a0a39740897 105 //Constanten voor tekening: EMGdeel
Esther 1:8a0a39740897 106 xbegin= 0; //beginpositie
Esther 1:8a0a39740897 107 ybegin=0; //beginpositie
gerjan 3:a3e4580af271 108 qbegin=5.50; //beginhoek (in rad) vanaf de y-as, rechtsom gedraaid is positief
gerjan 3:a3e4580af271 109 MaxsnelheidV=150.0; //in mm/s
gerjan 3:a3e4580af271 110 MaxsnelheidD=0.26; //in rad/s
Esther 2:103de31c8803 111 //constanten regelaar
Esther 2:103de31c8803 112 kp_r = 0.006;
Esther 2:103de31c8803 113 ki_r = 0.005;
gerjan 3:a3e4580af271 114
Esther 1:8a0a39740897 115 Ticker looptimer;
Esther 1:8a0a39740897 116 looptimer.attach(setlooptimerflag,Ts);
Esther 1:8a0a39740897 117
Esther 1:8a0a39740897 118 while (true) { //oneindige while loop
Esther 1:8a0a39740897 119
Esther 1:8a0a39740897 120 while(looptimerflag != true);
Esther 1:8a0a39740897 121 looptimerflag = false;
Esther 1:8a0a39740897 122
Esther 1:8a0a39740897 123
Esther 1:8a0a39740897 124 // state 1 RUST
Esther 1:8a0a39740897 125 if (state == 1) {
Esther 1:8a0a39740897 126
Esther 1:8a0a39740897 127 pc.printf("state 1 RUST | knop1 = cal_motor knop2 = MENU EMG knop3 = Tekenen \n\r");
Esther 1:8a0a39740897 128
Esther 0:e9e50c0a6502 129
Esther 1:8a0a39740897 130 if (knop1 == false ) { //als knop 1 is ingedrukt
Esther 1:8a0a39740897 131 state=2;
Esther 1:8a0a39740897 132 wait(0.05); //wacht goed contact knopje
Esther 1:8a0a39740897 133
Esther 1:8a0a39740897 134 while(knop1 == false) {} //wacht tot knop is losgelaten
Esther 1:8a0a39740897 135 wait(0.05); // wacht goed contact knopje
Esther 1:8a0a39740897 136
Esther 1:8a0a39740897 137 }
Esther 1:8a0a39740897 138
Esther 1:8a0a39740897 139 if (knop2 == false ) { //als knop 2 wordt ingedrukt: state is 3
Esther 1:8a0a39740897 140 state=3;
Esther 1:8a0a39740897 141 wait(0.05);
Esther 1:8a0a39740897 142
Esther 1:8a0a39740897 143 while(knop2 == false) {}
Esther 1:8a0a39740897 144 wait(0.05);
Esther 1:8a0a39740897 145 }
Esther 1:8a0a39740897 146 if (knop3 == false && calibratie_rust == true && calibratie_max == true && calibratie_motor == true) {
Esther 2:103de31c8803 147 state=6; //state 6 kan alleen uitgevoerd worden wanneer alle calibraties gedaan zijn.
Esther 1:8a0a39740897 148 wait(0.05);
Esther 1:8a0a39740897 149
Esther 1:8a0a39740897 150 while(knop3 == false) {}
Esther 1:8a0a39740897 151 wait(0.05);
Esther 1:8a0a39740897 152 meting=true;
Esther 1:8a0a39740897 153
Esther 1:8a0a39740897 154 }
Esther 1:8a0a39740897 155 if (knop3 == false && state !=6) {
Esther 1:8a0a39740897 156 wait(0.05);
Esther 1:8a0a39740897 157 pc.printf("Niet alle calibraties uitgevoerd! \n");
Esther 1:8a0a39740897 158 wait(1);
Esther 1:8a0a39740897 159 }
Esther 1:8a0a39740897 160
Esther 1:8a0a39740897 161
Esther 0:e9e50c0a6502 162 }
Esther 0:e9e50c0a6502 163
Esther 1:8a0a39740897 164
Esther 1:8a0a39740897 165 //state2 CAL MOTOR
Esther 1:8a0a39740897 166 if (state == 2) {
Esther 1:8a0a39740897 167 pc.printf("state 2 cal_motor | knop1 = terug naar rust \n\r");
Esther 1:8a0a39740897 168
Esther 1:8a0a39740897 169
Esther 1:8a0a39740897 170 if (knop1 == false ) {
Esther 1:8a0a39740897 171 state=1;
Esther 1:8a0a39740897 172 wait(0.05);
Esther 1:8a0a39740897 173
Esther 1:8a0a39740897 174 while(knop1 == false) {}
Esther 1:8a0a39740897 175 wait(0.05);
Esther 1:8a0a39740897 176
Esther 2:103de31c8803 177 motor1.setPosition(200.0);
Esther 2:103de31c8803 178 motor2.setPosition(597.15);
Esther 2:103de31c8803 179
Esther 2:103de31c8803 180 x=0;
Esther 2:103de31c8803 181 y=0;
Esther 2:103de31c8803 182
gerjan 3:a3e4580af271 183 dri_1=0;
Esther 2:103de31c8803 184
Esther 2:103de31c8803 185 calibratie_motor = true;
Esther 1:8a0a39740897 186
Esther 1:8a0a39740897 187
Esther 1:8a0a39740897 188
Esther 1:8a0a39740897 189
Esther 1:8a0a39740897 190 }
Esther 0:e9e50c0a6502 191 }
Esther 1:8a0a39740897 192 // state 3 MENU EMG
Esther 1:8a0a39740897 193 if (state == 3) {
Esther 1:8a0a39740897 194 pc.printf("state 3 MENU EMG | knop1= cal EMG rust knop2= rust knop3= cal EMG max \n\r");
Esther 1:8a0a39740897 195
Esther 1:8a0a39740897 196
Esther 1:8a0a39740897 197 if (knop2 == false ) { // terug naar state 1
Esther 1:8a0a39740897 198 state=1;
Esther 1:8a0a39740897 199 wait(0.05);
Esther 1:8a0a39740897 200
Esther 1:8a0a39740897 201 while(knop2 == false) {}
Esther 1:8a0a39740897 202 wait(0.05);
Esther 1:8a0a39740897 203 }
Esther 1:8a0a39740897 204
Esther 1:8a0a39740897 205 if (knop1 == false ) { // naar state 4
Esther 1:8a0a39740897 206 state=4;
Esther 1:8a0a39740897 207 wait(0.05);
Esther 1:8a0a39740897 208
Esther 1:8a0a39740897 209 while(knop1 == false) {}
Esther 1:8a0a39740897 210 wait(0.05);
Esther 1:8a0a39740897 211
Esther 1:8a0a39740897 212 // begingrenswaarden stellen:
Esther 1:8a0a39740897 213 GrenswaardeV=0;
Esther 1:8a0a39740897 214 GrenswaardeD=0;
Esther 1:8a0a39740897 215 meting=true;
Esther 1:8a0a39740897 216 }
Esther 1:8a0a39740897 217
Esther 1:8a0a39740897 218 if (knop3 == false ) { // naar state 5
Esther 1:8a0a39740897 219 state=5;
Esther 1:8a0a39740897 220 wait(0.05);
Esther 1:8a0a39740897 221
Esther 1:8a0a39740897 222 while(knop3 == false) {}
Esther 1:8a0a39740897 223 wait(0.05);
Esther 1:8a0a39740897 224
Esther 1:8a0a39740897 225 // begingrenswaarden stellen:
Esther 1:8a0a39740897 226 MaxwaardeV=0;
Esther 1:8a0a39740897 227 MaxwaardeD=0;
Esther 1:8a0a39740897 228 meting=true;
Esther 1:8a0a39740897 229
Esther 1:8a0a39740897 230 }
Esther 1:8a0a39740897 231
Esther 1:8a0a39740897 232
Esther 0:e9e50c0a6502 233 }
Esther 1:8a0a39740897 234
Esther 1:8a0a39740897 235
Esther 1:8a0a39740897 236 //METEN VAN EMG
Esther 1:8a0a39740897 237 if (meting == true) {
Esther 1:8a0a39740897 238 // pc.printf("TEST CODE: Meting in gang\n");
Esther 1:8a0a39740897 239 yy = emg1.read(); //<measurement function, read from pin>
Esther 1:8a0a39740897 240 byy= emg2.read();
Esther 1:8a0a39740897 241
Esther 1:8a0a39740897 242 z=-f1*z1-f2*z2+e1*yy+e2*y1+e3*y2; /*hoogdoorlaatfilteroverdacht*/
Esther 1:8a0a39740897 243 bz=-bf1*bz1-bf2*bz2+be1*byy+be2*by1+be3*by2; /*hoogdoorlaatfilteroverdacht van biceps*/
Esther 1:8a0a39740897 244
Esther 1:8a0a39740897 245 y2 = y1; /*y(n-1) will be y(n-2) on next loop*/
Esther 1:8a0a39740897 246 y1= yy; /*y(n) will be y(n-1) on next loop*/
Esther 1:8a0a39740897 247 z2 = z1; /*z(n-1) will be z(n-2) on next loop*/
Esther 1:8a0a39740897 248 z1 = z; /*z(n) will be z(n-1) on next loop*/
Esther 1:8a0a39740897 249
Esther 1:8a0a39740897 250 by2 = by1; /*y(n-1) will be y(n-2) on next loop*/
Esther 1:8a0a39740897 251 by1= byy; /*y(n) will be y(n-1) on next loop*/
Esther 1:8a0a39740897 252 bz2 = bz1; /*z(n-1) will be z(n-2) on next loop*/
Esther 1:8a0a39740897 253 bz1 = bz; /*z(n) will be z(n-1) on next loop*/
Esther 1:8a0a39740897 254
Esther 1:8a0a39740897 255 zabs=abs(z);/*rectify*/
Esther 1:8a0a39740897 256 bzabs=abs(bz);/*rectify*/
Esther 1:8a0a39740897 257
Esther 1:8a0a39740897 258 w=-h1*w1-h2*w2+g1*zabs+g2*zabs1+g3*zabs2; /*laagdoorlaatfilteroverdracht*/
Esther 1:8a0a39740897 259 bw=-bh1*bw1-bh2*bw2+bg1*bzabs+bg2*bzabs1+bg3*bzabs2; /*laagdoorlaatfilteroverdracht van biceps*/
Esther 1:8a0a39740897 260
Esther 1:8a0a39740897 261 zabs2 = zabs1; /*z(n-1) will be z(n-2) on next loop*/
Esther 1:8a0a39740897 262 zabs1 = zabs; /*z(n) will be z(n-1) on next loop*/
Esther 1:8a0a39740897 263 w2 = w1; /*w(n-1) will be w(n-2) on next loop*/
Esther 1:8a0a39740897 264 w1 = w; /*w(n) will be w(n-1) on next loop*/
Esther 1:8a0a39740897 265
Esther 1:8a0a39740897 266 bzabs2 = bzabs1; /*z(n-1) will be z(n-2) on next loop*/
Esther 1:8a0a39740897 267 bzabs1 = bzabs; /*z(n) will be z(n-1) on next loop*/
Esther 1:8a0a39740897 268 bw2 = bw1; /*w(n-1) will be w(n-2) on next loop*/
Esther 1:8a0a39740897 269 bw1 = bw; /*w(n) will be w(n-1) on next loop*/
Esther 1:8a0a39740897 270
Esther 1:8a0a39740897 271 //pc.printf("%f,%f\n",w,bw);
Esther 1:8a0a39740897 272
Esther 1:8a0a39740897 273 wait(Ts); /*When finished wait (maybe a bit shorter?)*/
Esther 1:8a0a39740897 274
Esther 1:8a0a39740897 275 if (w>1.0) {
Esther 1:8a0a39740897 276 w=1.0;
Esther 1:8a0a39740897 277 }
Esther 1:8a0a39740897 278 if (bw>1.0) {
Esther 1:8a0a39740897 279 bw=1.0;
Esther 1:8a0a39740897 280 }
Esther 1:8a0a39740897 281
Esther 1:8a0a39740897 282 }
Esther 0:e9e50c0a6502 283
Esther 0:e9e50c0a6502 284
Esther 0:e9e50c0a6502 285
Esther 1:8a0a39740897 286 // state 4 EMG CAL IN RUST
Esther 1:8a0a39740897 287 if (state == 4) {
Esther 1:8a0a39740897 288 pc.printf("state 4 cal EMG RUST | knop1= MEMNU EMG \n\r");
Esther 1:8a0a39740897 289 pc.printf("%f,%f\n",GrenswaardeV,GrenswaardeD);
Esther 1:8a0a39740897 290 // Nieuwe grenswaarden bepalen
Esther 1:8a0a39740897 291 if (w > GrenswaardeV) {
Esther 1:8a0a39740897 292 GrenswaardeV = w;
Esther 1:8a0a39740897 293 }
Esther 1:8a0a39740897 294 if (bw > GrenswaardeD) {
Esther 1:8a0a39740897 295 GrenswaardeD = bw;
Esther 1:8a0a39740897 296 }
Esther 1:8a0a39740897 297 if (knop1 == false ) { // terug naar state 1
Esther 1:8a0a39740897 298 state=3;
Esther 1:8a0a39740897 299 wait(0.05);
Esther 1:8a0a39740897 300
Esther 1:8a0a39740897 301 while(knop1 == false) {}
Esther 1:8a0a39740897 302 wait(0.05);
Esther 1:8a0a39740897 303 calibratie_rust = true;
Esther 1:8a0a39740897 304 meting=false;
Esther 1:8a0a39740897 305
Esther 1:8a0a39740897 306 }
Esther 1:8a0a39740897 307 }
Esther 1:8a0a39740897 308 // state 5 EMG CAL MAX
Esther 1:8a0a39740897 309 if (state == 5) {
Esther 1:8a0a39740897 310 pc.printf("state 5 cal EMG MAX | knop3= EMG MENU \n\r");
Esther 1:8a0a39740897 311 pc.printf("%f,%f\n",MaxwaardeV,MaxwaardeD);
Esther 1:8a0a39740897 312 // Nieuwe maxwaarden bepalen
Esther 1:8a0a39740897 313 if (w > MaxwaardeV) {
Esther 1:8a0a39740897 314 MaxwaardeV = w;
Esther 1:8a0a39740897 315 }
Esther 1:8a0a39740897 316 if (bw > MaxwaardeD) {
Esther 1:8a0a39740897 317 MaxwaardeD = bw;
Esther 1:8a0a39740897 318 }
Esther 1:8a0a39740897 319
Esther 1:8a0a39740897 320 // einde maxwaarde bepalen:
Esther 1:8a0a39740897 321 if (knop3 == false ) { // terug naar state 3
Esther 1:8a0a39740897 322 state=3;
Esther 1:8a0a39740897 323 wait(0.05);
Esther 1:8a0a39740897 324
Esther 1:8a0a39740897 325 while(knop3 == false) {}
Esther 1:8a0a39740897 326 wait(0.05);
Esther 1:8a0a39740897 327 calibratie_max = true;
Esther 1:8a0a39740897 328 meting=false;
Esther 1:8a0a39740897 329
Esther 1:8a0a39740897 330 }
Esther 1:8a0a39740897 331
Esther 1:8a0a39740897 332 }
Esther 1:8a0a39740897 333
Esther 1:8a0a39740897 334 // state 6 TEKENEN
Esther 1:8a0a39740897 335
Esther 1:8a0a39740897 336 if (state == 6) {
Esther 1:8a0a39740897 337 // pc.printf("state 6 tekenen | knop3= rust \n\r");
Esther 1:8a0a39740897 338
Esther 1:8a0a39740897 339 // EMG
Esther 1:8a0a39740897 340 BereikD = MaxwaardeD-GrenswaardeD; //Bereik van grafiek EMG (Voltage t.o.v. tijd)
Esther 1:8a0a39740897 341 BereikV = MaxwaardeV-GrenswaardeV; //Bereik van grafiek EMG (Voltage t.o.v. tijd)
gerjan 3:a3e4580af271 342
Esther 1:8a0a39740897 343 SnelheidV = (MaxsnelheidV/BereikV)*(w-GrenswaardeV); // Snelheid van pen (in cm/sec), lineair verband met het Bereik
Esther 1:8a0a39740897 344 SnelheidD = (MaxsnelheidD/BereikD)*(bw-GrenswaardeD); //Draaisnelheid pen (in graden/sec), lineair verband met het Bereik
Esther 1:8a0a39740897 345
Esther 1:8a0a39740897 346 if (SnelheidV<MaxsnelheidD) {
Esther 1:8a0a39740897 347 SnelheidV=MaxsnelheidD;
Esther 1:8a0a39740897 348 }
Esther 1:8a0a39740897 349
Esther 1:8a0a39740897 350 if (SnelheidD<MaxsnelheidD) {
Esther 1:8a0a39740897 351 SnelheidD=MaxsnelheidD;
Esther 1:8a0a39740897 352 }
Esther 1:8a0a39740897 353
Esther 1:8a0a39740897 354 if (SnelheidV>MaxsnelheidV) {
Esther 1:8a0a39740897 355 SnelheidV=MaxsnelheidV;
Esther 1:8a0a39740897 356 }
Esther 1:8a0a39740897 357
Esther 1:8a0a39740897 358 if (SnelheidD>MaxsnelheidV) {
Esther 1:8a0a39740897 359 SnelheidD=MaxsnelheidV;
Esther 1:8a0a39740897 360 }
Esther 1:8a0a39740897 361
Esther 1:8a0a39740897 362 deltas = SnelheidV*Ts; //afstand tussen twee meetpunten
Esther 1:8a0a39740897 363 deltaq = SnelheidD*Ts; //verandering hoek tov. de rechtdoor
Esther 1:8a0a39740897 364 q = deltaq+qbegin; // hoekverandering tov. het assenstelsel
Esther 1:8a0a39740897 365
Esther 1:8a0a39740897 366 deltay = deltas*cos(q); //veranding van pen in de y-richting
Esther 1:8a0a39740897 367 deltax = deltas*sin(q); // verandering van pen in de x-richting
Esther 1:8a0a39740897 368
Esther 1:8a0a39740897 369 x = xbegin+deltax; // nieuwe postie pen, x-coördinaat
Esther 1:8a0a39740897 370 y = ybegin+deltay; // nieuwe positie pen, y-coöridnaat
Esther 1:8a0a39740897 371
gerjan 3:a3e4580af271 372 if (x>297) { //grenzen A4
gerjan 3:a3e4580af271 373 x=297;
Esther 1:8a0a39740897 374 }
gerjan 3:a3e4580af271 375 if (y>210) {
gerjan 3:a3e4580af271 376 y=210;
Esther 1:8a0a39740897 377 }
Esther 1:8a0a39740897 378
Esther 1:8a0a39740897 379 if (x<0) { //grenzen A4
Esther 1:8a0a39740897 380 x=0;
Esther 1:8a0a39740897 381 }
Esther 1:8a0a39740897 382 if (y<0) {
Esther 1:8a0a39740897 383 y=0;
Esther 1:8a0a39740897 384 }
Esther 1:8a0a39740897 385
Esther 1:8a0a39740897 386 xbegin=x; // x zal xbegin worden in de volgende loop oftewel:(x(n) will be x(n-1) on next loop)
Esther 1:8a0a39740897 387 ybegin=y; // y zal ybgin worden in de volgende loop oftewel:(y(n) will be y(n-1) on next loop)
Esther 1:8a0a39740897 388 qbegin=q; // q zal qbegin worden in de volgende loop oftewel:(q(n) will be q(n-1) on next loop)
Esther 1:8a0a39740897 389
gerjan 3:a3e4580af271 390 pc.printf("bV=%f, bD=%f, sV=%f, sD=%f, x=%f, y=%f, hoek=%f\n",BereikV,BereikD,SnelheidV,SnelheidD,x,y,(d*57.3));
Esther 1:8a0a39740897 391
Esther 1:8a0a39740897 392
Esther 1:8a0a39740897 393 // motoren
Esther 1:8a0a39740897 394
Esther 2:103de31c8803 395 if (y>210.0) {
Esther 2:103de31c8803 396 y=210.0;
Esther 2:103de31c8803 397 }
Esther 2:103de31c8803 398 if(y<=0.0) {
Esther 2:103de31c8803 399 y=0.0;
Esther 2:103de31c8803 400 }
Esther 2:103de31c8803 401 if(x>297.0) {
Esther 2:103de31c8803 402 x=297.0;
Esther 2:103de31c8803 403 }
Esther 2:103de31c8803 404 if(x<=0.0) {
Esther 2:103de31c8803 405 x=0.0;
Esther 2:103de31c8803 406 }
Esther 2:103de31c8803 407
Esther 2:103de31c8803 408 // Omzetten hoek en straal
Esther 2:103de31c8803 409 //theta = atan(y/x)+0.25*pi;
Esther 2:103de31c8803 410 //r = (sqrt(x*x+y*y)) ;// * (2577/461.335);
Esther 2:103de31c8803 411
Esther 2:103de31c8803 412 theta = atan((x+69.80)/(y+69.80));
Esther 2:103de31c8803 413 r = sqrt( ((x + 69.8)*(x + 69.8))+ ((y + 69.8)*(y + 69.8)) );
Esther 2:103de31c8803 414
Esther 2:103de31c8803 415
Esther 2:103de31c8803 416 theta_pen = motor1.getPosition() * ((.5*pi)/400.0);
Esther 2:103de31c8803 417 r_pen = motor2.getPosition() * (461.34/2790.13);
Esther 1:8a0a39740897 418
Esther 1:8a0a39740897 419
Esther 1:8a0a39740897 420 dtheta = (theta - theta_pen);
Esther 1:8a0a39740897 421 dr = (r - r_pen);
Esther 2:103de31c8803 422
Esther 2:103de31c8803 423 //REGELAAR
Esther 2:103de31c8803 424 up_r = kp_r * dr; //P-actie
Esther 2:103de31c8803 425 dri = dri_1 + dr*Ts;
Esther 2:103de31c8803 426 ui_r = dri_1 * ki_r; //I-actie
Esther 2:103de31c8803 427 utot_r = up_r + ui_r; //
Esther 2:103de31c8803 428
Esther 2:103de31c8803 429 dri_1 = dri; //nieuwe waardes oud maken.
Esther 2:103de31c8803 430
Esther 2:103de31c8803 431 theta_pwm = (dtheta)*3.0;
Esther 2:103de31c8803 432 r_pwm = (utot_r/1.0);
Esther 2:103de31c8803 433
Esther 1:8a0a39740897 434 //NAAR MOTOR
Esther 1:8a0a39740897 435
Esther 1:8a0a39740897 436 //Zorgen dat pwm tussen -1 en 1 blijft.
Esther 1:8a0a39740897 437 if(theta_pwm > 1) {
Esther 1:8a0a39740897 438 theta_pwm=1;
Esther 1:8a0a39740897 439 }
Esther 1:8a0a39740897 440 if(theta_pwm < -1) {
Esther 1:8a0a39740897 441 theta_pwm=-1;
Esther 1:8a0a39740897 442 }
Esther 1:8a0a39740897 443 if(r_pwm > 1) {
Esther 1:8a0a39740897 444 r_pwm=1;
Esther 1:8a0a39740897 445 }
Esther 1:8a0a39740897 446 if(r_pwm < -1) {
Esther 1:8a0a39740897 447 r_pwm=-1;
Esther 1:8a0a39740897 448 }
Esther 2:103de31c8803 449
Esther 1:8a0a39740897 450 // Bepaal richting waarin motoren moeten draaien
Esther 1:8a0a39740897 451 if(theta_pwm > 0)
Esther 1:8a0a39740897 452 motor1dir.write(1);
Esther 1:8a0a39740897 453 else
Esther 1:8a0a39740897 454 motor1dir.write(0);
Esther 1:8a0a39740897 455 if(r_pwm > 0)
Esther 1:8a0a39740897 456 motor2dir.write(1);
Esther 1:8a0a39740897 457 else
Esther 1:8a0a39740897 458 motor2dir.write(0);
Esther 1:8a0a39740897 459
Esther 1:8a0a39740897 460 // print naar pc
gerjan 3:a3e4580af271 461 //pc.printf("t=%.3f dt=%.3f tpwm=%.3f | r=%.3f dr=%.3f rpwm=%.3f inputsin=%0.3f\n", theta, dtheta, theta_pwm, r, dr, r_pwm, inputsinus);
Esther 2:103de31c8803 462
Esther 1:8a0a39740897 463 //schrijf PWM naar motor
Esther 1:8a0a39740897 464 pwm_motor1.write(abs(theta_pwm));
Esther 1:8a0a39740897 465 pwm_motor2.write(abs(r_pwm));
Esther 1:8a0a39740897 466
Esther 1:8a0a39740897 467 // terug naar state 1 knop
Esther 1:8a0a39740897 468 if (knop3 == false ) { // terug naar state 1
Esther 1:8a0a39740897 469 state=1;
gerjan 3:a3e4580af271 470
Esther 1:8a0a39740897 471 wait(0.05);
Esther 1:8a0a39740897 472
Esther 1:8a0a39740897 473 while(knop3 == false) {}
Esther 1:8a0a39740897 474 wait(0.05);
Esther 1:8a0a39740897 475 }
Esther 1:8a0a39740897 476
Esther 1:8a0a39740897 477 }
Esther 0:e9e50c0a6502 478
Esther 0:e9e50c0a6502 479 } //sluiten oneindige while loop
Esther 0:e9e50c0a6502 480
Esther 1:8a0a39740897 481 } //afsluiten main