Nahuel Manterola / Mbed 2 deprecated EMG_Controller_5

Dependencies:   HIDScope QEI biquadFilter mbed

Fork of EMG_Controller by Pascal van Baardwijk

Committer:
LeeJon
Date:
Tue Oct 25 11:13:13 2016 +0000
Revision:
5:bb77e2a6c1e8
Parent:
4:e59a99c5aa08
Child:
6:6cb7c0247560
om servo te testen

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 4:e59a99c5aa08 17 //Serial pc(USBTX,USBRX);
NahuelM 0:46582bba07d2 18 Ticker Controller;
NahuelM 0:46582bba07d2 19
NahuelM 4:e59a99c5aa08 20 //char Key;
NahuelM 1:83fccd7d8483 21 bool Controller_Flag=0;
NahuelM 4:e59a99c5aa08 22 //float Frequency = 30;
NahuelM 0:46582bba07d2 23 float Frequency_PWM = 10000;
NahuelM 1:83fccd7d8483 24
NahuelM 1:83fccd7d8483 25 float Slide_Radius = 12.5;
NahuelM 1:83fccd7d8483 26 float Slide_Multiplier = 1;
NahuelM 1:83fccd7d8483 27 float k1 = 1;
NahuelM 1:83fccd7d8483 28 float k2 = 0.02f;
NahuelM 1:83fccd7d8483 29 float k3 = 0.1f;
NahuelM 1:83fccd7d8483 30 float Start_slow = 40;
NahuelM 1:83fccd7d8483 31 float Start_lock = 0;
NahuelM 1:83fccd7d8483 32 float End_slow = 340;
NahuelM 1:83fccd7d8483 33 float End_lock = 380;
NahuelM 1:83fccd7d8483 34 float Slide_Counts;
NahuelM 1:83fccd7d8483 35 float Slide_Revolutions;
NahuelM 1:83fccd7d8483 36 float Slide_Angle;
NahuelM 1:83fccd7d8483 37 float Slide_Position;
NahuelM 0:46582bba07d2 38
NahuelM 1:83fccd7d8483 39 float Slide_Input_force = 0;
NahuelM 1:83fccd7d8483 40 float Slide_Curr_speed = 0;
NahuelM 1:83fccd7d8483 41 float Slide_Desired_speed;
NahuelM 1:83fccd7d8483 42 float Slide_Delta_speed;
NahuelM 1:83fccd7d8483 43 float Slide_Int_delta_speed;
NahuelM 1:83fccd7d8483 44 float Slide_Deriv_delta_speed = 0;
NahuelM 1:83fccd7d8483 45 float Slide_Prev_delta_speed = 0;
NahuelM 1:83fccd7d8483 46 float Slide_PI;
NahuelM 1:83fccd7d8483 47
NahuelM 1:83fccd7d8483 48 float Lift_Radius = 10;
NahuelM 1:83fccd7d8483 49 float Lift_Multiplier = 1;
NahuelM 1:83fccd7d8483 50 float Lift_k1 = 0.08;
NahuelM 1:83fccd7d8483 51 float Lift_k2 = 0.05;
NahuelM 1:83fccd7d8483 52 float Lift_k3 = 0.01;
NahuelM 1:83fccd7d8483 53 float Lift_Start = 0;
NahuelM 1:83fccd7d8483 54 float Lift_End = 50;
NahuelM 1:83fccd7d8483 55 float Lift_Counts;
NahuelM 1:83fccd7d8483 56 float Lift_Revolutions;
NahuelM 1:83fccd7d8483 57 float Lift_Angle;
NahuelM 1:83fccd7d8483 58 float Lift_Position;
NahuelM 1:83fccd7d8483 59
NahuelM 1:83fccd7d8483 60 float Lift_Input_force = 0;
NahuelM 1:83fccd7d8483 61 float Lift_Desired_position;
NahuelM 1:83fccd7d8483 62 float Lift_Delta_position;
NahuelM 1:83fccd7d8483 63 float Lift_Int_delta_position;
NahuelM 1:83fccd7d8483 64 float Lift_Deriv_delta_position = 0;
NahuelM 1:83fccd7d8483 65 float Lift_Prev_delta_position = 0;
NahuelM 1:83fccd7d8483 66 float Lift_PI;
NahuelM 0:46582bba07d2 67
NahuelM 0:46582bba07d2 68 void Slide_Controller();
NahuelM 1:83fccd7d8483 69 void Lift_Controller();
NahuelM 1:83fccd7d8483 70 void Ticker_Flag();
NahuelM 0:46582bba07d2 71
NahuelM 0:46582bba07d2 72 int main()
NahuelM 0:46582bba07d2 73 {
NahuelM 0:46582bba07d2 74 Motor1_pwm.period(1.0/Frequency_PWM);//T=1/f
NahuelM 1:83fccd7d8483 75 Motor2_pwm.period(1.0/Frequency_PWM);//T=1/f
NahuelM 1:83fccd7d8483 76 Controller.attach(&Ticker_Flag,1/Frequency);
NahuelM 0:46582bba07d2 77 pc.baud(9600);
NahuelM 2:57523bb4e9c6 78
NahuelM 3:1d43dd4f37eb 79
NahuelM 3:1d43dd4f37eb 80 Lift_Input_force = Potmeter.read();
NahuelM 3:1d43dd4f37eb 81 Slide_Input_force = Potmeter2.read();
NahuelM 3:1d43dd4f37eb 82
NahuelM 3:1d43dd4f37eb 83 notch_50.add( &bq1 ).add( &bq2 ).add( &bq3 );
NahuelM 3:1d43dd4f37eb 84 high_pass.add( &bq4 ).add( &bq5 );
NahuelM 3:1d43dd4f37eb 85
NahuelM 3:1d43dd4f37eb 86 change_state.attach( &calibrate,5);
NahuelM 3:1d43dd4f37eb 87 change_state2.attach( &run,10);
NahuelM 3:1d43dd4f37eb 88 emgSampleTicker.attach( &emgSample, 0.002);
NahuelM 3:1d43dd4f37eb 89
NahuelM 4:e59a99c5aa08 90 treshold = (cali_max-cali_min)*treshold_multiplier;
LeeJon 5:bb77e2a6c1e8 91 // servoTick.attach(&control_servo, 1/Frequency);
NahuelM 4:e59a99c5aa08 92 ServoPWMpin.period(0.01f); // 0.01 second period
NahuelM 4:e59a99c5aa08 93
NahuelM 0:46582bba07d2 94 while (true) {
NahuelM 3:1d43dd4f37eb 95 pc.printf("\n\r%f", Norm_EMG_0);
NahuelM 3:1d43dd4f37eb 96
NahuelM 3:1d43dd4f37eb 97 if (go_emgSample == true){
NahuelM 3:1d43dd4f37eb 98 EMG_filter();
NahuelM 3:1d43dd4f37eb 99 }
NahuelM 1:83fccd7d8483 100
NahuelM 1:83fccd7d8483 101 if (Controller_Flag == true){
NahuelM 1:83fccd7d8483 102 Slide_Controller();
NahuelM 1:83fccd7d8483 103 Lift_Controller();
LeeJon 5:bb77e2a6c1e8 104 control_servo(Norm_EMG_0);
NahuelM 4:e59a99c5aa08 105
NahuelM 2:57523bb4e9c6 106 Controller_Flag = false;
NahuelM 1:83fccd7d8483 107 }
NahuelM 3:1d43dd4f37eb 108
NahuelM 0:46582bba07d2 109 }
NahuelM 0:46582bba07d2 110 return 0;
NahuelM 0:46582bba07d2 111 }
LeeJon 5:bb77e2a6c1e8 112
NahuelM 1:83fccd7d8483 113 void Ticker_Flag(){
NahuelM 1:83fccd7d8483 114 Controller_Flag = true;
NahuelM 0:46582bba07d2 115 }
NahuelM 0:46582bba07d2 116
NahuelM 0:46582bba07d2 117 void Slide_Controller(){ // Dit ding moet keihard geloopt worden op minstens 30 Hz (Frequency)
NahuelM 2:57523bb4e9c6 118
NahuelM 2:57523bb4e9c6 119 Slide_Counts = Slide_Encoder.getPulses();
NahuelM 2:57523bb4e9c6 120 Slide_Revolutions = Slide_Counts /(32*131);
NahuelM 2:57523bb4e9c6 121 Slide_Angle = Slide_Revolutions*2*pi;
NahuelM 2:57523bb4e9c6 122 Slide_Position = Slide_Angle*Slide_Radius + 135;
NahuelM 2:57523bb4e9c6 123
NahuelM 3:1d43dd4f37eb 124 Slide_Desired_speed= (Norm_EMG_0*2 -1)*Slide_Multiplier;
NahuelM 1:83fccd7d8483 125
NahuelM 1:83fccd7d8483 126 if (Slide_Position < Start_slow && Slide_Desired_speed > 0){
NahuelM 1:83fccd7d8483 127 Slide_Desired_speed *= (Slide_Position-Start_lock)/(Start_slow-Start_lock);
NahuelM 1:83fccd7d8483 128
NahuelM 0:46582bba07d2 129 }
NahuelM 1:83fccd7d8483 130 if (Slide_Position > End_slow && Slide_Desired_speed < 0){
NahuelM 1:83fccd7d8483 131 Slide_Desired_speed *= (End_lock-Slide_Position)/(End_lock-End_slow);
NahuelM 0:46582bba07d2 132 }
NahuelM 1:83fccd7d8483 133 Slide_Prev_delta_speed = Slide_Delta_speed;
NahuelM 1:83fccd7d8483 134 Slide_Delta_speed = Slide_Desired_speed-Slide_Curr_speed; // P
NahuelM 1:83fccd7d8483 135 Slide_Int_delta_speed += Slide_Delta_speed/Frequency; // I
NahuelM 1:83fccd7d8483 136
NahuelM 1:83fccd7d8483 137 Slide_PI = k1*Slide_Delta_speed + k2*Slide_Int_delta_speed;
NahuelM 1:83fccd7d8483 138 if (Slide_PI<0){
NahuelM 1:83fccd7d8483 139 SlideMotor_Direction = 0;
NahuelM 1:83fccd7d8483 140 }else{
NahuelM 1:83fccd7d8483 141 SlideMotor_Direction = 1;
NahuelM 1:83fccd7d8483 142 }
NahuelM 1:83fccd7d8483 143
NahuelM 1:83fccd7d8483 144 Motor1_pwm.write(abs(Slide_PI));
NahuelM 1:83fccd7d8483 145 //return k1*Delta_speed + k2*Int_delta_speed;
NahuelM 1:83fccd7d8483 146 }
NahuelM 1:83fccd7d8483 147
NahuelM 1:83fccd7d8483 148 void Lift_Controller(){ // Dit ding moet keihard geloopt worden op minstens 30 Hz (Frequency)
NahuelM 1:83fccd7d8483 149
NahuelM 2:57523bb4e9c6 150 Lift_Counts = Lift_Encoder.getPulses();
NahuelM 2:57523bb4e9c6 151 Lift_Revolutions = Lift_Counts /(32*131);
NahuelM 2:57523bb4e9c6 152 Lift_Angle = Lift_Revolutions*2*pi;
NahuelM 2:57523bb4e9c6 153 Lift_Position = Lift_Angle*Lift_Radius;
NahuelM 2:57523bb4e9c6 154
NahuelM 2:57523bb4e9c6 155 Lift_Desired_position = (Lift_Input_force*2-1)*30*Lift_Multiplier;
NahuelM 3:1d43dd4f37eb 156 //pc.printf("\n\r%f - %f", Lift_Desired_position, Lift_Position);
NahuelM 1:83fccd7d8483 157 Lift_Prev_delta_position = Lift_Delta_position;
NahuelM 1:83fccd7d8483 158 Lift_Delta_position = Lift_Desired_position-Lift_Position; // P
NahuelM 1:83fccd7d8483 159 Lift_Int_delta_position += Lift_Delta_position/Frequency; // I
NahuelM 1:83fccd7d8483 160 Lift_Deriv_delta_position = (Lift_Delta_position-Lift_Prev_delta_position)*Frequency;
NahuelM 1:83fccd7d8483 161
NahuelM 1:83fccd7d8483 162 Lift_PI = Lift_k1*Lift_Delta_position + Lift_k2*Lift_Int_delta_position + Lift_k3*Lift_Deriv_delta_position;
NahuelM 1:83fccd7d8483 163 if (Lift_PI<0){
NahuelM 1:83fccd7d8483 164 LiftMotor_Direction = 1;
NahuelM 1:83fccd7d8483 165 }else{
NahuelM 1:83fccd7d8483 166 LiftMotor_Direction = 0;
NahuelM 1:83fccd7d8483 167 }
NahuelM 1:83fccd7d8483 168
NahuelM 1:83fccd7d8483 169 Motor2_pwm.write(abs(Lift_PI));
NahuelM 1:83fccd7d8483 170 //return k1*Delta_speed + k2*Int_delta_speed;
NahuelM 0:46582bba07d2 171 }