PID controller test code

Dependencies:   mbed Encoder HIDScope

Revision:
0:88e83d97a0ee
Child:
1:64ec36ba6e76
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Mon Oct 12 13:58:40 2015 +0000
@@ -0,0 +1,63 @@
+#include 'mbed.h'
+
+Ticker control_ticker;
+PwmOut pwm_motor1(D4); //onderste motor
+DigitalOut dir_motor1(D5);
+AnalogIn potmeter1(A4);
+
+// Sample time (motor1−timestep)
+const double m1_Ts = 0.01;
+// Controller gains (motor1−Kp,−Ki,...)
+const double m1_Kp = 2.5, m1_Ki = 1.0, m1_Kd = 0.5;
+double m1_err_int = 0, m1_prev_err = 0;
+// Derivative filter coeicients (motor1−filter−b0,−b1,...)
+const double m1_f_a1 = 1.0, m1_f_a2 = 2.0, m1_f_b0 = 1.0, m1_f_b1 = 3.0, m1_f_b2 = 4.0;
+// Filter variables (motor1−filter−v1,−v2)
+double m1_f_v1 = 0, m1_f_v2 = 0;
+
+// Biquad filter (See slide 14)
+double biquad( double u, double &v1, double &v2, const double a1, const double a2,
+               const double b0, const double b1, const double b2 )
+{
+    double v = u − a1∗v1 − a2∗v2;
+    double y = b0∗v + b1∗v1 + b2∗v2;
+    v2 = v1;
+    v1 = v;
+    return y;
+}
+
+// Reusable PID controller with filter
+double PID( double e, const double Kp, const double Ki, const double Kd, double Ts,
+            double &e_int, double &e_prev, double &f_v1, double &f_v2, const double f_a1,
+            const double f_a2, const double f_b0, const double f_b1, const double f_b3)
+{
+// Derivative
+    double e_der = (e − e_prev)/Ts;
+    e_der = biquad( e_der, f_v1, f_v2, f_a1, f_a2, f_b0, f_b1, f_b2 );
+    e_prev = e;
+// Integral
+    e_int = e_int + Ts ∗ e;
+// PID
+    return Kp ∗ e + Ki ∗ e_int + Kd ∗ e_der;
+}
+
+void m1_Controller()
+{
+    double reference = potmeter1.read();
+    double position = 0.002991∗encoder1.getPosition(); // Don’t use magic numbers!
+    motor1 = PID( reference − position, m1_Kp, m1_Ki, m1_Kd, m1_Ts, m1_err_int,
+                  m1_prev_err, m1_f_v1, m1_f_v2, m1_f_a1, m1_f_a2, m1_f_b0, m1_f_b1, m1_f_b2 );
+    if(motor1 > 0)
+        dir_motor1 = 0;
+    else
+        dir_motor1 = 1;
+
+    pwm_motor1.write(abs(motor1));
+} // Attach this function to a Ticker
+
+int main()
+{
+    control_ticker.attach(m1_Controller, 0.01);
+
+    while(1);
+}
\ No newline at end of file