Ultimate Gain method
Dependents: 2016_slave_MD_rorikon 2016_slave_MD_rorikon WRS_mechanamu_test
PID.cpp
- Committer:
- sgrsn
- Date:
- 2018-11-14
- Revision:
- 5:6949e401a9ad
- Parent:
- 4:3ca1603fbcda
File content as of revision 5:6949e401a9ad:
#include "PID.h" PID::PID(Timer *T) { timer = T; integral = 0; prev_hensa = 0; nowtime = 0; prev_time = 0; lateD = 0; timer->start(); } float PID::controlPID(float target, float nowrpm) { nowtime = timer->read(); float hensa = target - nowrpm; float dt = nowtime - prev_time; integral += (hensa + prev_hensa) / 2 * dt; float differential = (hensa - prev_hensa) / dt; 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 = nowtime; return sousaryou; } float PID::PI_lateD(float target, float nowrpm) { 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(); lateD = (hensa - prev_hensa) / dt; return sousaryou; } float PID::controlP(float target, float nowrpm, float new_Kp) { float hensa = target - nowrpm; float sousaryou = new_Kp*hensa; return sousaryou; } float PID::controlPI(float target, float nowrpm) { 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(); return sousaryou; } 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; Kp = 0.60 * Ku; Ti = 0.50 * Pu; Td = 0.125 * Pu; 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(); }