Pascal van Baardwijk / Mbed 2 deprecated EMG_Controller_6

Dependencies:   HIDScope QEI biquadFilter mbed

Fork of EMG_Controller_5 by Nahuel Manterola

Committer:
pbaardwijk
Date:
Thu Oct 27 15:15:06 2016 +0000
Revision:
12:da003af4d373
Parent:
11:c8b6a2b314c3
Printf in code gefixt

Who changed what in which revision?

UserRevisionLine numberNew contents of line
NahuelM 0:46582bba07d2 1 #include "mbed.h"
NahuelM 0:46582bba07d2 2 #include "QEI.h"
NahuelM 3:1d43dd4f37eb 3
NahuelM 4:e59a99c5aa08 4 #include "servoController.h"
NahuelM 2:57523bb4e9c6 5 #include "emg.h"
NahuelM 2:57523bb4e9c6 6
NahuelM 1:83fccd7d8483 7 #define pi 3.14159265359;
NahuelM 0:46582bba07d2 8
NahuelM 0:46582bba07d2 9 PwmOut Motor1_pwm(D5);
NahuelM 1:83fccd7d8483 10 DigitalOut SlideMotor_Direction(D4);
NahuelM 1:83fccd7d8483 11 PwmOut Motor2_pwm(D6);
NahuelM 1:83fccd7d8483 12 DigitalOut LiftMotor_Direction(D7);
NahuelM 1:83fccd7d8483 13 AnalogIn Potmeter(A0);
NahuelM 2:57523bb4e9c6 14 AnalogIn Potmeter2(A1);
NahuelM 1:83fccd7d8483 15 QEI Slide_Encoder(D12,D13,NC,64);
NahuelM 1:83fccd7d8483 16 QEI Lift_Encoder(D10,D11,NC,64);
NahuelM 11:c8b6a2b314c3 17
pbaardwijk 12:da003af4d373 18 BiQuadChain extra;
pbaardwijk 12:da003af4d373 19 BiQuad bq0( 0.05852855368, 0.11705710736, 0.05852855368,-1.05207469728, 0.28586907478);
pbaardwijk 12:da003af4d373 20 BiQuad bq1( 0.06463239794, 0.12926479589, 0.06463239794,-1.16338171052, 0.42191097989);
pbaardwijk 12:da003af4d373 21 BiQuad bq2( 0.07902502847, 0.15805005694, 0.07902502847,-1.42439823874, 0.7409311811);
NahuelM 11:c8b6a2b314c3 22
NahuelM 4:e59a99c5aa08 23 //Serial pc(USBTX,USBRX);
NahuelM 0:46582bba07d2 24 Ticker Controller;
NahuelM 0:46582bba07d2 25
NahuelM 1:83fccd7d8483 26 bool Controller_Flag=0;
pbaardwijk 12:da003af4d373 27 const float Frequency = 30;
pbaardwijk 12:da003af4d373 28 const float Frequency_PWM = 10000;
NahuelM 1:83fccd7d8483 29
NahuelM 1:83fccd7d8483 30 float Slide_Radius = 12.5;
NahuelM 1:83fccd7d8483 31 float Slide_Multiplier = 1;
NahuelM 1:83fccd7d8483 32 float k1 = 1;
NahuelM 11:c8b6a2b314c3 33 float k2 = 0.01f;
NahuelM 1:83fccd7d8483 34 float k3 = 0.1f;
NahuelM 1:83fccd7d8483 35 float Start_slow = 40;
NahuelM 1:83fccd7d8483 36 float Start_lock = 0;
NahuelM 1:83fccd7d8483 37 float End_slow = 340;
NahuelM 1:83fccd7d8483 38 float End_lock = 380;
NahuelM 1:83fccd7d8483 39 float Slide_Counts;
NahuelM 1:83fccd7d8483 40 float Slide_Revolutions;
NahuelM 1:83fccd7d8483 41 float Slide_Angle;
NahuelM 1:83fccd7d8483 42 float Slide_Position;
NahuelM 0:46582bba07d2 43
NahuelM 1:83fccd7d8483 44 float Slide_Input_force = 0;
NahuelM 1:83fccd7d8483 45 float Slide_Curr_speed = 0;
NahuelM 1:83fccd7d8483 46 float Slide_Desired_speed;
NahuelM 1:83fccd7d8483 47 float Slide_Delta_speed;
NahuelM 1:83fccd7d8483 48 float Slide_Int_delta_speed;
NahuelM 1:83fccd7d8483 49 float Slide_Deriv_delta_speed = 0;
NahuelM 1:83fccd7d8483 50 float Slide_Prev_delta_speed = 0;
NahuelM 1:83fccd7d8483 51 float Slide_PI;
NahuelM 1:83fccd7d8483 52
NahuelM 1:83fccd7d8483 53 float Lift_Radius = 10;
NahuelM 1:83fccd7d8483 54 float Lift_Multiplier = 1;
NahuelM 11:c8b6a2b314c3 55 float Lift_k1 = 0.2;
NahuelM 1:83fccd7d8483 56 float Lift_k2 = 0.05;
NahuelM 1:83fccd7d8483 57 float Lift_k3 = 0.01;
NahuelM 1:83fccd7d8483 58 float Lift_Start = 0;
NahuelM 1:83fccd7d8483 59 float Lift_End = 50;
NahuelM 1:83fccd7d8483 60 float Lift_Counts;
NahuelM 1:83fccd7d8483 61 float Lift_Revolutions;
NahuelM 1:83fccd7d8483 62 float Lift_Angle;
NahuelM 1:83fccd7d8483 63 float Lift_Position;
NahuelM 1:83fccd7d8483 64
NahuelM 1:83fccd7d8483 65 float Lift_Input_force = 0;
NahuelM 1:83fccd7d8483 66 float Lift_Desired_position;
NahuelM 1:83fccd7d8483 67 float Lift_Delta_position;
NahuelM 1:83fccd7d8483 68 float Lift_Int_delta_position;
NahuelM 1:83fccd7d8483 69 float Lift_Deriv_delta_position = 0;
NahuelM 1:83fccd7d8483 70 float Lift_Prev_delta_position = 0;
NahuelM 1:83fccd7d8483 71 float Lift_PI;
NahuelM 0:46582bba07d2 72
pbaardwijk 12:da003af4d373 73 float NomNom;
pbaardwijk 12:da003af4d373 74
NahuelM 0:46582bba07d2 75 void Slide_Controller();
NahuelM 1:83fccd7d8483 76 void Lift_Controller();
NahuelM 1:83fccd7d8483 77 void Ticker_Flag();
NahuelM 0:46582bba07d2 78
NahuelM 0:46582bba07d2 79 int main()
NahuelM 0:46582bba07d2 80 {
NahuelM 0:46582bba07d2 81 Motor1_pwm.period(1.0/Frequency_PWM);//T=1/f
NahuelM 1:83fccd7d8483 82 Motor2_pwm.period(1.0/Frequency_PWM);//T=1/f
NahuelM 1:83fccd7d8483 83 Controller.attach(&Ticker_Flag,1/Frequency);
NahuelM 0:46582bba07d2 84 pc.baud(9600);
NahuelM 2:57523bb4e9c6 85
pbaardwijk 6:6cb7c0247560 86 led.write(1);
NahuelM 3:1d43dd4f37eb 87 Lift_Input_force = Potmeter.read();
NahuelM 3:1d43dd4f37eb 88 Slide_Input_force = Potmeter2.read();
NahuelM 3:1d43dd4f37eb 89
pbaardwijk 12:da003af4d373 90 extra.add( &bq0 ).add( &bq1 ).add( &bq2 );
pbaardwijk 9:1cb2d5ab51e6 91 notch_50.add( &bq3 ).add( &bq4 ).add( &bq5 );
pbaardwijk 9:1cb2d5ab51e6 92 high_pass.add( &bq6 ).add( &bq7 );
pbaardwijk 9:1cb2d5ab51e6 93 low_pass.add( &bq9 ).add( &bq10 ).add( &bq11 );
NahuelM 3:1d43dd4f37eb 94
NahuelM 11:c8b6a2b314c3 95 change_state.attach( &calibrate,1);
NahuelM 11:c8b6a2b314c3 96 change_state2.attach( &run,11);
pbaardwijk 9:1cb2d5ab51e6 97 emgSampleTicker.attach( &emgSample, 0.005); //200Hz
NahuelM 3:1d43dd4f37eb 98
LeeJon 7:eed677b636d3 99 // treshold = (cali_max-cali_min)*treshold_multiplier;
LeeJon 5:bb77e2a6c1e8 100 // servoTick.attach(&control_servo, 1/Frequency);
NahuelM 4:e59a99c5aa08 101 ServoPWMpin.period(0.01f); // 0.01 second period
NahuelM 4:e59a99c5aa08 102
NahuelM 0:46582bba07d2 103 while (true) {
pbaardwijk 6:6cb7c0247560 104 // pc.printf("\n\r%f", Norm_EMG_0);
NahuelM 3:1d43dd4f37eb 105
NahuelM 3:1d43dd4f37eb 106 if (go_emgSample == true){
NahuelM 3:1d43dd4f37eb 107 EMG_filter();
NahuelM 3:1d43dd4f37eb 108 }
NahuelM 1:83fccd7d8483 109
NahuelM 1:83fccd7d8483 110 if (Controller_Flag == true){
NahuelM 1:83fccd7d8483 111 Slide_Controller();
NahuelM 1:83fccd7d8483 112 Lift_Controller();
LeeJon 5:bb77e2a6c1e8 113 control_servo(Norm_EMG_0);
NahuelM 4:e59a99c5aa08 114
NahuelM 2:57523bb4e9c6 115 Controller_Flag = false;
NahuelM 1:83fccd7d8483 116 }
NahuelM 3:1d43dd4f37eb 117
NahuelM 0:46582bba07d2 118 }
NahuelM 0:46582bba07d2 119 return 0;
NahuelM 0:46582bba07d2 120 }
LeeJon 5:bb77e2a6c1e8 121
NahuelM 1:83fccd7d8483 122 void Ticker_Flag(){
NahuelM 1:83fccd7d8483 123 Controller_Flag = true;
NahuelM 0:46582bba07d2 124 }
NahuelM 0:46582bba07d2 125
NahuelM 0:46582bba07d2 126 void Slide_Controller(){ // Dit ding moet keihard geloopt worden op minstens 30 Hz (Frequency)
NahuelM 2:57523bb4e9c6 127
NahuelM 2:57523bb4e9c6 128 Slide_Counts = Slide_Encoder.getPulses();
NahuelM 2:57523bb4e9c6 129 Slide_Revolutions = Slide_Counts /(32*131);
NahuelM 2:57523bb4e9c6 130 Slide_Angle = Slide_Revolutions*2*pi;
NahuelM 2:57523bb4e9c6 131 Slide_Position = Slide_Angle*Slide_Radius + 135;
NahuelM 2:57523bb4e9c6 132
NahuelM 11:c8b6a2b314c3 133 Slide_Desired_speed= (-0)*Slide_Multiplier;
NahuelM 11:c8b6a2b314c3 134
NahuelM 11:c8b6a2b314c3 135
NahuelM 1:83fccd7d8483 136 if (Slide_Position < Start_slow && Slide_Desired_speed > 0){
NahuelM 1:83fccd7d8483 137 Slide_Desired_speed *= (Slide_Position-Start_lock)/(Start_slow-Start_lock);
NahuelM 1:83fccd7d8483 138
NahuelM 0:46582bba07d2 139 }
NahuelM 1:83fccd7d8483 140 if (Slide_Position > End_slow && Slide_Desired_speed < 0){
NahuelM 1:83fccd7d8483 141 Slide_Desired_speed *= (End_lock-Slide_Position)/(End_lock-End_slow);
NahuelM 0:46582bba07d2 142 }
NahuelM 11:c8b6a2b314c3 143
NahuelM 1:83fccd7d8483 144 Slide_Prev_delta_speed = Slide_Delta_speed;
NahuelM 1:83fccd7d8483 145 Slide_Delta_speed = Slide_Desired_speed-Slide_Curr_speed; // P
NahuelM 1:83fccd7d8483 146 Slide_Int_delta_speed += Slide_Delta_speed/Frequency; // I
NahuelM 11:c8b6a2b314c3 147 if (Slide_Int_delta_speed > 1){Slide_Int_delta_speed = 1;}
NahuelM 11:c8b6a2b314c3 148 if (Slide_Int_delta_speed < -1){Slide_Int_delta_speed = -1;}
NahuelM 11:c8b6a2b314c3 149 Slide_Int_delta_speed *= 1/1.3;
NahuelM 11:c8b6a2b314c3 150 //pc.printf("\r\n%f - %f", Slide_Int_delta_speed, Slide_Delta_speed);
NahuelM 11:c8b6a2b314c3 151 Slide_PI = k1*Slide_Delta_speed + 0*Slide_Int_delta_speed;
NahuelM 1:83fccd7d8483 152 if (Slide_PI<0){
NahuelM 1:83fccd7d8483 153 SlideMotor_Direction = 0;
NahuelM 1:83fccd7d8483 154 }else{
NahuelM 1:83fccd7d8483 155 SlideMotor_Direction = 1;
NahuelM 1:83fccd7d8483 156 }
NahuelM 1:83fccd7d8483 157
NahuelM 1:83fccd7d8483 158 Motor1_pwm.write(abs(Slide_PI));
NahuelM 1:83fccd7d8483 159 //return k1*Delta_speed + k2*Int_delta_speed;
NahuelM 1:83fccd7d8483 160 }
NahuelM 1:83fccd7d8483 161
NahuelM 1:83fccd7d8483 162 void Lift_Controller(){ // Dit ding moet keihard geloopt worden op minstens 30 Hz (Frequency)
NahuelM 1:83fccd7d8483 163
NahuelM 2:57523bb4e9c6 164 Lift_Counts = Lift_Encoder.getPulses();
NahuelM 2:57523bb4e9c6 165 Lift_Revolutions = Lift_Counts /(32*131);
NahuelM 2:57523bb4e9c6 166 Lift_Angle = Lift_Revolutions*2*pi;
NahuelM 2:57523bb4e9c6 167 Lift_Position = Lift_Angle*Lift_Radius;
pbaardwijk 12:da003af4d373 168
pbaardwijk 12:da003af4d373 169 NomNom = extra.step(Norm_EMG_0);
NahuelM 2:57523bb4e9c6 170
NahuelM 11:c8b6a2b314c3 171 Lift_Desired_position = (-NomNom)*40*Lift_Multiplier;
NahuelM 3:1d43dd4f37eb 172 //pc.printf("\n\r%f - %f", Lift_Desired_position, Lift_Position);
NahuelM 1:83fccd7d8483 173 Lift_Prev_delta_position = Lift_Delta_position;
NahuelM 1:83fccd7d8483 174 Lift_Delta_position = Lift_Desired_position-Lift_Position; // P
NahuelM 1:83fccd7d8483 175 Lift_Int_delta_position += Lift_Delta_position/Frequency; // I
NahuelM 1:83fccd7d8483 176
NahuelM 11:c8b6a2b314c3 177 Lift_Deriv_delta_position = (Lift_Delta_position-Lift_Prev_delta_position)*Frequency; //D
NahuelM 11:c8b6a2b314c3 178 if (Lift_Int_delta_position > 1){Lift_Int_delta_position = 1;}
NahuelM 11:c8b6a2b314c3 179 if (Lift_Int_delta_position < -1){Lift_Int_delta_position = -1;}
pbaardwijk 12:da003af4d373 180
pbaardwijk 12:da003af4d373 181 //fixed tha print
pbaardwijk 12:da003af4d373 182 pc.printf("%d, %d\r\n",Norm_EMG_0, NomNom);
NahuelM 11:c8b6a2b314c3 183 Lift_PI = Lift_k1*Lift_Delta_position + 0*Lift_Int_delta_position + Lift_k3*Lift_Deriv_delta_position;
NahuelM 1:83fccd7d8483 184 if (Lift_PI<0){
NahuelM 1:83fccd7d8483 185 LiftMotor_Direction = 1;
NahuelM 1:83fccd7d8483 186 }else{
NahuelM 1:83fccd7d8483 187 LiftMotor_Direction = 0;
NahuelM 1:83fccd7d8483 188 }
NahuelM 1:83fccd7d8483 189
NahuelM 1:83fccd7d8483 190 Motor2_pwm.write(abs(Lift_PI));
NahuelM 1:83fccd7d8483 191 //return k1*Delta_speed + k2*Int_delta_speed;
NahuelM 0:46582bba07d2 192 }