sampleProgram

Dependencies:   QEI accelerator bit_test cyclic_io cyclic_var cylinder event_var limit mbed mecanum motor_drive pid pid_encoder rs422_put sbdbt servo

Fork of 17robo_fuzi by kusano kiyoshige

Revision:
10:04f2a82cfd89
Child:
31:285c9898da03
diff -r 6486f4b3ac50 -r 04f2a82cfd89 encorder.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/encorder.h	Sun Jul 16 04:06:49 2017 +0000
@@ -0,0 +1,143 @@
+#define PI      3.141592654f
+#define Nmax    18000
+#define invalidN    0.1
+
+class Position_pid_enc {
+public  :
+    void set_parameter(float Kp, float Ki, float Kd) {
+        kp = Kp;
+        ki = Ki;
+        kd = Kd;
+    }
+
+    void position_cal(float target, float nowval, float dt) {
+        old = now;
+        now = nowval - target;
+        p = now;
+        i = i + (now + old)/2.0f * dt;
+        d = (now - old) / dt;
+        result = kp*p + ki*i + kd*d;
+        if (result > 1.0f) {
+            result = 1.0f;
+        } else if (result < -1.0f) {
+            result = -1.0f;
+        }
+    }
+
+    float duty() {
+        return result;
+    }
+
+private :
+    float kp, ki, kd,
+          old, now,
+          p, i, d, result;
+};
+/*
+class Speed_pid
+{
+public:
+    void set_parameter(float Kp, float Ki, float Kd) {
+        kp = Kp;
+        ki = Ki;
+        kd = Kd;
+    }
+    
+    float duty(){
+        return result;
+    }
+    
+    float e,p,i,d;
+
+protected :
+    float kp,ki,kd;
+    float e1,e2;
+    //float p,i,d;
+    float result;
+    
+    void pid_cal(float target, float val, float dt){
+        e2 = e1;
+        e1 = e;
+        e = target - val;
+        p = e - e1;
+        i = e;
+        d = (e-2*e1+e2);
+        result = result + (kp*p+ki*i+kd*d);
+        if (result > 1.0f) {
+            result = 1.0f;
+        } else if (result < -1.0f) {
+            result = -1.0f;
+        }
+        if ((target == 0) && (fabs(e) < invalidN)) {
+            result = 0;
+        }
+    }  
+};
+*/
+class Encoder : public Position_pid_enc //: public Speed_pid
+{
+public:
+    Encoder (PinName A_Phase, PinName B_Phase) : A(A_Phase), B(B_Phase) {
+    }
+
+    void setup(int Ppr) {
+        ppr = Ppr;
+        A.rise(this, &Encoder::A_count);
+        B.rise(this, &Encoder::B_count);
+        origin();
+    }
+    
+    void cal(float target, float dt) {
+        radian = (float) count/ppr*2*PI;
+        degree = radian / PI * 180.0;         //
+        w = (radian - oldtheta) / dt;
+        v = 0.05*w/27;
+        n = w*30/(PI);
+        oldtheta = radian;
+        //pid_cal(target, n/Nmax, dt);
+        deg_cylinder_cal();                 //
+        position_cal(target, deg_cylinder, dt);
+    }
+    
+    void deg_cylinder_cal(){
+        deg_cylinder = (count / 1200) * 360 * 3 / 20;
+    }
+    
+    float deg(){
+        return degree;
+    }
+    
+    float rad() {
+        return radian;
+    }
+    
+    long pulse(){
+        return count;
+    }
+    
+    float N(){
+        return n;
+    }
+
+    void origin() {
+        count = 0;
+    }
+
+private :
+    InterruptIn A;
+    InterruptIn B;
+
+    int ppr;
+    signed long count;
+    float radian,oldtheta;
+    float w,v,n;
+    float degree, deg_cylinder;
+
+    void A_count() {
+        count ++;
+    }
+
+    void B_count() {
+        count --;
+    }
+};
\ No newline at end of file