PID问题请教。。。。。

[复制链接]
 楼主| 发表于 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倍的上一次误差,又加一倍的上上一次误差?
发表于 2025-7-12 10:39 | 显示全部楼层
增量式中的微分,其实是微分的微分,
当前微分=当前误差-上次误差;
上次微分=上次误差-上上次误差;
微分项目=D*(当前微分-上次微分)=你的式子
 楼主| 发表于 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) )

这样,是吧?

非常感谢~

点评

是的  发表于 2025-7-12 14:07
发表于 2025-7-13 09:18 | 显示全部楼层
markdown支持数学公式很有必要
@21ic小管家
发表于 2025-7-13 09:20 | 显示全部楼层
好像是这样的
发表于 2025-7-13 14:49 | 显示全部楼层
这个你先去学懂微积分就明白了,不想学就直接用别问
发表于 2025-7-13 21:21 | 显示全部楼层
直接用ai生成代码然后去调试最快
发表于 2025-7-14 09:15 | 显示全部楼层
这是增量式PID公式,绝对式PID好理解一些,我一般用绝对式PID几乎没用过增量式PID
 楼主| 发表于 2025-7-14 09:25 | 显示全部楼层
qinlu123 发表于 2025-7-14 09:15
这是增量式PID公式,绝对式PID好理解一些,我一般用绝对式PID几乎没用过增量式PID ...

啥样子的,麻烦指导指导呢
发表于 2025-7-14 09:35 | 显示全部楼层
[md]
medety 发表于 2025-7-14 09:25
啥样子的,麻烦指导指导呢


```
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;
        }
}
```

[/md]

点评

积分项采用增量式PID,比例和微分项采用绝对式PID  发表于 2025-7-14 09:37
 楼主| 发表于 2025-7-14 10:29 | 显示全部楼层

这个 也叫做位置式 ?
发表于 2025-7-14 10:41 | 显示全部楼层
medety 发表于 2025-7-14 10:29
这个 也叫做位置式 ?

 楼主| 发表于 2025-7-14 15:50 | 显示全部楼层

用起来啥区别

场合怎么区分用哪个?什么时候用起来一样,什么不一样‘?
发表于 2025-7-14 16:58 | 显示全部楼层
没啥区别
发表于 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参数调节参考!

发表于 2025-7-25 18:38 | 显示全部楼层
我两种都经常用,没有发现有太大的区别,包括参数。
从大的DCS、到小的PLC、单片机甚至上位机脚本,都常用。
一定是对某些参数或运算的意义发生了理解偏差。
发表于 2025-7-30 09:02 | 显示全部楼层
qinlu123 发表于 2025-7-14 09:15
这是增量式PID公式,绝对式PID好理解一些,我一般用绝对式PID几乎没用过增量式PID ...

两种有什么区别啊?
发表于 2025-7-31 07:53 | 显示全部楼层
hp860629 发表于 2025-7-30 09:02
两种有什么区别啊?

没区别
您需要登录后才可以回帖 登录 | 注册

本版积分规则

19

主题

120

帖子

0

粉丝
快速回复 返回顶部 返回列表