Working before header-files
Dependencies: Encoder FastPWM MODSERIAL Servo mbed
Fork of kinematics_control by
Revision 2:7e5ca3715fb6, committed 2017-10-26
- Comitter:
- DBerendsen
- Date:
- Thu Oct 26 08:19:53 2017 +0000
- Parent:
- 1:570c0d599b9e
- Commit message:
- Complete before header-files
Changed in this revision
FastPWM.lib | Show annotated file Show diff for this revision Revisions of this file |
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
diff -r 570c0d599b9e -r 7e5ca3715fb6 FastPWM.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/FastPWM.lib Thu Oct 26 08:19:53 2017 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/Sissors/code/FastPWM/#c0b2265cff9c
diff -r 570c0d599b9e -r 7e5ca3715fb6 main.cpp --- a/main.cpp Fri Oct 20 09:32:21 2017 +0000 +++ b/main.cpp Thu Oct 26 08:19:53 2017 +0000 @@ -2,7 +2,7 @@ #include "encoder.h" #include "Servo.h" #include "MODSERIAL.h" - +#include "FastPWM.h" @@ -14,7 +14,7 @@ Ticker MyControllerTicker1; Ticker MyControllerTicker2; const double RAD_PER_PULSE = 0.00074799825*2; -const float CONTROLLER_TS = 0.01; +const float CONTROLLER_TS = 0.02; const double PI = 3.14159265358979323846; //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ @@ -115,24 +115,54 @@ //------------------------------------------------------------------------------ +//------------------------------PID_Controller----------------------------------- +//------------------------------------------------------------------------------ + +double PID(float error, const float Kp, const float Ki, const float Kd, const float Ts, const float N, double &v1, double &v2) { + const double a1 = -4 / (N*Ts+2); + const double a2 = -(N*Ts-2) / ( N*Ts+2); + const double b0 = (4*Kp + 4*Kd*N +2*Ki*Ts + 2*Kp*N*Ts + Ki*N*pow(Ts,2)) / (2*N*Ts + 4); + const double b1 = (Ki*N*pow(Ts,2) - 4*Kp - 4*Kd*N) / (N*Ts + 2); + const double b2 = (4*Kp + 4*Kd*N - 2*Ki*Ts - 2*Kp*N*Ts + Ki*N*pow(Ts,2)) / (2*N*Ts + 4); + + double v = error - a1*v1 - a2*v2; + double u = b0*v + b1*v1 + b2*v2; + v2=v1; + v1=v; + return u; + +} + +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + + + + + +//------------------------------------------------------------------------------ //--------------------------------Motor1---------------------------------------- //------------------------------------------------------------------------------ -PwmOut motor1(D5); +FastPWM motor1(D5); DigitalOut motor1DirectionPin(D4); DigitalIn ENC2A(D12); DigitalIn ENC2B(D13); Encoder encoder1(D13,D12); -const float MOTOR1_KP = 50.0; -const float MOTOR1_KI = 30.0; -double m1_err_int = 0; +const float MOTOR1_KP = 40.0; +const float MOTOR1_KI = 0.0; +const float MOTOR1_KD = 15.0; +double M1_v1 = 0.0; +double M1_v2 = 0.0; const double motor1_gain = 2*PI; +const float M1_N = 0.5; void motor1_control(){ float reference_alpha = getreferencebeta(max_rangex, max_rangey, x_offset, y_offset, beta_offset, L1, L2); float position_alpha = RAD_PER_PULSE * encoder1.getPosition(); float error_alpha = reference_alpha-position_alpha; - float magnitude1 = PI_controller(error_alpha, MOTOR1_KP, MOTOR1_KI, CONTROLLER_TS, m1_err_int)/ motor1_gain; + float magnitude1 = PID(error_alpha, MOTOR1_KP, MOTOR1_KI, MOTOR1_KD, CONTROLLER_TS, M1_N, M1_v1, M1_v2) / motor1_gain; motor1 = fabs(magnitude1); pc.printf("err_a = %f alpha = %f mag1 = %f\r\n", error_alpha, reference_alpha, magnitude1); pc.printf("\r\n"); @@ -156,22 +186,26 @@ //------------------------------------------------------------------------------ //--------------------------------Motor2---------------------------------------- //------------------------------------------------------------------------------ -PwmOut motor2(D6); +FastPWM motor2(D6); DigitalOut motor2DirectionPin(D7); DigitalIn ENC1A(D10); DigitalIn ENC1B(D11); Encoder encoder2(D10,D11); -const float MOTOR2_KP = 50.0; -const float MOTOR2_KI = 30.0; +const float MOTOR2_KP = 60.0; +const float MOTOR2_KI = 0.0; +const float MOTOR2_KD = 15.0; double m2_err_int = 0; const double motor2_gain = 2*PI; +const float M2_N = 0.5; +double M2_v1 = 0.0; +double M2_v2 = 0.0; void motor2_control(){ float reference_beta = getreferencealpha(max_rangex, max_rangey, x_offset, y_offset, alpha_offset, L1, L2); float position_beta = RAD_PER_PULSE * -encoder2.getPosition(); float error_beta = reference_beta-position_beta; - float magnitude2 = PI_controller(error_beta, MOTOR2_KP, MOTOR2_KI, CONTROLLER_TS, m2_err_int)/ motor2_gain; + float magnitude2 = PID(error_beta, MOTOR2_KP, MOTOR2_KI, MOTOR2_KD, CONTROLLER_TS, M2_N, M1_v1, M1_v2) / motor2_gain; motor2 = fabs(magnitude2); pc.printf("err2 = %f beta = %f mag2 = %f\r\n", error_beta, reference_beta, magnitude2); pc.printf("\r\n"); @@ -193,8 +227,8 @@ int main(){ pc.baud(115200); - motor1.period(0.0002f); - motor2.period(0.0002f); + motor1.period(0.0001f); + motor2.period(0.0001f); MyControllerTicker1.attach(&motor1_control, CONTROLLER_TS); MyControllerTicker2.attach(&motor2_control, CONTROLLER_TS); But1.rise(&servo_control);