Functie van het slaan van de bal

Dependencies:   Encoder HIDScope mbed-dsp mbed MODSERIAL

Committer:
BasvanBuuren
Date:
Wed Oct 29 16:21:19 2014 +0000
Revision:
14:e9ab81429271
Parent:
13:b35f3553f210
Hij doet het gewoon!
;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
BasvanBuuren 0:8af618dc161b 1 #include "mbed.h"
BasvanBuuren 0:8af618dc161b 2 #include "HIDScope.h"
BasvanBuuren 0:8af618dc161b 3 //#include "mbed-dsp.h"
BasvanBuuren 0:8af618dc161b 4 #include "encoder.h"
BasvanBuuren 14:e9ab81429271 5 //#include <iostream>
BasvanBuuren 14:e9ab81429271 6 #include "MODSERIAL.h"
BasvanBuuren 0:8af618dc161b 7
BasvanBuuren 6:3c4a2afb11e5 8 #define SAMP_TIME 0.01
BasvanBuuren 13:b35f3553f210 9 #define K_P (0.001)
BasvanBuuren 13:b35f3553f210 10 #define K_I (0.000001 *SAMP_TIME)
BasvanBuuren 13:b35f3553f210 11 #define K_D (0.000005 /SAMP_TIME)
BasvanBuuren 5:daf561abb67d 12 #define I_LIMIT 1.
BasvanBuuren 5:daf561abb67d 13
BasvanBuuren 13:b35f3553f210 14 #define MAXENCO 320
BasvanBuuren 0:8af618dc161b 15 #define MINENCO 0
BasvanBuuren 0:8af618dc161b 16
BasvanBuuren 5:daf561abb67d 17
BasvanBuuren 5:daf561abb67d 18 //define in and output
BasvanBuuren 14:e9ab81429271 19 MODSERIAL pc(USBTX,USBRX);
BasvanBuuren 0:8af618dc161b 20 Encoder encoderA(PTD0,PTD2);
BasvanBuuren 6:3c4a2afb11e5 21 PwmOut m1_speed(PTA5);
BasvanBuuren 0:8af618dc161b 22 DigitalOut m1_dir(PTA4);
BasvanBuuren 0:8af618dc161b 23
BasvanBuuren 5:daf561abb67d 24 //define functions
BasvanBuuren 13:b35f3553f210 25 void slam(int emg_value);
BasvanBuuren 5:daf561abb67d 26 void clamp(float * in, float min, float max);
BasvanBuuren 5:daf561abb67d 27 float pid(float rev_value, float mea_value);
BasvanBuuren 5:daf561abb67d 28
BasvanBuuren 5:daf561abb67d 29 //define global variables
BasvanBuuren 13:b35f3553f210 30 //int y1;
BasvanBuuren 9:65e998f810d1 31 float new_speed;
BasvanBuuren 9:65e998f810d1 32 float max_speed;
BasvanBuuren 9:65e998f810d1 33 float enca;
BasvanBuuren 13:b35f3553f210 34 volatile bool looptimerflag;
BasvanBuuren 13:b35f3553f210 35
BasvanBuuren 13:b35f3553f210 36 void setlooptimerflag(void)
BasvanBuuren 13:b35f3553f210 37 {
BasvanBuuren 13:b35f3553f210 38 looptimerflag = true;
BasvanBuuren 13:b35f3553f210 39 }
BasvanBuuren 0:8af618dc161b 40
BasvanBuuren 5:daf561abb67d 41 int main()
BasvanBuuren 5:daf561abb67d 42 {
BasvanBuuren 14:e9ab81429271 43
BasvanBuuren 13:b35f3553f210 44 int y1;
BasvanBuuren 13:b35f3553f210 45 Ticker looptimer;
BasvanBuuren 14:e9ab81429271 46 pc.baud(9600);
BasvanBuuren 13:b35f3553f210 47 looptimer.attach(setlooptimerflag,SAMP_TIME);
BasvanBuuren 5:daf561abb67d 48 while(1)
BasvanBuuren 14:e9ab81429271 49 {
BasvanBuuren 14:e9ab81429271 50 if(! pc.readable())
BasvanBuuren 14:e9ab81429271 51 {
BasvanBuuren 14:e9ab81429271 52 pc.printf("Main %d\n\r", encoderA.getPosition());
BasvanBuuren 14:e9ab81429271 53 wait(0.1);
BasvanBuuren 14:e9ab81429271 54 }
BasvanBuuren 14:e9ab81429271 55 else
BasvanBuuren 14:e9ab81429271 56 {
BasvanBuuren 14:e9ab81429271 57 y1 = pc.getc()-48;
BasvanBuuren 14:e9ab81429271 58 pc.printf("%d\n\r", y1 );
BasvanBuuren 14:e9ab81429271 59 slam(y1);
BasvanBuuren 14:e9ab81429271 60 }
BasvanBuuren 5:daf561abb67d 61 }
BasvanBuuren 5:daf561abb67d 62 }
BasvanBuuren 5:daf561abb67d 63
BasvanBuuren 13:b35f3553f210 64 void slam(int emg_value)
BasvanBuuren 0:8af618dc161b 65 {
BasvanBuuren 14:e9ab81429271 66 //pc.printf( "Ik begin met de slafunctie\n\r");
BasvanBuuren 14:e9ab81429271 67 //pc.printf( encoderA.getPosition() << endl << "check\n\r");
BasvanBuuren 14:e9ab81429271 68 pc.printf("Sla\n\r%d\n\r", encoderA.getPosition());
BasvanBuuren 13:b35f3553f210 69 switch (emg_value)
BasvanBuuren 6:3c4a2afb11e5 70 {
BasvanBuuren 6:3c4a2afb11e5 71 case 1:
BasvanBuuren 14:e9ab81429271 72 pc.printf( "zaak1\n\r");
BasvanBuuren 6:3c4a2afb11e5 73 m1_dir=1;
BasvanBuuren 6:3c4a2afb11e5 74 max_speed=0.33;
BasvanBuuren 12:5ea8de059fa1 75 //m1_speed.write(0.33);
BasvanBuuren 14:e9ab81429271 76 //pc.printf( "Motor 1 draait\n\r");
BasvanBuuren 7:36a7a7136be3 77 break;
BasvanBuuren 6:3c4a2afb11e5 78 case 2:
BasvanBuuren 14:e9ab81429271 79 pc.printf( "zaak2\n\r");
BasvanBuuren 6:3c4a2afb11e5 80 m1_dir=1;
BasvanBuuren 6:3c4a2afb11e5 81 max_speed=0.66;
BasvanBuuren 12:5ea8de059fa1 82 //m1_speed.write(0.66);
BasvanBuuren 14:e9ab81429271 83 pc.printf( "Motor 1 draait\n\r");
BasvanBuuren 7:36a7a7136be3 84 break;
BasvanBuuren 6:3c4a2afb11e5 85 case 3:
BasvanBuuren 14:e9ab81429271 86 pc.printf( "zaak3\n\r");
BasvanBuuren 6:3c4a2afb11e5 87 m1_dir=1;
BasvanBuuren 6:3c4a2afb11e5 88 max_speed=1;
BasvanBuuren 12:5ea8de059fa1 89 //m1_speed.write(1);
BasvanBuuren 14:e9ab81429271 90 pc.printf( "Motor 1 draait\n\r");
BasvanBuuren 7:36a7a7136be3 91 break;
BasvanBuuren 6:3c4a2afb11e5 92 default:
BasvanBuuren 6:3c4a2afb11e5 93 m1_dir=1;
BasvanBuuren 6:3c4a2afb11e5 94 m1_speed=0;
BasvanBuuren 7:36a7a7136be3 95 break;
BasvanBuuren 6:3c4a2afb11e5 96 }
BasvanBuuren 14:e9ab81429271 97 //pc.printf( "Ik ben uit de switch\n\r");
BasvanBuuren 13:b35f3553f210 98 while(!looptimerflag);
BasvanBuuren 13:b35f3553f210 99 looptimerflag=false;
BasvanBuuren 11:a9f4f296d7ed 100 new_speed=pid(MAXENCO,encoderA.getPosition());
BasvanBuuren 12:5ea8de059fa1 101 clamp(&new_speed,-max_speed,max_speed);
BasvanBuuren 12:5ea8de059fa1 102 if (new_speed>0)
BasvanBuuren 12:5ea8de059fa1 103 {
BasvanBuuren 12:5ea8de059fa1 104 m1_dir=1;
BasvanBuuren 12:5ea8de059fa1 105 }
BasvanBuuren 13:b35f3553f210 106 else if (new_speed<0)
BasvanBuuren 6:3c4a2afb11e5 107 {
BasvanBuuren 12:5ea8de059fa1 108 m1_dir=0;
BasvanBuuren 12:5ea8de059fa1 109 }
BasvanBuuren 12:5ea8de059fa1 110 m1_speed.write(fabs(new_speed));
BasvanBuuren 12:5ea8de059fa1 111
BasvanBuuren 12:5ea8de059fa1 112 while(new_speed<-0.1 || new_speed>0.1)
BasvanBuuren 12:5ea8de059fa1 113 {
BasvanBuuren 13:b35f3553f210 114 while(!looptimerflag);
BasvanBuuren 13:b35f3553f210 115 looptimerflag=false;
BasvanBuuren 14:e9ab81429271 116 //pc.printf( "Eat, Sleep, Rave, Repeat\n\r");
BasvanBuuren 6:3c4a2afb11e5 117 new_speed=pid(MAXENCO,encoderA.getPosition());
BasvanBuuren 6:3c4a2afb11e5 118 clamp(&new_speed,-max_speed,max_speed);
BasvanBuuren 6:3c4a2afb11e5 119 if (new_speed>0)
BasvanBuuren 6:3c4a2afb11e5 120 {
BasvanBuuren 6:3c4a2afb11e5 121 m1_dir=1;
BasvanBuuren 6:3c4a2afb11e5 122 }
BasvanBuuren 13:b35f3553f210 123 else if (new_speed<0)
BasvanBuuren 6:3c4a2afb11e5 124 {
BasvanBuuren 6:3c4a2afb11e5 125 m1_dir=0;
BasvanBuuren 6:3c4a2afb11e5 126 }
BasvanBuuren 6:3c4a2afb11e5 127 m1_speed.write(fabs(new_speed));
BasvanBuuren 14:e9ab81429271 128 //pc.printf( new_speed << endl;
BasvanBuuren 6:3c4a2afb11e5 129 }
BasvanBuuren 14:e9ab81429271 130 pc.printf( "Ik ben uit de eerste whilelus\n\r");
BasvanBuuren 14:e9ab81429271 131 //pc.printf( encoderA.getPosition() << endl << "check\n\r");
BasvanBuuren 14:e9ab81429271 132 pc.printf("%d\n\r", encoderA.getPosition());
BasvanBuuren 13:b35f3553f210 133 while(!looptimerflag);
BasvanBuuren 13:b35f3553f210 134 looptimerflag=false;
BasvanBuuren 11:a9f4f296d7ed 135 new_speed=pid(MINENCO,encoderA.getPosition());
BasvanBuuren 12:5ea8de059fa1 136 clamp(&new_speed,-max_speed,max_speed);
BasvanBuuren 12:5ea8de059fa1 137 if (new_speed>0)
BasvanBuuren 12:5ea8de059fa1 138 {
BasvanBuuren 12:5ea8de059fa1 139 m1_dir=1;
BasvanBuuren 12:5ea8de059fa1 140 }
BasvanBuuren 13:b35f3553f210 141 else if (new_speed<0)
BasvanBuuren 12:5ea8de059fa1 142 {
BasvanBuuren 12:5ea8de059fa1 143 m1_dir=0;
BasvanBuuren 12:5ea8de059fa1 144 }
BasvanBuuren 12:5ea8de059fa1 145 m1_speed.write(fabs(new_speed));
BasvanBuuren 12:5ea8de059fa1 146
BasvanBuuren 12:5ea8de059fa1 147 while(new_speed<-0.1 || new_speed>0.1)
BasvanBuuren 6:3c4a2afb11e5 148 {
BasvanBuuren 13:b35f3553f210 149 while(!looptimerflag);
BasvanBuuren 13:b35f3553f210 150 looptimerflag=false;
BasvanBuuren 6:3c4a2afb11e5 151 new_speed=pid(MINENCO,encoderA.getPosition());
BasvanBuuren 6:3c4a2afb11e5 152 clamp(&new_speed,-0.5,0.5);
BasvanBuuren 6:3c4a2afb11e5 153 if (new_speed>0)
BasvanBuuren 6:3c4a2afb11e5 154 {
BasvanBuuren 6:3c4a2afb11e5 155 m1_dir=1;
BasvanBuuren 6:3c4a2afb11e5 156 }
BasvanBuuren 13:b35f3553f210 157 else if (new_speed<0)
BasvanBuuren 6:3c4a2afb11e5 158 {
BasvanBuuren 6:3c4a2afb11e5 159 m1_dir=0;
BasvanBuuren 6:3c4a2afb11e5 160 }
BasvanBuuren 6:3c4a2afb11e5 161 m1_speed.write(fabs(new_speed));
BasvanBuuren 6:3c4a2afb11e5 162 }
BasvanBuuren 12:5ea8de059fa1 163 m1_speed.write(0);
BasvanBuuren 14:e9ab81429271 164 pc.printf( "Ik ben uit de tweede whilelus\n\r");
BasvanBuuren 14:e9ab81429271 165 //pc.printf( encoderA.getPosition() << endl << "check\n\r");
BasvanBuuren 14:e9ab81429271 166 pc.printf("%d\n\r", encoderA.getPosition());
BasvanBuuren 0:8af618dc161b 167 }
BasvanBuuren 0:8af618dc161b 168
BasvanBuuren 5:daf561abb67d 169 void clamp(float * in, float min, float max)
BasvanBuuren 5:daf561abb67d 170 {
BasvanBuuren 5:daf561abb67d 171 *in > min ? * in < max? : *in = max : *in = min;
BasvanBuuren 5:daf561abb67d 172 }
BasvanBuuren 5:daf561abb67d 173
BasvanBuuren 5:daf561abb67d 174 float pid(float rev_value, float mea_value)
BasvanBuuren 0:8af618dc161b 175 {
BasvanBuuren 5:daf561abb67d 176 float error;
BasvanBuuren 5:daf561abb67d 177 static float prev_error = 0;
BasvanBuuren 5:daf561abb67d 178 float p_out = 0;
BasvanBuuren 5:daf561abb67d 179 static float i_out = 0;
BasvanBuuren 5:daf561abb67d 180 float d_out = 0;
BasvanBuuren 5:daf561abb67d 181 error = rev_value - mea_value;
BasvanBuuren 5:daf561abb67d 182 p_out = error * K_P;
BasvanBuuren 5:daf561abb67d 183 i_out += error * K_I;
BasvanBuuren 5:daf561abb67d 184 d_out = (error - prev_error) * K_D;
BasvanBuuren 5:daf561abb67d 185 clamp(&i_out,-I_LIMIT,I_LIMIT);
BasvanBuuren 5:daf561abb67d 186 prev_error=error;
BasvanBuuren 5:daf561abb67d 187 return p_out + i_out + d_out;
BasvanBuuren 0:8af618dc161b 188 }