搜索
bottom↓
回复: 48

增量式PID参数整定的问题

[复制链接]

出0入42汤圆

发表于 2016-5-19 14:25:28 | 显示全部楼层 |阅读模式
我做温度控制用增量式PID,按照传统方法整定参数开始只加P,发现总达不到目标温度 分析 Ek-E(k-1)基本是负数啊,KP*( Ek-E(k-1))基本是负数,所以系统增量输出一直很小啊,这样传统调试方法 先调P让系统振荡不是有问题吗,只加P根本就到不了目标温度更不能振荡了,希望懂的大神能帮忙解答,小弟刚接触PID

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2016-5-19 14:51:30 | 显示全部楼层
本帖最后由 lcw_swust 于 2016-5-19 14:53 编辑

看来是Ek的符号搞反了
不过,Ek-E(k-1)基本是负数,说明误差在变化,就是温度在变呀,说明输出量还是有作用的.
不如把完整的程序弄上来

出0入0汤圆

发表于 2016-5-19 14:55:10 | 显示全部楼层
你监控一下设定、输出、反馈,看看是不是取反了

出0入42汤圆

 楼主| 发表于 2016-5-19 15:19:25 | 显示全部楼层
maqian 发表于 2016-5-19 14:55
你监控一下设定、输出、反馈,看看是不是取反了

假如有输出那么温度很定会升高 这样Ek肯定就小于E(k-1)那么 Kp*Ek-E(k-1)不就是负数吗 这时温度就会下降啊  那么前面一段时间温度都是波动的根本就上不去啊

出0入0汤圆

发表于 2016-5-19 15:25:19 | 显示全部楼层
你实际测测,温度是慢参,不会反应那么灵敏的

出0入42汤圆

 楼主| 发表于 2016-5-19 15:27:20 | 显示全部楼层
lcw_swust 发表于 2016-5-19 14:51
看来是Ek的符号搞反了
不过,Ek-E(k-1)基本是负数,说明误差在变化,就是温度在变呀,说明输出量还是有作用的.
...

u16 PIDCal(float currenttem)                    //ÔöÁ¿Ê½PID
{   
          
    float pError,dError,iError;
    float inc=0;
          pid.ThisError=pid.setpoint-currenttem;             //¼ÆË㵱ǰβî
    pError = pid.ThisError-pid.LastError;
    iError = pid.ThisError;
    dError = pid.ThisError-2*(pid.LastError)+pid.PreError;

    inc=pid.P*pError + pid.I*iError+pid.D*dError;  //ÔöÁ¿¼ÆËã
          delout=inc;
    pid.incout[1]=pid.incout[0]+inc;               //Êä³öµÈÓÚÉÏ´ÎÊä³ö¼ÓÉÏÔöÁ¿Êä³ö
          if( pid.incout[1]>4400)
                         pid.incout[1]=4400;
    pid.incout[0]=pid.incout[1];                      //´æ´¢ÉÏ´ÎÊä³ö

    pid.PreError  = pid.LastError;                                           //´æ´¢ÉϴκÍÉÏÉÏ´Îβî
    pid.LastError = pid.ThisError;

    return (u16)(pid.incout[1]);
}
这是我的增量式PID的计算部分 大神帮我看看有没有什么问题 之所以说Ek-E(k-1)基本是负数 是我觉得假如系统有输出那么温度升高 Ek肯定小于Ek-1不知是不是我的理解有误

出0入0汤圆

