first

Files at this revision

API Documentation at this revision

Comitter:
echo_piyo
Date:
Sun Sep 24 05:23:58 2017 +0000
Commit message:
????2??

Changed in this revision

pid.cpp Show annotated file Show diff for this revision Revisions of this file
pid.h Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r 4ecdddd912e2 pid.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pid.cpp	Sun Sep 24 05:23:58 2017 +0000
@@ -0,0 +1,62 @@
+#include "pid.h"
+
+void PositionPid::setup(float Kp, float Ki, float Kd, float dt){
+    kp = Kp;
+    ki = Ki;
+    kd = Kd;
+    time = dt;
+    frequency = 1/dt;
+}
+
+void PositionPid::calculate(float target, float nowValue){
+    old = now;
+    now = nowValue - target;
+    p = now;
+    i = i + (now + old)*0.5*time;
+    d = (now - old) * frequency;
+    result = kp*p + ki*i + kd*d;
+    if (result > 1.0f) {
+        result = 1.0f;
+    } else if (result < -1.0f) {
+        result = -1.0f;
+    }
+}
+
+float PositionPid::duty(){
+    return result;
+}
+
+float PositionPid::duty_enableWidth(float duty_min, float duty_max){
+    if(now > duty_min && now < duty_max){   //nowは差
+        return 0.0;
+    }else{
+        return result;
+    }
+}
+
+void SpeedPid::setup(float Kp, float Ki, float Kd, float dt){
+    kp = Kp;
+    ki = Ki;
+    kd = Kd;
+    time = dt;
+    frequency = 1/dt;
+}
+
+void SpeedPid::calculate(float target, float nowValue){
+    e2 = e1;
+    e1 = e;
+    e = nowValue - target;
+    p = e - e1;
+    i = e*time;
+    d = (e-2*e1+e2)*frequency;
+    result = result + (kp*p+ki*i+kd*d);
+    if (result > 1.0f) {
+        result = 1.0f;
+    } else if (result < -1.0f) {
+        result = -1.0f;
+    }
+}
+
+float SpeedPid::duty(){
+    return result;
+}
diff -r 000000000000 -r 4ecdddd912e2 pid.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pid.h	Sun Sep 24 05:23:58 2017 +0000
@@ -0,0 +1,62 @@
+/*********************************************
+PID library
+
+PositionPid : 位置型
+SpeedPid    : 速度型
+
+setup(float Kp, float Ki, float Kd, float dt)
+パラメータ、制御周期の設定
+Kp : Pゲイン
+Ki : Iゲイン
+Kd : Dゲイン
+dt : 制御周期[s]
+
+calculate(float target, float nowValue)
+PIDの計算をする
+target   : 目標値
+nowValue : 現在値
+
+duty()
+計算結果を-1~1で返す
+*********************************************/
+
+#ifndef MBED_PID_H
+#define MBED_PID_H
+
+#include "mbed.h"
+
+class PositionPid
+{
+public  :
+    void setup(float Kp, float Ki, float Kd, float dt);
+
+    void calculate(float target, float nowValue);
+
+    float duty();
+    
+    float duty_enableWidth(float duty_min, float duty_max);
+
+private :
+    float kp, ki, kd,
+          time, frequency,
+          old, now,
+          p, i, d, result;
+};
+
+class SpeedPid
+{
+public  :
+    void setup(float Kp, float Ki, float Kd, float dt);
+
+    void calculate(float target, float nowValue);
+
+    float duty();
+
+private :
+    float kp, ki, kd,
+          time, frequency,
+          e, e1, e2,
+          p, i, d, result;
+};
+
+#endif
\ No newline at end of file