script uitleg

Dependencies:   Encoder MODSERIAL mbed

Committer:
jaccoton
Date:
Wed Nov 06 16:16:10 2013 +0000
Revision:
2:4ae32e8863d5
Parent:
1:5deb5092d487
Uitleg van het script

Who changed what in which revision?

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