pid
Fork of PID by
Revision 7:66e3f3fd08d8, committed 2016-08-07
- Comitter:
- kikoaac
- Date:
- Sun Aug 07 12:47:39 2016 +0000
- Parent:
- 6:775c9421fe3b
- Commit message:
- PID
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 |
--- a/PID.cpp Fri Oct 30 12:47:54 2015 +0000 +++ b/PID.cpp Sun Aug 07 12:47:39 2016 +0000 @@ -53,10 +53,14 @@ timer = p.timer; data = 0; bias=0; + + intF = false; + diffF = false; + propF = false; GAIN_P = p.GAIN_P; GAIN_I = p.GAIN_I; GAIN_D = p.GAIN_D; - setInterval(0.001); + setInterval(0.01); s_dErrIntg=0; dErr_prev=0;OutputLimits(1,0); } @@ -68,7 +72,7 @@ GAIN_P = tauKp; GAIN_I = tauKi; GAIN_D = tauKd; - setInterval(0.001); + setInterval(0.01); s_dErrIntg=0; dErr_prev=0;OutputLimits(1,0); } @@ -96,7 +100,7 @@ OutMax = max; OutSpan = OutMax - OutMin; } -void PID::setInterval(double inter) +void PID::setInterval(float inter) { interval = inter; //start(); @@ -104,7 +108,7 @@ void PID::start() { timer->start(); - //T.attach(this,&PID::PIDctrl,interval); + T.attach(this,&PID::PIDctrl,interval); //printf("PID statr\n"); //wait(0.1); //PIDctrl(); @@ -133,20 +137,24 @@ dErr = dTarget - dPoint; float T=gettime(); //printf("%f\t",T); - double dErrDiff = (dErr-data)/T; + double dErrDiff; // 誤差積分 - if(data>OutMax)s_dErrIntg=OutMax; - else if(data<OutMin)s_dErrIntg=OutMin; - else s_dErrIntg += (dErr+dErr_prev )* T /2.0; + /*if(GAIN_I*s_dErrIntg>OutMax)s_dErrIntg=GAIN_I*OutMax; + else if(GAIN_I*s_dErrIntg<OutMin)s_dErrIntg=GAIN_I*OutMin; + else */ + s_dErrIntg += (dErr+dErr_prev )* T /2.0; // 制御入力 - dRet = bias+GAIN_P * dErr + GAIN_I * s_dErrIntg + GAIN_D*dErrDiff; + dRet = bias + GAIN_P * (propF == true ? userProp : dErr) + + GAIN_I * (intF == true ? userInt : s_dErrIntg) - + GAIN_D * (diffF == true ? userDiff : dErrDiff); dErr_prev = dErr; + dErrDiff = (dErr-data)/T; if(dRet>OutMax)data=OutMax; else if(dRet<OutMin)data=OutMin; else data = dRet; - //printf("PID %f,%f,%f,%f,%f\r\n",data ,dErr,s_dErrIntg,dErrDiff,timer->read()); + //printf("PID %3.3f %3.3f %3.3f %3.3f %3.3f\r\n",data ,GAIN_P*dErr,GAIN_I*s_dErrIntg,GAIN_D*dErrDiff,T); }
--- a/PID.h Fri Oct 30 12:47:54 2015 +0000 +++ b/PID.h Sun Aug 07 12:47:39 2016 +0000 @@ -10,25 +10,34 @@ PID& operator=(const PID &p) { return *this; } +public: + void PIDctrl(); -public: void InputLimits(float max,float min); void OutputLimits(float max,float min); PID(float tauKc, float tauKi, float tauKd ,Timer *T); void setbias(float bias_){bias=bias_;} - double s_dErrIntg ,dErr_prev; + float s_dErrIntg ,dErr_prev; void start(); void pid_reset(); - void setInterval(double inter); + void setInterval(float inter); //Getters. void stop(); - double dTarget; - double dPoint; + float dTarget; + float dPoint; // PI制御ゲイン - double GAIN_P ;//1.5 // 比例ゲイン - double GAIN_I ;//2.8 // 積分ゲイン - double GAIN_D ;//0.2 - double data; + float GAIN_P ;//1.5 // 比例ゲイン + float GAIN_I ;//2.8 // 積分ゲイン + float GAIN_D ;//0.2 + float data; + double dErrDiff; + + float userInt; + float userDiff; + float userProp; + bool intF; + bool diffF; + bool propF; private: float bias; float OutMax; @@ -38,13 +47,13 @@ float OutSpan; float InSpan; Timer *timer; + float prev_time; float gettime() { - static float prev_time; float a = timer->read()-prev_time; prev_time=timer->read(); return a; } - //Ticker T; + Ticker T; float interval; };