发表于 2016-5-19 16:06:39 | 显示全部楼层
本帖最后由 lcw_swust 于 2016-5-19 16:41 编辑
kangup2015 发表于 2016-5-19 15:27
u16 PIDCal(float currenttem)                    //ÔöÁ¿Ê½PID
{   
          


看PID的式子没问题,不过,这个地方:
if( pid.incout[1]>4400)
                         pid.incout[1]=4400;
后面应该还有一句
if(pid.incout[1]<...)pid.incout[1]=...

为了防止溢出,pid.incout应定义为有符号数.否则负数会变成很大的正数
你去这里55楼下载一个软件看看波形吧
看下设置温度\实测温度\输出量
http://www.amobbs.com/forum.php? ... p;page=1#pid7884238

出0入42汤圆

 楼主| 发表于 2016-5-19 16:20:04 | 显示全部楼层
lcw_swust 发表于 2016-5-19 16:06
看PID的式子没问题,不过,这个地方:
if( pid.incout[1]>4400)
                         pid.incout[1]=44 ...

你说的55楼是哪个地方啊没链接啊

出0入0汤圆

发表于 2016-5-19 16:30:31 | 显示全部楼层
给你一个文档,也是增量式PID的

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2016-5-19 16:30:49 | 显示全部楼层
kangup2015 发表于 2016-5-19 16:20
你说的55楼是哪个地方啊没链接啊

sorry
http://www.amobbs.com/forum.php? ... p;page=1#pid7884238

出0入0汤圆

发表于 2016-5-19 16:37:39 | 显示全部楼层
lcw_swust 发表于 2016-5-19 16:06
看PID的式子没问题,不过,这个地方:
if( pid.incout[1]>4400)
                         pid.incout[1]=44 ...

55楼在哪个帖子的?

出0入0汤圆

发表于 2016-5-19 16:42:25 | 显示全部楼层
arm 发表于 2016-5-19 16:37
55楼在哪个帖子的?

上面把链接加上了

出0入42汤圆

 楼主| 发表于 2016-5-19 16:58:47 | 显示全部楼层
lcw_swust 发表于 2016-5-19 16:42
上面把链接加上了

你这个软件我之前下载现在用的也是这个,了就是在那下的 挺好用的就是感觉坐标系跟实际数据有点对不上 看波形趋势还是不错的协议也不复杂

出0入0汤圆

发表于 2016-5-19 17:02:38 | 显示全部楼层
kangup2015 发表于 2016-5-19 16:58
你这个软件我之前下载现在用的也是这个,了就是在那下的 挺好用的就是感觉坐标系跟实际数据有点对不上 看 ...

嗯.,那就好,波形截个图看看

出0入42汤圆

 楼主| 发表于 2016-5-19 17:13:58 | 显示全部楼层
lcw_swust 发表于 2016-5-19 17:02
嗯.,那就好,波形截个图看看

这是没有用PID开关方式调节的波形

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2016-5-19 17:15:46 | 显示全部楼层
kangup2015 发表于 2016-5-19 17:13
这是没有用PID开关方式调节的波形

看起来还可以,能稳住

出0入0汤圆

发表于 2016-5-20 09:02:05 | 显示全部楼层
kangup2015 发表于 2016-5-19 17:13
这是没有用PID开关方式调节的波形

PID调节的波形有吗?

出0入42汤圆

 楼主| 发表于 2016-5-20 09:09:18 | 显示全部楼层
lcw_swust 发表于 2016-5-20 09:02
PID调节的波形有吗?

现在就是准备做PID但是增量式不是很懂,还在研究所以参数整定一直没做好也就没有出波形,兄台有没有参数整定的经验分享一下 我是交流斩波控制最大电压110V  温度在65度左右

出0入0汤圆

发表于 2016-5-20 09:48:07 | 显示全部楼层
kangup2015 发表于 2016-5-20 09:09
现在就是准备做PID但是增量式不是很懂,还在研究所以参数整定一直没做好也就没有出波形,兄台有没有参数 ...

不同的对象会有差异的,还是需要自己多试试才能掌握规律.
建议这样试:
1,暂定为1秒做一次PID.(如果系统温度对于控制量的反应较慢,或者说惯性大,则可将时间加大)
2,KI\KD置为0,KP从小调到大,看控制效果,看温度能否稳定在某一值(由于没有积分,此值不一定是设置值).
调试这个需要加入一点扰动才行,比如用烙铁去给温度传感器加热几秒钟,然后拿走烙铁,看最后温度能否稳定在某值.
KP太小则系统反应慢,KP太大则易振荡,取到反应较快而又不振荡就好.
3,KI从小调到大,只要不引起太大的过冲或振荡就好.
4,KD的作用类似于"阻尼",可以抑制温度变化,也能抑制振荡,将它从小调到大.
KD不要取太大,它的"阻尼"作用会使得系统久久达不到设定温度.

出0入42汤圆

 楼主| 发表于 2016-5-20 10:05:55 | 显示全部楼层
lcw_swust 发表于 2016-5-20 09:48
不同的对象会有差异的,还是需要自己多试试才能掌握规律.
建议这样试:
1,暂定为1秒做一次PID.(如果系统温 ...

谢谢你的耐心解答 我先试试待会上波形

出100入101汤圆

发表于 2016-5-20 10:34:47 | 显示全部楼层
kangup2015 发表于 2016-5-19 17:13
这是没有用PID开关方式调节的波形

这是一起截图?还是用的什么软件?

出0入42汤圆

 楼主| 发表于 2016-5-20 13:39:30 | 显示全部楼层
fengyunyu 发表于 2016-5-20 10:34
这是一起截图?还是用的什么软件?

两个图是单独的截图,分别上传的

出0入42汤圆

 楼主| 发表于 2016-5-20 15:01:33 | 显示全部楼层
lcw_swust 发表于 2016-5-20 09:48
不同的对象会有差异的,还是需要自己多试试才能掌握规律.
建议这样试:
1,暂定为1秒做一次PID.(如果系统温 ...

大神做过积分分离吗,我现在做PI输出饱和了到目标温度后还在一直上升,看网上大家讨论有积分分离的方法,我现在也加了在温差为3度的时候去掉积分采用PD但感觉作用不是很明显啊

出0入0汤圆

发表于 2016-5-20 15:35:24 | 显示全部楼层
kangup2015 发表于 2016-5-20 15:01
大神做过积分分离吗,我现在做PI输出饱和了到目标温度后还在一直上升,看网上大家讨论有积分分离的方法, ...

有波形图吗?
加大KP\KD试试,KI尽量小
积分分离估计要用位置式PID
我认为还是参数的问题

出100入101汤圆

发表于 2016-5-20 15:37:56 | 显示全部楼层
kangup2015 发表于 2016-5-20 13:39
两个图是单独的截图,分别上传的

笔误。这是仪器上截的图?还是用的什么仿真软件?

出0入42汤圆

 楼主| 发表于 2016-5-20 15:46:20 | 显示全部楼层
fengyunyu 发表于 2016-5-20 15:37
笔误。这是仪器上截的图?还是用的什么仿真软件?

上面有链接 一款虚拟示波器

出0入42汤圆

 楼主| 发表于 2016-5-20 15:51:09 | 显示全部楼层
lcw_swust 发表于 2016-5-20 15:35
有波形图吗?
加大KP\KD试试,KI尽量小
积分分离估计要用位置式PID

输出饱和时 在温差为3度时我强制拉低了输出,到达目标温度后 稳定了一段时间 但是还是在缓慢上升虽然 很缓慢, 温差三度以上 P=20   i=6   D=0 三度内 P=20 D =5 I=0 下面是截图帮我分析下啊

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2016-5-20 16:01:33 | 显示全部楼层
kangup2015 发表于 2016-5-20 15:51
输出饱和时 在温差为3度时我强制拉低了输出,到达目标温度后 稳定了一段时间 但是还是在缓慢上升虽然 很 ...


看样子,极有可能是误差的符号搞反了.
KI若为0,系统应当是个负反馈,输出量应与温度反相.
也就是说,温度上升,输出应减小.
看样子,你没有仔细做我说的第2步

出0入42汤圆

 楼主| 发表于 2016-5-20 17:21:20 | 显示全部楼层
lcw_swust 发表于 2016-5-20 16:01
看样子,极有可能是误差的符号搞反了.
KI若为0,系统应当是个负反馈,输出量应与温度反相.
也就是说,温度上 ...

没错我仿真看到的也是那样的数据但是去掉I,靠PD能引起的输出减小量实在是不明显啊 我观察系统对输入的响应滞后了5分钟的样子 那我的调节周期是不是应该也是5分钟啊

出0入0汤圆

发表于 2016-5-20 20:28:50 | 显示全部楼层
kangup2015 发表于 2016-5-20 17:21
没错我仿真看到的也是那样的数据但是去掉I,靠PD能引起的输出减小量实在是不明显啊 我观察系统对输入的响 ...

把你的工程打包发上来我帮你瞧瞧

出0入42汤圆

 楼主| 发表于 2016-5-21 09:48:25 | 显示全部楼层
lcw_swust 发表于 2016-5-20 20:28
把你的工程打包发上来我帮你瞧瞧

附件是我的工程文件 PID部分只是简单的写了 麻烦帮我看看思路对不对 万分感谢

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2016-5-21 22:13:16 | 显示全部楼层

我的修改:
(涉及文件main.c,Tem_PID.h,Tem_PID.c)
main中尽量精简
nearT被去掉,需要的话自行添加
PID定义中setpoint改为s16
PID计算中对输出最小值限幅
改变控制周期为1秒
PID参数有改动
(原参数过小,对输出的影响太小)

我这里编译未通过,有很多重复定义,估计是编译器设置的问题,我就懒得去深究了,你试试看.

出0入0汤圆

发表于 2016-5-21 22:16:44 | 显示全部楼层

不知道是电脑问题还是论坛问题,不能回复,也不能编辑帖子

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2016-5-21 22:35:12 来自手机 | 显示全部楼层
需要经验

出0入42汤圆

 楼主| 发表于 2016-5-22 18:42:41 | 显示全部楼层
lcw_swust 发表于 2016-5-21 22:13
我的修改:
(涉及文件main.c,Tem_PID.h,Tem_PID.c)
main中尽量精简

我想问一下这个控周期制的设置有讲究吗 网上有说法是最大功率加热所需时间除10就是控制周期

出0入42汤圆

 楼主| 发表于 2016-5-22 18:44:30 | 显示全部楼层
lcw_swust 发表于 2016-5-21 22:16
不知道是电脑问题还是论坛问题,不能回复,也不能编辑帖子

非常感谢你的帮助,论坛确实不错好人很多

出0入0汤圆

发表于 2018-10-22 20:18:24 | 显示全部楼层
好吧,虽然这时很久之前的帖子,但是我还是想回。增量式pid的公式(Kp*e[k]-e[k-1]) + Ki*e[k] + Kd*(e[k]-2e[k-1]+e[k-2]) ,里面的Kp项是误差变化率,Ki项是误差,Kd项是变化率的变化率。如果按照教科书上说的,先关闭Ki、Kd,另Kp起作用,那可真是靠运气了!这时候计时存在误差,温度没有变化,pid是不会有输出的。应该反过来,先让Kp=Kd=0,ki起作用,慢慢增大Ki,出现震荡(也就是温度上下起伏不定),再加入Kp,此时Kp的作用是抑制温度过快的变化,直到出现两前高后低的两个波后再加入Kd,其实这时候加和不加Kd作用都不是很大。简单的理解就是,Kd加快了升温的速度,但可能会升过头,而Kp的作用就是不让温度升过头。另外还有一个控制周期,也就是你算出来的pid结果什么时候加到控制器上,如果周期太快,上次的控制量控制器都没消化完,又来个新的控制量,会造成控制器出错,参数也整不出来,周期太大了也不好,系统是稳定了,但是响应速度却变慢了。

出0入0汤圆

发表于 2018-10-22 20:31:41 | 显示全部楼层
kangup2015 发表于 2016-5-20 15:01
大神做过积分分离吗,我现在做PI输出饱和了到目标温度后还在一直上升,看网上大家讨论有积分分离的方法, ...

你增量式PID做毛的积分分离,只有全量式才考虑这个积分分离。误差累加太大造成PID一时退不出来才需要积分分离的。你看增量式PID哪有积分项,名义上有比例Kp,积分Ki,微分Kd,可是他们完全不是这么回事。增量式里的Kp项是误差变化率,Ki项是误差,Kd项是误差变化率的变化率。

出0入0汤圆

发表于 2018-11-2 09:12:06 | 显示全部楼层
little4_su 发表于 2018-10-22 20:18
好吧,虽然这时很久之前的帖子,但是我还是想回。增量式pid的公式(Kp*e[k]-e[k-1]) + Ki*e[k] + Kd*(e[k] ...


是的,这样调试才正常,先调试Kp温度会加不起来,得到Ki和振荡周期后,如何得到Kp和Kd呢?

出0入0汤圆

发表于 2018-11-2 09:25:29 | 显示全部楼层
little4_su 发表于 2018-10-22 20:31
你增量式PID做毛的积分分离,只有全量式才考虑这个积分分离。误差累加太大造成PID一时退不出来才需要积分 ...

还有个疑问,最后输出是输出pOut=pData+iData+dData;还是pOut += pData+iData+dData?

出0入0汤圆

发表于 2018-11-2 17:26:03 | 显示全部楼层
hkjabcd 发表于 2018-11-2 09:12
是的,这样调试才正常,先调试Kp温度会加不起来,得到Ki和振荡周期后,如何得到Kp和Kd呢? ...

从增量式公式看,Kp项实际上是变化率,Ki项是偏差,Kd项是变化率的变化率,增量式里没有累计误差。Ki决定了加热速度的快慢,Ki越大输出越大,加热速度越快。这就带来了超调的问题,也就是说,跑得太快刹不住车了。我们不希望超调出现太大,就用变化率Kp来抑制过快的加热速度,所以在调试整定时如发现加热太快,就加大Kp,直到超调很小。Kd基本就是0。
我这张图是增量式pid,只用了参数Kp和Ki,技术指标超调±5%,误差±1℃,加热速度不大于36秒。这曲线不是很完美,但将就着用吧。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2018-11-2 17:42:40 | 显示全部楼层
hkjabcd 发表于 2018-11-2 09:25
还有个疑问,最后输出是输出pOut=pData+iData+dData;还是pOut += pData+iData+dData?

最后输出是pOut +=pData+iData+dData。如果套用公式正确,采样(PID计算)周期合适,你调不出教材上那种前高后低两个波的曲线,那说明你整定的参数不适合,千万不要怀疑pid。pid的难度不在编程上,编程是很简单的,难就难在这三个参数的整定上。两个参数都让人累得怀疑人生。另外说下,好多教材都说,采样周期采样周期,它其实是pid的计算周期,对于变化慢的温度,温度数据采样我们还是实时的采样,所以应该用数据采样周期和pid采样周期加以区分。另外还有一个控制周期,也特别注意一下。

出0入0汤圆

发表于 2018-11-2 19:36:10 | 显示全部楼层
我最后输出用的pOut =pData+iData+dData,300ms定时采样输出限幅300,能调好波形,但抗拨动干扰不行,也是只用了Ki和Kp,Ki影响过冲,Kp影响误差值

出0入0汤圆

发表于 2018-11-2 19:40:53 | 显示全部楼层
little4_su 发表于 2018-11-2 17:42
最后输出是pOut +=pData+iData+dData。如果套用公式正确,采样(PID计算)周期合适,你调不出教材上那种 ...

调到的波形,X轴时间,Y轴温度值

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2018-11-2 20:14:08 | 显示全部楼层
little4_su 发表于 2018-11-2 17:42
最后输出是pOut +=pData+iData+dData。如果套用公式正确,采样(PID计算)周期合适,你调不出教材上那种 ...

重新改了下程序,帮忙看看有没错,谢谢!按这个程序再调试下参数

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2018-11-3 08:34:28 | 显示全部楼层
hkjabcd 发表于 2018-11-2 20:14
重新改了下程序,帮忙看看有没错,谢谢!按这个程序再调试下参数

没错了,程序就是这样的。参数整定过程非常烦人,需要时间和耐心。继续啊,其实波形也差不多得了

出0入0汤圆

发表于 2018-11-3 08:37:11 | 显示全部楼层
little4_su 发表于 2018-11-3 08:34
没错了,程序就是这样的。参数整定过程非常烦人,需要时间和耐心。继续啊,其实波形也差不多得了 ...

不过,你的限幅不应该是增量部分的限幅,应该是pOut部分的限幅才对。

出0入0汤圆

发表于 2018-11-5 20:26:09 | 显示全部楼层
little4_su 发表于 2018-11-3 08:37
不过,你的限幅不应该是增量部分的限幅,应该是pOut部分的限幅才对。

pOut后=前有个+号,是输出量的限幅,现在调到过冲1度后稳定在偏高0.3度,能达到指标暂时使用,有时间再调好点

出0入42汤圆

 楼主| 发表于 2018-11-6 22:54:27 | 显示全部楼层
little4_su 发表于 2018-10-22 20:18
好吧,虽然这时很久之前的帖子,但是我还是想回。增量式pid的公式(Kp*e[k]-e[k-1]) + Ki*e[k] + Kd*(e[k] ...

厉害了,我这个项目基本完结了设备也量产了,5个负载,分别的参数,效果还可以
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-25 22:14

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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