/* ==================================================================================File name: PID_REG3.H (IQ version) =====================================================================================*/#ifndef __PIDREG3_H__#define __PIDREG3_H__typedef struct [ _iq Ref; // Input: Reference input _iq Fdb; // Input: Feedback input _iq Err; // Variable: Error _iq Kp; // Parameter: Propor
tional gain _iq Up; // Variable: Proportional output _iq Ui; // Variable: Integral output _iq Ud; // Variable: Derivative output _iq OutPreSat; // Variable: Pre-saturated output _iq OutMax; // Parameter: Maximum output _iq OutMin; // Parameter: Minimum output _iq Out; // Output: PID output _iq SatErr; // Variable: Saturated difference _iq Ki; // Parameter: Integral gain _iq Kc; // Parameter: Integral correction gain _iq Kd; // Parameter: Derivative gain _iq Up1; // History: Previous proportional output ] PIDREG3; typedef PIDREG3 *PIDREG3_handle;/*-----------------------------------------------------------------------------Default initalizer for the PIDREG3 object.-----------------------------------------------------------------------------*/ #define PIDREG3_DEFAULTS [ 0, 0, 0, _IQ(1.3), 0, 0, 0, 0, _IQ(1), _IQ(-1), 0, 0, _IQ(0.02), _IQ(0.5), _IQ(1.05), 0, ]/*------------------------------------------------------------------------------ PID Macro Definition------------------------------------------------------------------------------*/#define PID_REG3_MACRO(v) v.Err = v.Ref - v.Fdb; /* Compute the error */ v.Up= _IQmpy(v.Kp,v.Err); /* Compute the proportional output */ v.Ui= v.Ui + _IQmpy(v.Ki,v.Up) + _IQmpy(v.Kc,v.SatErr); /* Compute the integral output */ v.OutPreSat= v.Up + v.Ui; /* Compute the pre-saturated output */ v.Out = _IQsat(v.OutPreSat, v.OutMax, v.OutMin); /* Saturate the output */ v.SatErr = v.Out - v.OutPreSat; /* Compute the saturate difference */ v.Up1 = v.Up; /* Update the previous proportional output */#define PID_REG3_POS_MACRO(v) v.Err = v.Ref - v.Fdb; /* Compute the error */ if (v.Err >= _IQ(0.5)) v.Err -= _IQ(1.0); /* roll in the error */ else if (v.Err <= _IQ(-0.5)) v.Err += _IQ(1.0); /* roll in the error */ v.Up= _IQmpy(v.Kp,v.Err); /* Compute the proportional output */ v.Ui= v.Ui + _IQmpy(v.Ki,v.Up) + _IQmpy(v.Kc,v.SatErr); /* Compute the integral output */ v.Ud = _IQmpy(v.Kd,(v.Up - v.Up1)); v.OutPreSat= v.Up + v.Ui + v.Ud; /* Compute the pre-saturated output */ v.Out = _IQsat(v.OutPreSat, v.OutMax, v.OutMin); /* Saturate the output */ v.SatErr = v.Out - v.OutPreSat; /* Compute the saturate difference */ v.Up1 = v.Up;#endif // __PIDREG3_H__// Add the lines below if derivative output is needed following the integral update位置在ticontrolSUITElibsapp_libsmotor_controlmath_blocksv4.3/
在给出的文档中似乎没有对这个的说明(看大家用的这个,也打算用这个。把Kd设为0就是PI了吧)
1、Kc,积分校正增益,没明白是什么作用
2、这个是增量式
PID吗?
3、SatErr,饱和差,好像是v->SatErr = v->Out - v->OutPreSat;,但不知道什么用
4、v.Ui= v.Ui + _IQmpy(v.Ki,v.Up) + _IQmpy(v.Kc,v.SatErr);也即是// Compute the integral output
v->Ui = v->Ui +v->Ki*v->Up + v->Kc*v->SatErr;其中的v->Kc*v->SatErr;怎么理解啊,为什么加上v->Ki*v->Up + v->Kc*v->SatErr,加上当前误差乘以Ki不就可以了吗?
5、// Compute the derivative output
v->Ud = v->Kd*(v->Up - v->Up1);计算微分的时候为什么用的是比例输出。
6、_iq换成了float32, _IQ(1.3)换成1.3也可以吧。想换成浮点型的。
谢谢