In deze code vinden jullie een PIDregelaar en begrenzer!
Dependencies: Encoder HIDScope mbed
main.cpp
- Committer:
- phgbartels
- Date:
- 2014-10-29
- Revision:
- 0:16ee9fc421f8
File content as of revision 0:16ee9fc421f8:
#include "mbed.h" #include "encoder.h" #include "HIDScope.h" #include "PwmOut.h" /*definieren pinnen Motor 1*/ #define M1_PWM PTA5 #define M1_DIR PTA4 #define M2_PWM PTC8 #define M2_DIR PTC9 /*Definieren minimale waarden PWM per motor*/ #define PWM1_min_50 0.529 /*met koppelstuk!*/ #define PWM2_min_30 0.529 /*aanpassen! Klopt nog niet met koppelstuk*/ /*Definieren om de hoeveel seconden er gegevens naar de HID-scope gestuurd worden.*/ #define TSAMP 0.005 #define K_P (100) #define K_I (50 * TSAMP) #define K_D (1) //#define K_D (0.0005 /TSAMP) #define I_LIMIT 100. #define PI 3.1415926535897 #define lengte_arm 0.5 Encoder motor1(PTD3,PTD1, true); PwmOut pwm_motor1(M1_PWM); DigitalOut motordir1(M1_DIR); void clamp(float * in, float min, float max); float pid(float setpoint, float measurement); volatile bool looptimerflag; float PWM1_percentage = 0; int PWM2_percentage = 100; int aantal_rotaties_1 = 10; int aantalcr_1 = 1600; int aantalcr_2 = 960; int beginpos_motor1; int beginpos_motor1_new; int beginpos_motor2; int beginpos_motor2_new; uint16_t gewenste_snelheid = 2; uint16_t gewenste_snelheid_rad = 4; int previous_pos_motor1 = 0; int current_pos_motor1; float pos_motor1_rad; int delta_pos_motor1_puls; float delta_pos_motor1_rad; float snelheid_motor1_rad; float snelheid_arm_ms; float PWM1; float Speed_motor1; float Speed_motor1rad; void setlooptimerflag(void) //Ticker maakt een constructie die zoveel keer per seconde een functie uitvoerd, met sampingling freq TSAMP { looptimerflag = true; } int main() { motor1.setPosition(0); pwm_motor1.period_us(100); float setpoint; float prev_setpoint = 0; Ticker looptimer; looptimer.attach(setlooptimerflag,TSAMP); while(true) { while(!looptimerflag) //Hierdoor zeg je eigenlijk tegen je systeem; voer dit script uit na elke TSAMP s. { /*do nothing*/ //Zolang dit waar is, doe je niets. } looptimerflag = false; //clear flag current_pos_motor1 = motor1.getPosition(); //bekijk na elke 0.005s wat de huidige 'waarde' van de encoder is pos_motor1_rad = current_pos_motor1/(1600/(2*PI)); //echte waarde omrekenen naar rad voor (positie) PID regelaar //begrenzen van de hoek(in dit geval 90 graden) if (current_pos_motor1 >= 400) gewenste_snelheid_rad = 0; else setpoint = prev_setpoint + TSAMP * gewenste_snelheid_rad; PWM1_percentage = pid(setpoint, pos_motor1_rad); // zorgen dat PWM1_percentage niet buiten de range van 100% valt if (PWM1_percentage < -100) PWM1_percentage = -100; else if (PWM1_percentage >100) PWM1_percentage =100; else // bepalen van de richting if(PWM1_percentage < 0) motordir1 = 1; else motordir1 = 0; // ennnn uitsturen van PWM pwm_motor1.write(abs(((1-PWM1_min_50)/100)*PWM1_percentage + PWM1_min_50)); scope.set(5, abs(((1-PWM1_min_50)/100)*PWM1_percentage + PWM1_min_50)); prev_setpoint = setpoint; } } void clamp(float* in, float min, float max) // "*" is een pointer (verwijst naar het adres waar een variebele instaat). Dus je slaat niet de variabele op // maar de locatie van de variabele. { *in > min ? /*(*/*in < max? /*niets doen*/ : *in = max/*)*/: *in = min; // a ? b : c --> als a waar is, dan doe je b, en anders c // *in = het getal dat staat op locatie van in --> waarde van new_pwm } float pid(float setpoint, float measurement) { float error; static float prev_error = 0; float out_p = 0; static float out_i = 0; float out_d = 0; error = (setpoint-measurement); out_p = error*K_P; out_i += error*K_I; out_d = (error-prev_error)*K_D; clamp(&out_i,-I_LIMIT,I_LIMIT); prev_error = error; return out_p + out_i + out_d; }