打印

PID问题请教。。。。。

[复制链接]
2601|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
medety|  楼主 | 2025-7-12 09:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 medety 于 2025-7-12 09:40 编辑

Δu(t)=K p (e(t)−e(t−1))     +    K i  e(t)    +    K d ( e(t) − 2e(t−1) + e(t−2) )

其中:

Δu(t)\Delta u(t)Δu(t) 是控制量的增量(即当前控制量与前一次控制量的差值)。
e(t)e(t)e(t)、e(t−1)e(t-1)e(t−1)、e(t−2)e(t-2)e(t−2) 分别是当前、前一次和前两次的误差。
————————————————

其中微分项目,为什么是D*(当前误差- 上一次误差 *2 + 上上一次误差 )  ??

为什么又是  当前误差  减 2倍的上一次误差,又加一倍的上上一次误差?

使用特权

评论回复
沙发
LcwSwust| | 2025-7-12 10:39 | 只看该作者
增量式中的微分,其实是微分的微分,
当前微分=当前误差-上次误差;
上次微分=上次误差-上上次误差;
微分项目=D*(当前微分-上次微分)=你的式子

使用特权

评论回复
板凳
medety|  楼主 | 2025-7-12 13:48 | 只看该作者
本帖最后由 medety 于 2025-7-12 15:45 编辑
LcwSwust 发表于 2025-7-12 10:39
增量式中的微分,其实是微分的微分,
当前微分=当前误差-上次误差;
上次微分=上次误差-上上次误差;


Kd (    (e(t) − e(t−1))    -   (    e(t−1))  -   e(t−2)  )    )
---->>>
K d ( e(t) − 2e(t−1) + e(t−2) )

这样,是吧?

非常感谢~

使用特权

评论回复
评论
LcwSwust 2025-7-12 14:07 回复TA
是的 
地板
keer_zu| | 2025-7-13 09:18 | 只看该作者
markdown支持数学公式很有必要
@21ic小管家

使用特权

评论回复
5
zjsx8192| | 2025-7-13 09:20 | 只看该作者
好像是这样的

使用特权

评论回复
6
zjk103| | 2025-7-13 14:49 | 只看该作者
这个你先去学懂微积分就明白了,不想学就直接用别问

使用特权

评论回复
7
LightCatcher| | 2025-7-13 21:21 | 只看该作者
直接用ai生成代码然后去调试最快

使用特权

评论回复
8
qinlu123| | 2025-7-14 09:15 | 只看该作者
这是增量式PID公式,绝对式PID好理解一些,我一般用绝对式PID几乎没用过增量式PID

使用特权

评论回复
9
medety|  楼主 | 2025-7-14 09:25 | 只看该作者
qinlu123 发表于 2025-7-14 09:15
这是增量式PID公式,绝对式PID好理解一些,我一般用绝对式PID几乎没用过增量式PID ...

啥样子的,麻烦指导指导呢

使用特权

评论回复
10
qinlu123| | 2025-7-14 09:35 | 只看该作者
struct PID_Value
{
    float Target;
    float FeedBack;
    float ErrNow,ErrLast;
    float K_P,K_I,K_D;
    float OUT_P,OUT_I,OUT_D;
    float OUT_I_MAX,OUT_I_MIN;
};
float Function_PID(struct PID_Value *PID)
{
    float Out;

    PID->ErrNow = PID->Target - PID->FeedBack;

    PID->OUT_P = PID->K_P * PID->ErrNow;
    PID->OUT_I += PID->K_I * PID->ErrNow;
    if(PID->OUT_I > PID->OUT_I_MAX)
    {
        PID->OUT_I = PID->OUT_I_MAX;
    }
    else if(PID->OUT_I < PID->OUT_I_MIN)
    {
        PID->OUT_I = PID->OUT_I_MIN;
    }
    PID->OUT_D = PID->K_D * (PID->ErrNow-PID->ErrLast);

    PID->ErrLast = PID->ErrNow;

    Out = PID->OUT_P + PID->OUT_I + PID->OUT_D;
    if(Out > PID->OUT_I_MAX)
    {
        return PID->OUT_I_MAX;
    }
    else if(Out < PID->OUT_I_MIN)
    {
        return PID->OUT_I_MIN;
    }
    else
    {
        return Out;
    }
}

使用特权

评论回复
评论
qinlu123 2025-7-14 09:37 回复TA
积分项采用增量式PID,比例和微分项采用绝对式PID 
11
medety|  楼主 | 2025-7-14 10:29 | 只看该作者

这个 也叫做位置式 ?

使用特权

评论回复
12
qinlu123| | 2025-7-14 10:41 | 只看该作者
medety 发表于 2025-7-14 10:29
这个 也叫做位置式 ?

使用特权

评论回复
13
medety|  楼主 | 2025-7-14 15:50 | 只看该作者

用起来啥区别

场合怎么区分用哪个?什么时候用起来一样,什么不一样‘?

使用特权

评论回复
14
qinlu123| | 2025-7-14 16:58 | 只看该作者
没啥区别

使用特权

评论回复
15
ColeYao| | 2025-7-15 10:28 | 只看该作者
本帖最后由 ColeYao 于 2025-7-16 07:47 编辑
medety 发表于 2025-7-14 15:50
用起来啥区别

场合怎么区分用哪个?什么时候用起来一样,什么不一样‘? ...

两种方式参数整定思路不一样,用增量式整定好的参数,运行位置式可能超调很大!  https://bbs.21ic.com/icview-3041654-1-1.html 这个帖子里面有个PID仿真软件,可以测试各种参数时加热系统输出的温控波形,供PID参数调节参考!

使用特权

评论回复
16
GlenX| | 2025-7-25 18:38 | 只看该作者
我两种都经常用,没有发现有太大的区别,包括参数。
从大的DCS、到小的PLC、单片机甚至上位机脚本,都常用。
一定是对某些参数或运算的意义发生了理解偏差。

使用特权

评论回复
17
hp860629| | 2025-7-30 09:02 | 只看该作者
qinlu123 发表于 2025-7-14 09:15
这是增量式PID公式,绝对式PID好理解一些,我一般用绝对式PID几乎没用过增量式PID ...

两种有什么区别啊?

使用特权

评论回复
18
qinlu123| | 2025-7-31 07:53 | 只看该作者
hp860629 发表于 2025-7-30 09:02
两种有什么区别啊?

没区别

使用特权

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

本版积分规则

19

主题

117

帖子

0

粉丝