script dat de twee motoren los van elkaar laat draaien

Dependencies:   mbed Encoder MODSERIAL

Committer:
jaccoton
Date:
Wed Nov 06 16:33:03 2013 +0000
Revision:
4:3f2f48dad1ff
Parent:
3:4db5e8ed9657
script potmeter uitleg opnieuw

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jaccoton 0:53c4dbb10a17 1 #include "mbed.h"
jaccoton 0:53c4dbb10a17 2 #include "encoder.h"
jaccoton 0:53c4dbb10a17 3 #include "MODSERIAL.h"
jaccoton 0:53c4dbb10a17 4
jaccoton 0:53c4dbb10a17 5 /** keep_in_range -> float in, and keep_in_range if less than min, or larger than max **/
jaccoton 0:53c4dbb10a17 6 void keep_in_range(float * in, float min, float max);
jaccoton 0:53c4dbb10a17 7
jaccoton 0:53c4dbb10a17 8 /** variable to show when a new loop can be started*/
jaccoton 0:53c4dbb10a17 9 /** volatile means that it can be changed in an */
jaccoton 0:53c4dbb10a17 10 /** interrupt routine, and that that change is vis-*/
jaccoton 0:53c4dbb10a17 11 /** ible in the main loop. */
jaccoton 0:53c4dbb10a17 12
jaccoton 0:53c4dbb10a17 13 volatile bool looptimerflag;
jaccoton 0:53c4dbb10a17 14
jaccoton 0:53c4dbb10a17 15 /** function called by Ticker "looptimer" */
jaccoton 0:53c4dbb10a17 16 /** variable 'looptimerflag' is set to 'true' */
jaccoton 0:53c4dbb10a17 17 /** each time the looptimer expires. */
jaccoton 0:53c4dbb10a17 18 void setlooptimerflag(void)
jaccoton 0:53c4dbb10a17 19 {
jaccoton 0:53c4dbb10a17 20 looptimerflag = true;
jaccoton 0:53c4dbb10a17 21 }
jaccoton 0:53c4dbb10a17 22
jaccoton 0:53c4dbb10a17 23
jaccoton 0:53c4dbb10a17 24 int main()
jaccoton 0:53c4dbb10a17 25 {
jaccoton 0:53c4dbb10a17 26
jaccoton 0:53c4dbb10a17 27 //LOCAL VARIABLES
jaccoton 0:53c4dbb10a17 28 /*Potmeter input*/
jaccoton 2:5f175018d1ff 29 AnalogIn potmeter(PTC2);
jaccoton 2:5f175018d1ff 30 AnalogIn potmeter2(PTB0);
jaccoton 0:53c4dbb10a17 31
jaccoton 0:53c4dbb10a17 32 //EMG input
jaccoton 2:5f175018d1ff 33 /*AnalogIn emg0(PTB0);
jaccoton 0:53c4dbb10a17 34 AnalogIn emg1(PTB1);
jaccoton 0:53c4dbb10a17 35 AnalogIn emg2(PTB2);
jaccoton 2:5f175018d1ff 36 AnalogIn emg3(PTB3);*/
jaccoton 0:53c4dbb10a17 37 /* Encoder, using my encoder library */
jaccoton 0:53c4dbb10a17 38 /* First pin should be PTDx or PTAx */
jaccoton 0:53c4dbb10a17 39 /* because those pins can be used as */
jaccoton 0:53c4dbb10a17 40 /* InterruptIn */
jaccoton 0:53c4dbb10a17 41 Encoder motor1(PTD0,PTC9);
jaccoton 0:53c4dbb10a17 42 Encoder motor2(PTD2,PTC8);
jaccoton 0:53c4dbb10a17 43 /* MODSERIAL to get non-blocking Serial*/
jaccoton 0:53c4dbb10a17 44 MODSERIAL pc(USBTX,USBRX);
jaccoton 0:53c4dbb10a17 45 /* PWM control to motor */
jaccoton 0:53c4dbb10a17 46 PwmOut pwm_motor(PTA12);
jaccoton 0:53c4dbb10a17 47 PwmOut pwm_motor2(PTA5);
jaccoton 0:53c4dbb10a17 48 /* Direction pin */
jaccoton 0:53c4dbb10a17 49 DigitalOut motordir(PTD3);
jaccoton 0:53c4dbb10a17 50 DigitalOut motordir2(PTD1);
jaccoton 0:53c4dbb10a17 51
jaccoton 0:53c4dbb10a17 52
jaccoton 0:53c4dbb10a17 53 /*floats van de filters van het emg*/
jaccoton 0:53c4dbb10a17 54 pc.baud(115200); // Defining the Baud rate for comunication with PC
jaccoton 0:53c4dbb10a17 55 /*EMG Variables 1*/
jaccoton 1:8fb04c532736 56 float t;
jaccoton 0:53c4dbb10a17 57 t = 0;
jaccoton 0:53c4dbb10a17 58 float hoek1, hoek2;
jaccoton 0:53c4dbb10a17 59 hoek1 = 0;
jaccoton 0:53c4dbb10a17 60 hoek2 = 0;
jaccoton 0:53c4dbb10a17 61 float x,y,z,x1,x2,y1,z1,y2,z2,f,f1,f2,s,s1 ; //Defining variables for filter
jaccoton 0:53c4dbb10a17 62 x1=0; // setting the variables to zero so they don't
jaccoton 0:53c4dbb10a17 63 x2=0; // have any value jet and are used to store older values later
jaccoton 0:53c4dbb10a17 64 y1=0;
jaccoton 0:53c4dbb10a17 65 y2=0;
jaccoton 0:53c4dbb10a17 66 z1=0;
jaccoton 0:53c4dbb10a17 67 z2=0;
jaccoton 0:53c4dbb10a17 68 f1=0;
jaccoton 0:53c4dbb10a17 69 f2=0;
jaccoton 0:53c4dbb10a17 70 s=0;
jaccoton 0:53c4dbb10a17 71 s1=0;
jaccoton 0:53c4dbb10a17 72 const float Ts = 0.01; //Defining time steps
jaccoton 0:53c4dbb10a17 73
jaccoton 0:53c4dbb10a17 74 /*EMG Variables 2*/
jaccoton 0:53c4dbb10a17 75 float xx,yy,zz,xx1,xx2,yy1,zz1,yy2,zz2,ff,ff1,ff2 ; //Defining variables for filter
jaccoton 0:53c4dbb10a17 76 xx1=0; // setting the variables to zero so they don't
jaccoton 0:53c4dbb10a17 77 xx2=0; // have any value jet and are used to store older values later
jaccoton 0:53c4dbb10a17 78 yy1=0;
jaccoton 0:53c4dbb10a17 79 yy2=0;
jaccoton 0:53c4dbb10a17 80 zz1=0;
jaccoton 0:53c4dbb10a17 81 zz2=0;
jaccoton 0:53c4dbb10a17 82 ff1=0;
jaccoton 0:53c4dbb10a17 83 ff2=0;
jaccoton 0:53c4dbb10a17 84
jaccoton 0:53c4dbb10a17 85 /*EMG Variables 3*/
jaccoton 0:53c4dbb10a17 86 float xxx,yyy,zzz,xxx1,xxx2,yyy1,zzz1,yyy2,zzz2,fff,fff1,fff2 ; //Defining variables for filter
jaccoton 0:53c4dbb10a17 87 xxx1=0; // setting the variables to zero so they don't
jaccoton 0:53c4dbb10a17 88 xxx2=0; // have any value jet and are used to store older values later
jaccoton 0:53c4dbb10a17 89 yyy1=0;
jaccoton 0:53c4dbb10a17 90 yyy2=0;
jaccoton 0:53c4dbb10a17 91 zzz1=0;
jaccoton 0:53c4dbb10a17 92 zzz2=0;
jaccoton 0:53c4dbb10a17 93 fff1=0;
jaccoton 0:53c4dbb10a17 94 fff2=0;
jaccoton 0:53c4dbb10a17 95
jaccoton 0:53c4dbb10a17 96 /*EMG Variables 4*/
jaccoton 0:53c4dbb10a17 97 float xxxx,yyyy,zzzz,xxxx1,xxxx2,yyyy1,zzzz1,yyyy2,zzzz2,ffff,ffff1,ffff2 ; //Defining variables for filter
jaccoton 0:53c4dbb10a17 98 xxxx1=0; // setting the variables to zero so they don't
jaccoton 0:53c4dbb10a17 99 xxxx2=0; // have any value jet and are used to store older values later
jaccoton 0:53c4dbb10a17 100 yyyy1=0;
jaccoton 0:53c4dbb10a17 101 yyyy2=0;
jaccoton 0:53c4dbb10a17 102 zzzz1=0;
jaccoton 0:53c4dbb10a17 103 zzzz2=0;
jaccoton 0:53c4dbb10a17 104 ffff1=0;
jaccoton 0:53c4dbb10a17 105 ffff2=0;
jaccoton 0:53c4dbb10a17 106
jaccoton 0:53c4dbb10a17 107 /*Variables to store direction in dependent on the EMG*/
jaccoton 0:53c4dbb10a17 108 float emg_dir;
jaccoton 0:53c4dbb10a17 109 float emg_dir2;
jaccoton 0:53c4dbb10a17 110 float emgPos1, emgPos2, emgPos10, emgPos20;
jaccoton 0:53c4dbb10a17 111 emgPos10 = 0;
jaccoton 0:53c4dbb10a17 112 emgPos20 = 0;
jaccoton 0:53c4dbb10a17 113
jaccoton 0:53c4dbb10a17 114 /* variable to store setpoint in */
jaccoton 0:53c4dbb10a17 115 float setpoint;
jaccoton 0:53c4dbb10a17 116 float setpoint2;
jaccoton 0:53c4dbb10a17 117
jaccoton 0:53c4dbb10a17 118 /* variable to store pwm value in*/
jaccoton 0:53c4dbb10a17 119 float pwm_to_motor;
jaccoton 0:53c4dbb10a17 120 float pwm_to_motor2;
jaccoton 0:53c4dbb10a17 121
jaccoton 0:53c4dbb10a17 122
jaccoton 0:53c4dbb10a17 123 /* Alle waardes voor de regelaar benoemen. Moet nog afgesteld worden*/
jaccoton 0:53c4dbb10a17 124 float u, u1, e, e1, ui, ei, up, ei1, ed, ud;
jaccoton 0:53c4dbb10a17 125 float u2, u12, e2, e12, ui2, ei2, up2, ei12, ed2, ud2;
jaccoton 0:53c4dbb10a17 126 const float kp = 0.001;//0.02438; //test value 0.001
jaccoton 0:53c4dbb10a17 127 const float ki = 0.00001;//0.11661; //test value 0.00001
jaccoton 0:53c4dbb10a17 128 const float kd = 0.00001;//0.00071; //test value 0.00001
jaccoton 0:53c4dbb10a17 129 //const float Ts = 0.01;
jaccoton 0:53c4dbb10a17 130 const float kp2 = 0.001;//0.02274; //test value 0.001
jaccoton 0:53c4dbb10a17 131 const float ki2 = 0.00001;//0.10879; //test value 0.00001
jaccoton 0:53c4dbb10a17 132 const float kd2 = 0.00001;//0.00065; //test value 0.00001
jaccoton 0:53c4dbb10a17 133 //const float Ts2 = 0.1;
jaccoton 0:53c4dbb10a17 134 e1 = 0;
jaccoton 0:53c4dbb10a17 135 u1 = 0;
jaccoton 0:53c4dbb10a17 136 ei1 = 0;
jaccoton 0:53c4dbb10a17 137 e12 = 0;
jaccoton 0:53c4dbb10a17 138 u12 = 0;
jaccoton 0:53c4dbb10a17 139 ei12 = 0;
jaccoton 0:53c4dbb10a17 140 //START OF CODE
jaccoton 0:53c4dbb10a17 141
jaccoton 0:53c4dbb10a17 142 /*Set the baudrate (use this number in RealTerm too! */
jaccoton 0:53c4dbb10a17 143 //pc.baud(115200);
jaccoton 0:53c4dbb10a17 144
jaccoton 0:53c4dbb10a17 145 /*Create a ticker, and let it call the */
jaccoton 0:53c4dbb10a17 146 /*function 'setlooptimerflag' every 0.01s */
jaccoton 0:53c4dbb10a17 147 Ticker looptimer;
jaccoton 0:53c4dbb10a17 148 looptimer.attach(setlooptimerflag,Ts);
jaccoton 0:53c4dbb10a17 149
jaccoton 0:53c4dbb10a17 150
jaccoton 0:53c4dbb10a17 151 //INFINITE LOOP
jaccoton 0:53c4dbb10a17 152 while(1) {
jaccoton 0:53c4dbb10a17 153 /* Wait until looptimer flag is true. */
jaccoton 0:53c4dbb10a17 154 /* '!=' means not-is-equal */
jaccoton 0:53c4dbb10a17 155 while(looptimerflag != true);
jaccoton 0:53c4dbb10a17 156 /* Clear the looptimerflag, otherwise */
jaccoton 0:53c4dbb10a17 157 /* the program would simply continue */
jaccoton 0:53c4dbb10a17 158 /* without waitingin the next iteration*/
jaccoton 0:53c4dbb10a17 159 looptimerflag = false;
jaccoton 0:53c4dbb10a17 160
jaccoton 0:53c4dbb10a17 161 /*while loop voor de emg*/
jaccoton 0:53c4dbb10a17 162
jaccoton 0:53c4dbb10a17 163 /* EMG Filter 1*/
jaccoton 3:4db5e8ed9657 164 //* EMG Filter 1*/
jaccoton 4:3f2f48dad1ff 165 //x = emg0.read(); //Reading EMG value
jaccoton 3:4db5e8ed9657 166 y = 0.638945525159022*x+1.277891050318045*x1+0.638945525159022*x2-y1*1.142980502539901-y2*0.412801598096189; //Formula for highpass filter at 20Hz as given in slides
jaccoton 3:4db5e8ed9657 167 z = y*0.391335772501769+y1*-0.782671545003537+y2*0.391335772501769-z1*-0.369527377351241-z2*0.195815712655833; // Formula for low pass filter at 40Hz instead of a Notch filter
jaccoton 0:53c4dbb10a17 168 z = abs(z); //Rectify the signal
jaccoton 3:4db5e8ed9657 169 f = z*0.003621681514929+z1*0.007243363029857+z2*0.003621681514929-f1*-1.822694925196308-f2*0.837181651256023; // low pass filter at 2Hz
jaccoton 0:53c4dbb10a17 170
jaccoton 0:53c4dbb10a17 171
jaccoton 0:53c4dbb10a17 172
jaccoton 0:53c4dbb10a17 173 z1 = z; // Store older values of variables
jaccoton 0:53c4dbb10a17 174 z2 = z1;
jaccoton 0:53c4dbb10a17 175 y2 = y1;
jaccoton 0:53c4dbb10a17 176 y1 = y;
jaccoton 0:53c4dbb10a17 177 x1 = x;
jaccoton 0:53c4dbb10a17 178 x2 = x1;
jaccoton 0:53c4dbb10a17 179 f1 = f;
jaccoton 0:53c4dbb10a17 180 f2 = f1;
jaccoton 0:53c4dbb10a17 181
jaccoton 0:53c4dbb10a17 182 if (f<0.1)
jaccoton 0:53c4dbb10a17 183 f=0;
jaccoton 0:53c4dbb10a17 184 //pc.printf("%f \n \r",(s1*f));
jaccoton 0:53c4dbb10a17 185
jaccoton 0:53c4dbb10a17 186 /* EMG Filter 2*/
jaccoton 4:3f2f48dad1ff 187 //xx = emg1.read(); //Reading EMG value
jaccoton 3:4db5e8ed9657 188 yy = 0.638945525159022*xx+1.277891050318045*xx1+0.638945525159022*xx2-yy1*1.142980502539901-yy2*0.412801598096189; //Formula for highpass filter at 20Hz as given in slides
jaccoton 3:4db5e8ed9657 189 zz = yy*0.391335772501769+yy1*-0.782671545003537+yy2*0.391335772501769-zz1*-0.369527377351241-zz2*0.195815712655833; // Formula for low pass filter at 40Hz instead of a Notch filter
jaccoton 0:53c4dbb10a17 190 zz = abs(zz); //Rectify the signal
jaccoton 3:4db5e8ed9657 191 ff = zz*0.003621681514929+zz1*0.007243363029857+zz2*0.003621681514929-ff1*-1.822694925196308-ff2*0.837181651256023; // low pass filter at 2Hz
jaccoton 0:53c4dbb10a17 192
jaccoton 0:53c4dbb10a17 193 zz1 = zz; // Store older values of variables
jaccoton 0:53c4dbb10a17 194 zz2 = zz1;
jaccoton 0:53c4dbb10a17 195 yy2 = yy1;
jaccoton 0:53c4dbb10a17 196 yy1 = yy;
jaccoton 0:53c4dbb10a17 197 xx1 = xx;
jaccoton 0:53c4dbb10a17 198 xx2 = xx1;
jaccoton 0:53c4dbb10a17 199 ff1 = ff;
jaccoton 0:53c4dbb10a17 200 ff2 = ff1;
jaccoton 0:53c4dbb10a17 201 if (ff<0.1)
jaccoton 0:53c4dbb10a17 202 ff=0;
jaccoton 0:53c4dbb10a17 203 /* EMG Filter 3*/
jaccoton 4:3f2f48dad1ff 204 //xxx = emg2.read(); //Reading EMG value
jaccoton 3:4db5e8ed9657 205 yyy = 0.638945525159022*xxx+1.277891050318045*xxx1+0.638945525159022*xxx2-yyy1*1.142980502539901-yyy2*0.412801598096189; //Formula for highpass filter at 20Hz as given in slides
jaccoton 3:4db5e8ed9657 206 zzz = yyy*0.391335772501769+yyy1*-0.782671545003537+yyy2*0.391335772501769-zzz1*-0.369527377351241-zzz2*0.195815712655833; // Formula for low pass filter at 40Hz instead of a Notch filter
jaccoton 0:53c4dbb10a17 207 zzz = abs(zzz); //Rectify the signal
jaccoton 3:4db5e8ed9657 208 fff = zzz*0.003621681514929+zzz1*0.007243363029857+zzz2*0.003621681514929-fff1*-1.822694925196308-fff2*0.837181651256023; // low pass filter at 2Hz
jaccoton 0:53c4dbb10a17 209
jaccoton 0:53c4dbb10a17 210 zzz1 = zzz; // Store older values of variables
jaccoton 0:53c4dbb10a17 211 zzz2 = zzz1;
jaccoton 0:53c4dbb10a17 212 yyy2 = yyy1;
jaccoton 0:53c4dbb10a17 213 yyy1 = yyy;
jaccoton 0:53c4dbb10a17 214 xxx1 = xxx;
jaccoton 0:53c4dbb10a17 215 xxx2 = xxx1;
jaccoton 0:53c4dbb10a17 216 fff1 = fff;
jaccoton 0:53c4dbb10a17 217 fff2 = fff1;
jaccoton 0:53c4dbb10a17 218 if (fff<0.1)
jaccoton 0:53c4dbb10a17 219 fff=0;
jaccoton 0:53c4dbb10a17 220 /* EMG Filter 4*/
jaccoton 4:3f2f48dad1ff 221 //xxxx = emg3.read(); //Reading EMG value
jaccoton 3:4db5e8ed9657 222 yyyy = 0.638945525159022*xxxx+1.277891050318045*xxxx1+0.638945525159022*xxxx2-yyyy1*1.142980502539901-yyyy2*0.412801598096189; //Formula for highpass filter at 20Hz as given in slides
jaccoton 3:4db5e8ed9657 223 zzzz = yyyy*0.391335772501769+yyyy1*-0.782671545003537+yyyy2*0.391335772501769-zzzz1*-0.369527377351241-zzzz2*0.195815712655833; // Formula for low pass filter at 40Hz instead of a Notch filter
jaccoton 0:53c4dbb10a17 224 zzzz = abs(zzzz); //Rectify the signal
jaccoton 3:4db5e8ed9657 225 ffff = zzzz*0.003621681514929+zzzz1*0.007243363029857+zzzz2*0.003621681514929-ffff1*-1.822694925196308-ffff2*0.837181651256023; // low pass filter at 2Hz
jaccoton 0:53c4dbb10a17 226
jaccoton 0:53c4dbb10a17 227 zzzz1 = zzzz; // Store older values of variables
jaccoton 0:53c4dbb10a17 228 zzzz2 = zzzz1;
jaccoton 0:53c4dbb10a17 229 yyyy2 = yyyy1;
jaccoton 0:53c4dbb10a17 230 yyyy1 = yyyy;
jaccoton 0:53c4dbb10a17 231 xxxx1 = xxxx;
jaccoton 0:53c4dbb10a17 232 xxxx2 = xxxx1;
jaccoton 0:53c4dbb10a17 233 ffff1 = ffff;
jaccoton 0:53c4dbb10a17 234 ffff2 = ffff1;
jaccoton 0:53c4dbb10a17 235 if (ffff<0.1)
jaccoton 0:53c4dbb10a17 236 ffff=0;
jaccoton 3:4db5e8ed9657 237
jaccoton 0:53c4dbb10a17 238 //Printing the Filtered singnal
jaccoton 0:53c4dbb10a17 239 //pc.printf("%f \n \r",f);
jaccoton 0:53c4dbb10a17 240
jaccoton 0:53c4dbb10a17 241 wait(Ts);
jaccoton 0:53c4dbb10a17 242 /*Defining the direction of the Motor*/
jaccoton 1:8fb04c532736 243 emg_dir=f*3;/*-ff; snelheid in de x richting. Of draaiing motor 1*/
jaccoton 1:8fb04c532736 244 emg_dir2=ff*3;/*-ffff; snelheid in de y richting. Of draaiing motor2*/
jaccoton 1:8fb04c532736 245
jaccoton 1:8fb04c532736 246 pc.printf("%f \n \r", emg_dir);
jaccoton 1:8fb04c532736 247 pc.printf("%f \n \r", emg_dir2);
jaccoton 0:53c4dbb10a17 248
jaccoton 0:53c4dbb10a17 249 //omzetten naar hoeksnelheden
jaccoton 0:53c4dbb10a17 250 //hoekV1 = emg_dir*29.5*cos(hoek2)-emg_dir2*29,5*sin(hoek2); //nu heb ik beide hoeksnelheden
jaccoton 0:53c4dbb10a17 251 //hoekV2 = -emg_dir*21,5*cos(hoek1)+emg_dir2*21,5*sin(hoek1);
jaccoton 0:53c4dbb10a17 252
jaccoton 0:53c4dbb10a17 253
jaccoton 0:53c4dbb10a17 254 /*emgPosx1 = emg_dir2*Ts + emgPos10;
jaccoton 0:53c4dbb10a17 255 emgPos2 = emg_dir2*Ts + emgPos20;
jaccoton 0:53c4dbb10a17 256 emgPos10 = emgPos1;
jaccoton 0:53c4dbb10a17 257 emgPos20 = emgPos2;*/
jaccoton 0:53c4dbb10a17 258
jaccoton 0:53c4dbb10a17 259 /* transformatie van xy naar hoek1 en hoek2*/
jaccoton 0:53c4dbb10a17 260
jaccoton 0:53c4dbb10a17 261 //t+=Ts;
jaccoton 0:53c4dbb10a17 262
jaccoton 0:53c4dbb10a17 263
jaccoton 0:53c4dbb10a17 264
jaccoton 0:53c4dbb10a17 265 //emgPosx = 0.5*sin(t);
jaccoton 0:53c4dbb10a17 266 //emgPosy = 0.5*cos(t);
jaccoton 0:53c4dbb10a17 267
jaccoton 0:53c4dbb10a17 268 //emgPos1 =
jaccoton 0:53c4dbb10a17 269 //emgPos2 =
jaccoton 0:53c4dbb10a17 270
jaccoton 0:53c4dbb10a17 271
jaccoton 0:53c4dbb10a17 272 //pc.printf("%f \n \r",emgPos1);
jaccoton 0:53c4dbb10a17 273 /* Read EMDG values, apply some math */
jaccoton 0:53c4dbb10a17 274 /* to get useful setpoint value */
jaccoton 0:53c4dbb10a17 275 /*setpoint = ((ff)-0.2255)*1226.55;*/ /* SHOUDER kan van -23 tot 79 graden draaien*/
jaccoton 0:53c4dbb10a17 276
jaccoton 2:5f175018d1ff 277 setpoint = (potmeter.read()*-1226.55); //emgPos moet wel tussen 0 en 1 zitte?
jaccoton 2:5f175018d1ff 278 setpoint2 = (potmeter2.read()*-1226.55);
jaccoton 0:53c4dbb10a17 279 /*setpoint2 = (potmeter2.read())*1226,55; ELLEBOOG kan van 0 tot 102 graden draaien*/
jaccoton 0:53c4dbb10a17 280 //pc.printf("%f, %f \n \r",emgPos1, setpoint);
jaccoton 0:53c4dbb10a17 281 // Print setpoint and current position to serial terminal
jaccoton 0:53c4dbb10a17 282 //pc.printf("%f,%f,%f,%d \n \r",f,ff,emg_dir,motordir.read());
jaccoton 0:53c4dbb10a17 283 /*pc.printf("%f, %f \r\n", motor2.getSpeed(),f);*/
jaccoton 0:53c4dbb10a17 284 /*pc.printf(" %f, %d, %f, %d \n\r", setpoint, motor1.getPosition(), setpoint2, motor2.getPosition());*/
jaccoton 0:53c4dbb10a17 285 /*pc.printf("s: %f, %d \n\r", setpoint2, motor2.getPosition());*/
jaccoton 0:53c4dbb10a17 286
jaccoton 0:53c4dbb10a17 287 /*This is a P-action! calculate error, multiply with gain, and store in pwm_to_motor*/
jaccoton 0:53c4dbb10a17 288
jaccoton 0:53c4dbb10a17 289 /* De PID berekeningen*/
jaccoton 0:53c4dbb10a17 290 e = setpoint - motor1.getPosition();
jaccoton 0:53c4dbb10a17 291 up = kp*e;
jaccoton 0:53c4dbb10a17 292 ei = e*Ts + ei1;
jaccoton 0:53c4dbb10a17 293 ui = ki*ei;
jaccoton 2:5f175018d1ff 294 keep_in_range(&ui, -0.3,0.3);
jaccoton 0:53c4dbb10a17 295 ed = (e-e1)/Ts;
jaccoton 0:53c4dbb10a17 296 ud = ed*kd;
jaccoton 0:53c4dbb10a17 297 u = up + ui + ud;
jaccoton 0:53c4dbb10a17 298 /*pwm_to_motor = 0;*/
jaccoton 0:53c4dbb10a17 299 pwm_to_motor = u;
jaccoton 0:53c4dbb10a17 300
jaccoton 0:53c4dbb10a17 301 u1= u;
jaccoton 0:53c4dbb10a17 302 e1= e;
jaccoton 0:53c4dbb10a17 303 ei1 = ei;
jaccoton 0:53c4dbb10a17 304
jaccoton 0:53c4dbb10a17 305 /* Het is nu een PID actie geworden voor motor 2*/
jaccoton 0:53c4dbb10a17 306 e2 = setpoint2 - motor2.getPosition();
jaccoton 0:53c4dbb10a17 307 up2 = kp2*e2;
jaccoton 0:53c4dbb10a17 308 ei2 = e2*Ts + ei12;
jaccoton 0:53c4dbb10a17 309 ui2 = ki2*ei2;
jaccoton 2:5f175018d1ff 310 keep_in_range(&ui, -0.3,0.3);
jaccoton 0:53c4dbb10a17 311 ed2 = (e2-e12)/Ts;
jaccoton 0:53c4dbb10a17 312 ud2 = ed2*kd2;
jaccoton 0:53c4dbb10a17 313 u2 = up2 + ui2 + ud2;
jaccoton 0:53c4dbb10a17 314 /*u = (kp+ki*Ts)*e-kp*e1+u1;*/
jaccoton 0:53c4dbb10a17 315 pwm_to_motor2 = u2;
jaccoton 0:53c4dbb10a17 316 /*pwm_to_motor2 = 0;*/
jaccoton 0:53c4dbb10a17 317
jaccoton 0:53c4dbb10a17 318 u12= u2;
jaccoton 0:53c4dbb10a17 319 e12= e2;
jaccoton 0:53c4dbb10a17 320 ei12 = ei2;
jaccoton 0:53c4dbb10a17 321
jaccoton 0:53c4dbb10a17 322 //Make sure the PWM stays in range
jaccoton 0:53c4dbb10a17 323 keep_in_range(&pwm_to_motor, -1,1);
jaccoton 0:53c4dbb10a17 324 keep_in_range(&pwm_to_motor2, -1,1);
jaccoton 0:53c4dbb10a17 325
jaccoton 0:53c4dbb10a17 326 /* Control the motor direction pin. based on */
jaccoton 0:53c4dbb10a17 327 /* the sign of your pwm value. If your */
jaccoton 0:53c4dbb10a17 328 /* motor keeps spinning when running this code */
jaccoton 0:53c4dbb10a17 329 /* you probably need to swap the motor wires, */
jaccoton 0:53c4dbb10a17 330 /* or swap the 'write(1)' and 'write(0)' below */
jaccoton 0:53c4dbb10a17 331 if(pwm_to_motor > 0){ //if (pwm_to_motor > 0) emg_dir > 0{
jaccoton 0:53c4dbb10a17 332 motordir.write(1);
jaccoton 0:53c4dbb10a17 333 }
jaccoton 0:53c4dbb10a17 334 else{
jaccoton 0:53c4dbb10a17 335 motordir.write(0);
jaccoton 0:53c4dbb10a17 336 }
jaccoton 0:53c4dbb10a17 337
jaccoton 0:53c4dbb10a17 338 //WRITE VALUE TO MOTOR
jaccoton 0:53c4dbb10a17 339 /* Take the absolute value of the PWM to send */
jaccoton 0:53c4dbb10a17 340 /* to the motor. */
jaccoton 0:53c4dbb10a17 341 pwm_motor.write(abs(pwm_to_motor));//pwm_motor.write(0);
jaccoton 0:53c4dbb10a17 342
jaccoton 0:53c4dbb10a17 343 if(pwm_to_motor2 > 0){ //if (pwm_to_motor2 > 0)emg_dir2 > 0{
jaccoton 0:53c4dbb10a17 344 motordir2.write(1);
jaccoton 0:53c4dbb10a17 345 }
jaccoton 0:53c4dbb10a17 346 else{
jaccoton 0:53c4dbb10a17 347 motordir2.write(0);
jaccoton 0:53c4dbb10a17 348 }
jaccoton 0:53c4dbb10a17 349 //pwm_motor2.write(abs(pwm_to_motor2));
jaccoton 1:8fb04c532736 350 pwm_motor2.write(abs(pwm_to_motor2));
jaccoton 0:53c4dbb10a17 351 //pc.printf("f:%f, emg_dir:%f, setpoint:%f, u:%f, pwm_to_motor:%d, motordir:%d \n \r",f,emg_dir,setpoint,u,pwm_to_motor,motordir.read());
jaccoton 0:53c4dbb10a17 352 }
jaccoton 0:53c4dbb10a17 353 }
jaccoton 0:53c4dbb10a17 354
jaccoton 0:53c4dbb10a17 355
jaccoton 0:53c4dbb10a17 356 //coerces value 'in' to min or max when exceeding those values
jaccoton 0:53c4dbb10a17 357 //if you'd like to understand the statement below take a google for
jaccoton 0:53c4dbb10a17 358 //'ternary operators'.
jaccoton 0:53c4dbb10a17 359 void keep_in_range(float * in, float min, float max)
jaccoton 0:53c4dbb10a17 360 {
jaccoton 0:53c4dbb10a17 361 *in > min ? *in < max? : *in = max: *in = min;
jaccoton 0:53c4dbb10a17 362 }