MODSERIAL PID controller edit
Dependencies: HIDScope MODSERIAL QEI biquadFilter mbed
Fork of PID_controller_Motor by
main.cpp
- Committer:
- MBroek
- Date:
- 2016-10-17
- Revision:
- 6:e0857842e8cd
- Parent:
- 5:c510ab61af28
- Child:
- 7:435f984781ab
File content as of revision 6:e0857842e8cd:
// HET DEFINIEREN VAN ALLES ========================================================================================== // Includen van alle libraries --------------------------------------- #include "mbed.h" #include "MODSERIAL.h" #include "QEI.h" #include "math.h" #include "HIDScope.h" // Definieren van de HIDscope ---------------------------------------- HIDScope scope(1); // Definieren van de Serial en Encoder ------------------------------- MODSERIAL pc(USBTX, USBRX); #define SERIALBAUD 115200 QEI encoder_motor1(D10,D11,NC,64); QEI encoder_motor2(D12,D13,NC,64); // Definieren van de Motorpins --------------------------------------- DigitalOut motor1_direction_pin(D7); PwmOut motor1_speed_pin(D6); DigitalOut motor2_direction_pin(D4); PwmOut motor2_speed_pin(D5); //Definieren van bord-elementen -------------------------------------- InterruptIn kill_switch(D8); InterruptIn test_button(D9); AnalogIn pot1(A1); // Dit is de gesimuleerde emg1 AnalogIn pot2(A2); // Dit is de gesimuleerde emg2 //Definieren van de tickers ------------------------------------------ Ticker test_ticker; Ticker hidscope_ticker; // HET VASTSTELLEN VAN ALLE TE GEBRUIKEN VARIABELEN EN CONSTANTEN ====================================================== volatile bool safe = true; // Conditie voor de while-loop in main double position_motor1; int counts1; // Pulses van motoren int counts2; const double pi = 3.14159265358979323846264338327950288419716939937510; // pi const double rad_per_count = pi/8400.0; // Aantal rad per puls uit encoder const double meter_per_count = 1; // Het aantal meter dat het karretje aflegt per puls, DIT IS NOG ONBEKEND!!! double error1_int = 0.00000; // Initiele error integral waardes double error2_int = 0.00000; const double T_getpos = 0.01; // Periode van de frequentie van het aanroepen van de positiechecker (get_position) volatile bool flag1 = false, flag2 = false; // De flags voor de functies aangeroepen door de tickers const double Kp_1 = 1.0000000; // De PID variablen voor motor 1 const double Kd_1 = 1.0000000; const double Ki_1 = 1.0000000; const double vrijheid_m1_rad = 0.5*pi; // Dit is de uiterste postitie vd arm in radialen double reference_position_motor1 = 0.5*pi; // Dit is de eerste positie waar de motor heen wil, dit moet dezelfde zijn als de startpositie! double PID_output = 0; // De eerste PID_output, deze is nul anders gaan de motoren draaien double error_prev = 0; // De initiele previous error double error_int = 0; // De initiele intergral error // ALLE FUNCTIES BUITEN DE MAIN-LOOP ==================================================================================== // De emergency break ------------------------------------------------ void emergency_stop(){ safe = false; pc.printf("Emergency stop!!! Please reset your K64F board\r\n"); } // Functie voor het vinden van de positie van motor 1 --------------------- double get_position_m1(const double radpercount){ //returned de positie van de motor in radialen (positie vd arm in radialen) counts1 = encoder_motor1.getPulses(); // Leest aantal pulses uit encoder af return radpercount * counts1; // rekent positie motor1 uit en geeft deze als output vd functie } // Functie voor vinden van de positie van motor 2 ----------------------------- double get_position_m2(const double meterpercount){ // returned de positie van het karretje in meter 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 } // Functie voor het vinden van de reference position van motor 1 -------------------- double get_reference_position_m1(const double aantal_rad){ double ref_pos = pot1.read() - pot2.read(); // De reference position als output (zit tussen -1 en 1, -1 is maximaal links en 1 is maximaal rechts) return ref_pos * aantal_rad; // Aantal rad is de uiterste positie vd arm in radialen } // Functie voor het vinden van de reference position van motor 2 -------------------- double get_reference_position_m2(const double aantal_meter){ double ref_pos = pot1.read() - pot2.read(); // De reference position als output (zit tussen -1 en 1, -1 is maximaal links en 1 is maximaal rechts) return ref_pos * aantal_meter; // Aantal meter is hoeveelheid radialen van middelpunt tot minima. } // HIDScope functie ---------------------------------------------------------------------- void set_scope(double input){ scope.set(0, input); scope.send(); } // De PID-controller voor de motors ------------------------------------------------- double PID_controller(double ref_pos, double mot_pos, double &e_prev, double &e_int, const double Kp, const double Kd, const double Ki){ double error = ref_pos - mot_pos; // error uitrekenen double error_dif = (error-e_prev)/T_getpos; // De error differentieren //error_dif = ..... // Filter biquad poep e_prev = error; // Hier wordt de error opgeslagen voor de volgende keer e_int = e_int + T_getpos*error; // De error integreren return Kp*error + Ki*e_int + Kd*error_dif; // De uiteindelijke PID output } // Motor 1 besturen --------------------------------------------------------------------- void set_motor1(double motor_input){ // functie die de motor aanstuurt mt als input de PID-output if (motor_input >= 0){ // Dit checkt welke kant de motor op moet draaien motor1_direction_pin = 1; // Clockwise } else { motor1_direction_pin = 0; // CounterClockwise } if (fabs(motor_input)>1){ // Dit fixed de PwmOutput op maximaal 1 motor_input = 1; } motor1_speed_pin = fabs(motor_input); // Dit geeft de uiteindelijke input door aan de motor } // Motor 2 besturen --------------------------------------------------------------------- void set_motor2(double motor_input){ // functie die de motor aanstuurt mt als input de PID-output if (motor_input >= 0){ // Dit checkt welke kant de motor op moet draaien motor2_direction_pin = 1; // Clockwise } else { motor2_direction_pin = 0; // CounterClockwise } if (fabs(motor_input)>1){ // Dit fixed de PwmOutput op maximaal 1 motor_input = 1; } motor2_speed_pin = fabs(motor_input); // Dit geeft de uiteindelijke input door aan de motor } // De go-flag functies ----------------------------------------------------------------- void flag1_activate(){flag1=true;} // Activeert de flag void flag2_activate(){flag2=true;} // DE MAIN ================================================================================================================= int main() { pc.baud(SERIALBAUD); pc.printf("Starting"); //test_button.fall(&); // Activeert test button kill_switch.fall(&emergency_stop); // Activeert kill switch test_ticker.attach(&flag1_activate,0.1); // Activeert de go-flag van motor positie hidscope_ticker.attach(&flag2_activate,0.01); while(safe){ // Draait loop zolang alles veilig is. if (flag1){ flag1 = false; PID_output = PID_controller(get_reference_position_m1(vrijheid_m1_rad), get_position_m1(rad_per_count), error_prev, error_int, Kp_1, Kd_1, Ki_1); //pc.printf("%f\r\n",get_reference_position_m1); } if (flag2){ flag2 = false; set_scope(PID_output); } } motor1_speed_pin = 0; //Dit zet de motoren uit nadat de kill switch is gebruikt motor2_speed_pin = 0; }