PID控制的struct PID 内的数据形式的误区

2020-01-26 13:06发布

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

} ;

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
huanghb
1楼-- · 2020-01-26 15:44
更正:好像double 也不能是负数,怎么啦,我有搞错吗?
wangqun
2楼-- · 2020-01-26 18:18
 精彩回答 2  元偷偷看……
jz701209李
3楼-- · 2020-01-26 20:24
路过,看看            
marshallemon
4楼-- · 2020-01-27 00:16
增量式无需积分累加和
summarize
5楼-- · 2020-01-27 01:41
wangqun 发表于 2013-9-13 08:32
把unsigned int改为signed int就行了

+10086
+10086

一周热门 更多>