打印

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

[复制链接]
1536|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
huanghb|  楼主 | 2013-9-12 20:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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

} ;


相关帖子

沙发
受不了了| | 2013-9-12 21:27 | 只看该作者
pid计算可以不出现负数的,利用初中的数学知识就能解决

使用特权

评论回复
板凳
huanghb|  楼主 | 2013-9-13 01:27 | 只看该作者
更正:好像double 也不能是负数,怎么啦,我有搞错吗?

使用特权

评论回复
地板
huanghb|  楼主 | 2013-9-13 01:31 | 只看该作者
2楼说的没错,但是实际上好多朋友没有考虑到吧。

使用特权

评论回复
5
受不了了| | 2013-9-13 12:01 | 只看该作者
huanghb 发表于 2013-9-13 01:31
2楼说的没错,但是实际上好多朋友没有考虑到吧。

高中时我们老师常说,有些人考试时看见一道有点难度的题十分得意,心里想,这道题里有两个弯,同桌一定想不到,结果呢,分数下来发现自己才是没想到:lol

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

27

帖子

0

粉丝