Ultimate Gain method

Dependents:   2016_slave_MD_rorikon 2016_slave_MD_rorikon WRS_mechanamu_test

Revision:
5:6949e401a9ad
Parent:
4:3ca1603fbcda
--- a/PID.cpp	Fri Sep 30 12:31:16 2016 +0000
+++ b/PID.cpp	Wed Nov 14 02:20:07 2018 +0000
@@ -2,17 +2,17 @@
 
 PID::PID(Timer *T)
 {
-    timer = *T;
+    timer = T;
     integral    = 0;
     prev_hensa  = 0;
     nowtime     = 0;
     prev_time   = 0;
     lateD      = 0;
-    timer.start();
+    timer->start();
 }
-float PID::control(float target, float nowrpm)
+float PID::controlPID(float target, float nowrpm)
 {
-    nowtime = timer.read();
+    nowtime = timer->read();
     float hensa = target - nowrpm;
     float dt = nowtime - prev_time;
     integral += (hensa + prev_hensa) / 2 * dt;
@@ -20,43 +20,46 @@
     float sousaryou = Kp*hensa + Ki*integral + Kd*differential;
     //printf("%f %f %f\r\n", Kp*hensa, Ki*integral, Kd*differential);
     prev_hensa = hensa;
-    prev_time = timer.read();
+    prev_time = nowtime;
     return sousaryou;
 }
 float PID::PI_lateD(float target, float nowrpm)
 {
-    nowtime = timer.read();
+    nowtime = timer->read();
     float hensa = target - nowrpm;
     float dt = nowtime - prev_time;
     integral += (hensa + prev_hensa) / 2 * dt;
     float sousaryou = Kp*hensa + Ki*integral + Kd*lateD;
     prev_hensa = hensa;
-    prev_time = timer.read();
+    prev_time = timer->read();
     lateD = (hensa - prev_hensa) / dt;
     return sousaryou;
 }
-float PID::control_P(float target, float nowrpm, float new_Kp)
+float PID::controlP(float target, float nowrpm, float new_Kp)
 {
     float hensa = target - nowrpm;
     float sousaryou = new_Kp*hensa;
     return sousaryou;
 }
-float PID::control_PI(float target, float nowrpm)
+float PID::controlPI(float target, float nowrpm)
 {
-    Kp = 0.45 * Ku;
-    Ti = 0.83 * Pu;
-    Ki = (1 / Ti) * Kp;
-    nowtime = timer.read();
+    nowtime = timer->read();
     float hensa = target - nowrpm;
     float dt = nowtime - prev_time;
     integral += (hensa + prev_hensa) / 2 * dt;
     float sousaryou = Kp*hensa + Ki*integral;
     //printf("%f %f %f\r\n", Kp*hensa, Ki*integral, Kd*differential);
     prev_hensa = hensa;
-    prev_time = timer.read();
+    prev_time = timer->read();
     return sousaryou;
 }
-void PID::set_parameter(float new_Ku, float new_Pu)
+void PID::setParameter(float new_Kp, float new_Ki, float new_Kd)
+{
+    Kp = new_Kp;
+    Ki = new_Ki;
+    Kd = new_Kd;
+}
+void PID::setParameter(float new_Ku, float new_Pu)
 {  
     Ku = new_Ku;
     Pu = new_Pu;
@@ -67,9 +70,15 @@
     Ki = (1 / Ti) * Kp;
     Kd = Td * Kp;
 }
+void PID::setParameterPI(float new_Ku, float new_Pu)
+{
+    Kp = 0.45 * Ku;
+    Ti = 0.83 * Pu;
+    Ki = (1 / Ti) * Kp;
+}
 void PID::reset()
 {
     integral    = 0;
     prev_hensa  = 0;
-    prev_time = timer.read();
+    prev_time = timer->read();
 }