MODSERIAL PID controller edit
Dependencies: HIDScope MODSERIAL QEI biquadFilter mbed
Fork of PID_controller_Motor by
Diff: main.cpp
- Revision:
- 23:3902ee714281
- Parent:
- 22:6dfe5554b96e
- Child:
- 24:ea6de9237cff
- Child:
- 26:2726db5acc03
--- a/main.cpp Tue Oct 25 12:03:43 2016 +0000 +++ b/main.cpp Tue Oct 25 13:51:57 2016 +0000 @@ -64,9 +64,11 @@ const double pi = 3.14159265358979323846264338327950288419716939937510; // pi const double rad_per_count = 2.0*pi/8400.0; // Aantal rad per puls uit encoder -const double radius_tandwiel = 1.0; +const double radius_tandwiel = 0.008; const double meter_per_count = rad_per_count * radius_tandwiel; // Het aantal meter dat het karretje aflegt per puls, DIT IS NOG ONBEKEND!!! +const double v_max_karretje = 8.4*radius_tandwiel; // Maximale snelheid karretje, gelimiteerd door de v_max vd motor + double error1_int = 0.00000; // Initiele error integral waardes double error2_int = 0.00000; @@ -78,15 +80,18 @@ const double Kd_1 = 0.0; const double Ki_1 = 0.0; -const double Kp_2 = 1.0000000; // De PID variablen voor motor 2 -const double Kd_2 = 0.1; -const double Ki_2 = 0.3; +const double Kp_2 = 1.0; // De PID variablen voor motor 2 +const double Kd_2 = 0.0; +const double Ki_2 = 0.0; const double vrijheid_m1_rad = 0.5*pi; // Dit is de uiterste postitie vd arm in radialen -const double vrijheid_m2_meter = 0.25; // Dit is de helft vd arm, dit is wat het karretje heen en weer kan bewegen +const double vrijheid_m2_meter = 0.5; // Dit is de helft vd arm, dit is wat het karretje heen en weer kan bewegen const double initial_pos_m1 = vrijheid_m1_rad; // Startin posities van de motoren -const double initial_pos_m2 = vrijheid_m2_meter; +const double initial_pos_m2 = 0; + +double position_motor2; +double position_motor2_prev = initial_pos_m2; double PID_output_1 = 0.0; // De eerste PID_output, deze is nul anders gaan de motoren draaien double PID_output_2 = 0.0; @@ -145,9 +150,13 @@ // Functie voor vinden van de positie van motor 2 ----------------------------- -double get_position_m2(const double meterpercount){ // returned de positie van het karretje in meter +double get_position_m2(const double meterpercount, double mot_pos_prev){ // returned de positie van het karretje in meter + double mot_pos; counts2 = encoder_motor2.getPulses(); // leest aantal pulses vd encoder af - return meterpercount * counts2; // rekent de positie van het karretje uit en geeft dit als output vd functie + mot_pos = meterpercount * counts2 + mot_pos_prev; + encoder_motor2.reset(); + mot_pos_prev = mot_pos; + return mot_pos_prev; // rekent de positie van het karretje uit en geeft dit als output vd functie } @@ -160,7 +169,7 @@ ref_pos = ref_pos_prev; break; case 1 : - ref_pos = ref_pos_prev + T_motor_function*vrijheid_rad; + ref_pos = ref_pos_prev + T_motor_function*vrijheid_rad; // Dit dwingt af dat de ref pos veranderd met ong 0.5 rad/s break; case -1 : ref_pos = ref_pos_prev - T_motor_function*vrijheid_rad; @@ -178,11 +187,30 @@ // Functie voor het vinden van de reference position van motor 2 -------------------- -double get_reference_position_m2(const double aantal_meter){ - double final_signal = EMG_sim1.read() - EMG_sim2.read(); // De reference position als output (zit tussen -1 en 1, -1 is maximaal links en 1 is maximaal rechts) - return final_signal * aantal_meter; // Aantal meter is hoeveelheid radialen van middelpunt tot minima. +double get_reference_position_m2(double &ref_pos_prev, const double vrijheid_meter){ + double ref_pos; + int final_signal = EMG_sim1.read() - EMG_sim2.read(); // Het uiteindelijke signaal uit de emg als output zit is -1, 0 of 1. + switch(final_signal){ + case 0 : + ref_pos = ref_pos_prev; + break; + case 1 : + ref_pos = ref_pos_prev + T_motor_function*v_max_karretje; // Hierdoor veranderd de ref_pos met de maximale snelheid vd motor (karretje) + break; + case -1 : + ref_pos = ref_pos_prev - T_motor_function*v_max_karretje; + break; + } + if(ref_pos >= vrijheid_meter){ + ref_pos = vrijheid_meter; + } + if(ref_pos <= 0){ + ref_pos = 0; + } + ref_pos_prev = ref_pos; + return ref_pos_prev; } - + // HIDScope functie ---------------------------------------------------------------------- void set_scope(double input1, double input2, double input3){ @@ -271,13 +299,16 @@ PID_output_2 = PID_controller(-reference_pos_m1, get_position_m1(rad_per_count), error_prev_1, error_int_1, Kp_1, Kd_1, Ki_1); // Zorgt er voor dat motor2 meedraait met motor1 set_motor1(PID_output_1); set_motor2(PID_output_2); + encoder_motor2.reset(); break; case motor2 : - reference_pos_m2 = get_reference_position_m2(vrijheid_m2_meter); - PID_output_2 = PID_controller(reference_pos_m2, get_position_m2(meter_per_count), error_prev_2, error_int_2, Kp_2, Kd_2, Ki_2); + reference_pos_m2 = get_reference_position_m2(ref_pos_prev_m2, vrijheid_m2_meter); + position_motor2 = get_position_m2(meter_per_count, position_motor2_prev); + PID_output_2 = PID_controller(reference_pos_m2, position_motor2, error_prev_2, error_int_2, Kp_2, Kd_2, Ki_2); PID_output_1 = PID_controller(reference_pos_m1, get_position_m1(rad_per_count), error_prev_1, error_int_1, Kp_1, Kd_1, Ki_1); // Zorgt ervoor dat motor1 op de dezelfde positie blijft als motor 2 draait. set_motor2(PID_output_2); set_motor1(PID_output_1); + position_motor2_prev = position_motor2; break; } } @@ -321,7 +352,7 @@ break; } - call_HIDscope(PID_output_1, reference_pos_m1, get_position_m1(meter_per_count)); + call_HIDscope(PID_output_2, reference_pos_m2, position_motor2); } }