T m_kd;
T m_clipMin;
T m_clipMax;
+ T m_integralClipMin;
+ T m_integralClipMax;
T m_prevDiff;
T m_sumDiff;
public:
//
T CalcControlValue(const T& diff);
void SetClip(const T& clipMin, const T& clipMax);
+ void SetIntegralClip(const T& clipMin, const T& clipMax);
+ void ResetPrevDiff();
};
template<class T>
PID<T>::PID(const T& kp, const T& ki, const T& kd)
- : m_kp(kp), m_ki(ki), m_kd(kd), m_clipMin(0), m_clipMax(-1), m_prevDiff(0), m_sumDiff(0)
+ : m_kp(kp), m_ki(ki), m_kd(kd),
+ m_clipMin(0), m_clipMax(-1), m_integralClipMin(0), m_integralClipMax(-1),
+ m_prevDiff(0), m_sumDiff(0)
{
}
m_sumDiff += diff;
m_prevDiff = diff;
+ if(m_integralClipMin <= m_integralClipMax){
+ if(m_sumDiff < m_integralClipMin){
+ m_sumDiff = m_integralClipMin;
+ }
+ if(m_integralClipMax < m_sumDiff){
+ m_sumDiff = m_integralClipMax;
+ }
+ }
+
if(m_clipMin <= m_clipMax){
if(val < m_clipMin){
val = m_clipMin;
m_clipMin = clipMin;
m_clipMax = clipMax;
}
+
+template<class T>
+void PID<T>::SetIntegralClip(const T& clipMin, const T& clipMax)
+{
+ m_integralClipMin = clipMin;
+ m_integralClipMax = clipMax;
+}
+
+template<class T>
+void PID<T>::ResetPrevDiff()
+{
+ m_prevDiff = 0;
+ m_sumDiff = 0;
+}