Script voor aansturen motoren

Dependencies:   Encoder HIDScope MODSERIAL mbed-dsp mbed

Committer:
jessekaiser
Date:
Thu Oct 30 12:18:56 2014 +0000
Revision:
21:c856b7752d7d
Parent:
19:3e46c457091c
Child:
22:22cb158bcea4
motor 1 werkt

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jessekaiser 0:d5d3b731340c 1 #include "mbed.h"
jessekaiser 0:d5d3b731340c 2 #include "encoder.h"
jessekaiser 0:d5d3b731340c 3 #include "HIDScope.h"
jessekaiser 19:3e46c457091c 4 #include "PwmOut.h"
jessekaiser 0:d5d3b731340c 5
jessekaiser 6:f260176f704b 6 #define TSAMP 0.005
jessekaiser 19:3e46c457091c 7 #define K_P (0.8)
jessekaiser 19:3e46c457091c 8 #define K_I (0.01 *TSAMP)
jessekaiser 0:d5d3b731340c 9 #define I_LIMIT 1.
jessekaiser 19:3e46c457091c 10 #define pwm1_min 0.06
jessekaiser 18:fb85c58a4106 11 #define pwm2_min 0
jessekaiser 18:fb85c58a4106 12 #define PI 3.14159265
jessekaiser 18:fb85c58a4106 13 #define l_arm 0.5
jessekaiser 0:d5d3b731340c 14
jessekaiser 7:697293226e5e 15 #define M1_PWM PTC8
jessekaiser 7:697293226e5e 16 #define M1_DIR PTC9
jessekaiser 7:697293226e5e 17 #define M2_PWM PTA5
jessekaiser 7:697293226e5e 18 #define M2_DIR PTA4
jessekaiser 7:697293226e5e 19
jessekaiser 7:697293226e5e 20 //Groene kabel moet op de GROUND en blauw op de 3.3v aansluiting
jessekaiser 0:d5d3b731340c 21
jessekaiser 3:dcc4cebba0d7 22 Serial pc(USBTX, USBRX);
jessekaiser 4:db3dad7e53e3 23 DigitalOut led1(LED_RED);
jessekaiser 5:e4b9cc904928 24 HIDScope scope(2);
jessekaiser 0:d5d3b731340c 25
jessekaiser 7:697293226e5e 26 //motor 25D
jessekaiser 7:697293226e5e 27 Encoder motor1(PTD3,PTD5); //wit, geel
jessekaiser 7:697293226e5e 28 PwmOut pwm_motor1(M2_PWM);
jessekaiser 7:697293226e5e 29 DigitalOut motordir1(M2_DIR);
jessekaiser 3:dcc4cebba0d7 30
jessekaiser 7:697293226e5e 31 //motor2 37D
jessekaiser 7:697293226e5e 32 Encoder motor2(PTD2, PTD0); //wit, geel
jessekaiser 7:697293226e5e 33 PwmOut pwm_motor2(M1_PWM);
jessekaiser 7:697293226e5e 34 DigitalOut motordir2(M1_DIR);
jessekaiser 18:fb85c58a4106 35 void clamp(float * in, float min, float max);
jessekaiser 18:fb85c58a4106 36 float pid(float setpoint, float measurement);
jessekaiser 18:fb85c58a4106 37 float pwm1_percentage = 0;
jessekaiser 18:fb85c58a4106 38 float pwm2_percentage = 0;
jessekaiser 18:fb85c58a4106 39 int cur_pos_motor1;
jessekaiser 18:fb85c58a4106 40 int prev_pos_motor1 = 0;
jessekaiser 18:fb85c58a4106 41 int cur_pos_motor2;
jessekaiser 18:fb85c58a4106 42 int prev_pos_motor2 = 0;
jessekaiser 18:fb85c58a4106 43 float speed1_rad;
jessekaiser 19:3e46c457091c 44 float speed2_rad;
jessekaiser 19:3e46c457091c 45 float pos_motor1_rad;
jessekaiser 19:3e46c457091c 46 float pos_motor2_rad;
jessekaiser 18:fb85c58a4106 47
jessekaiser 18:fb85c58a4106 48
jessekaiser 18:fb85c58a4106 49
jessekaiser 21:c856b7752d7d 50 /*
jessekaiser 18:fb85c58a4106 51 volatile bool looptimerflag;
jessekaiser 7:697293226e5e 52
jessekaiser 7:697293226e5e 53 bool flip=false;
jessekaiser 7:697293226e5e 54
jessekaiser 7:697293226e5e 55 void attime()
jessekaiser 0:d5d3b731340c 56 {
jessekaiser 7:697293226e5e 57 flip = !flip;
jessekaiser 0:d5d3b731340c 58 }
jessekaiser 0:d5d3b731340c 59
jessekaiser 7:697293226e5e 60 void looper()
jessekaiser 7:697293226e5e 61 {
jessekaiser 7:697293226e5e 62 motordir1=0;
jessekaiser 7:697293226e5e 63 pwm_motor1.write(1);
jessekaiser 7:697293226e5e 64 scope.set(0, motor1.getPosition());
jessekaiser 7:697293226e5e 65 scope.set(1, motor2.getPosition());
jessekaiser 7:697293226e5e 66 scope.send();
jessekaiser 21:c856b7752d7d 67 }*/
jessekaiser 21:c856b7752d7d 68
jessekaiser 21:c856b7752d7d 69 void clamp(float* in, float min, float max) // "*" is een pointer (verwijst naar het adres waar een variabele instaat). Dus je slaat niet de variabele op
jessekaiser 21:c856b7752d7d 70 // maar de locatie van de variabele.
jessekaiser 21:c856b7752d7d 71 {
jessekaiser 21:c856b7752d7d 72 *in > min ? /*(*/*in < max? /*niets doen*/ : *in = max/*)*/: *in = min; // a ? b : c --> als a waar is, dan doe je b, en anders c
jessekaiser 21:c856b7752d7d 73 // *in = het getal dat staat op locatie van in --> waarde van new_pwm
jessekaiser 7:697293226e5e 74 }
jessekaiser 3:dcc4cebba0d7 75
jessekaiser 3:dcc4cebba0d7 76
jessekaiser 21:c856b7752d7d 77 float pid(float setpoint, float cur_pos_motor1)
jessekaiser 21:c856b7752d7d 78 {
jessekaiser 21:c856b7752d7d 79 float error;
jessekaiser 21:c856b7752d7d 80 float out_p = 0;
jessekaiser 21:c856b7752d7d 81 static float out_i = 0;
jessekaiser 21:c856b7752d7d 82 error = (setpoint - cur_pos_motor1);
jessekaiser 21:c856b7752d7d 83 out_p = error*K_P;
jessekaiser 21:c856b7752d7d 84 out_i += error*K_I;
jessekaiser 21:c856b7752d7d 85 clamp(&out_i,-I_LIMIT,I_LIMIT);
jessekaiser 21:c856b7752d7d 86 return out_p + out_i;
jessekaiser 21:c856b7752d7d 87 }
jessekaiser 0:d5d3b731340c 88 int main()
jessekaiser 3:dcc4cebba0d7 89 {
jessekaiser 19:3e46c457091c 90 //Ticker log_timer;
jessekaiser 19:3e46c457091c 91 //log_timer.attach(looper, TSAMP);
jessekaiser 19:3e46c457091c 92 motor1.setPosition(0);
jessekaiser 19:3e46c457091c 93 pwm_motor1.period_us(100);
jessekaiser 19:3e46c457091c 94 float prev_setpoint = 0;
jessekaiser 19:3e46c457091c 95 float setpoint;
jessekaiser 21:c856b7752d7d 96 speed1_rad = 0.05;
jessekaiser 19:3e46c457091c 97
jessekaiser 18:fb85c58a4106 98
jessekaiser 0:d5d3b731340c 99 while(1) {
jessekaiser 6:f260176f704b 100
jessekaiser 19:3e46c457091c 101 cur_pos_motor1 = motor1.getPosition();
jessekaiser 19:3e46c457091c 102 pos_motor1_rad = cur_pos_motor1/(4128/(2*PI));
jessekaiser 19:3e46c457091c 103
jessekaiser 19:3e46c457091c 104 setpoint = prev_setpoint + TSAMP * speed1_rad;
jessekaiser 19:3e46c457091c 105 pwm1_percentage = pid(setpoint, pos_motor1_rad);
jessekaiser 19:3e46c457091c 106
jessekaiser 19:3e46c457091c 107 if (pwm1_percentage < -100) {
jessekaiser 19:3e46c457091c 108 pwm1_percentage = -100;
jessekaiser 19:3e46c457091c 109 }
jessekaiser 19:3e46c457091c 110 else if (pwm1_percentage >100){
jessekaiser 19:3e46c457091c 111 pwm1_percentage =100;
jessekaiser 19:3e46c457091c 112 }
jessekaiser 19:3e46c457091c 113
jessekaiser 19:3e46c457091c 114 if(pwm1_percentage < 0) {
jessekaiser 19:3e46c457091c 115 motordir1 = 1;
jessekaiser 19:3e46c457091c 116 }
jessekaiser 19:3e46c457091c 117 else {
jessekaiser 19:3e46c457091c 118 motordir1 = 0;
jessekaiser 19:3e46c457091c 119 }
jessekaiser 19:3e46c457091c 120
jessekaiser 21:c856b7752d7d 121 if(cur_pos_motor1 < 130) {
jessekaiser 21:c856b7752d7d 122 pwm_motor1.write(abs(pwm1_percentage/100));//(abs(((1-pwm1_min)/100)*pwm1_percentage + pwm1_min));
jessekaiser 19:3e46c457091c 123 prev_setpoint = setpoint;
jessekaiser 19:3e46c457091c 124 }
jessekaiser 19:3e46c457091c 125 else {
jessekaiser 19:3e46c457091c 126 pwm_motor1.write(0);
jessekaiser 19:3e46c457091c 127 }
jessekaiser 6:f260176f704b 128 }
jessekaiser 0:d5d3b731340c 129 }
jessekaiser 18:fb85c58a4106 130
jessekaiser 18:fb85c58a4106 131
jessekaiser 18:fb85c58a4106 132