PID控制的struct PID 内的数据形式,正规的一般都用double。单片机编程的朋友习惯用unsigned,为了在单片机上使用,有些人改成了unsigned int,请注意,这里有个隐患:
LastError或PrevError计算后有时候会是负数。再说SumError是个累计偏差,当然必然是正偏差及负偏差累计呀。所以一定要用double或INT,绝对不能用unsigned int。你如果在网上荡下来的程序,请先看看这里有问题吗。我看到有问题的还不少。
以下是个典型的PID,再下面的是有错的PID 。
/****************************************************
正确
*****************************************************/
struct PID {
double SetPoint; // 设定目标 Desired Value
double Proportion; // 比例常数 Proportional Const
double Integral; // 积分常数 Integral Const
double Derivative; // 微分常数 Derivative Const
double LastError; // Error[-1]
double PrevError; // Error[-2]
double SumError; // Sums of Errors
} ;
/****************************************************
错误 !
*****************************************************/
struct PID {
unsigned int SetPoint; // 设定目标 Desired Value
unsigned int Proportion; // 比例常数 Proportional Const
unsigned int Integral; // 积分常数 Integral Const
unsigned int Derivative; // 微分常数 Derivative Const
unsigned int LastError; // Error[-1]
unsigned int PrevError; // Error[-2]
unsigned int SumError; // Sums of Errors
} ;
|