搜索
bottom↓
回复: 24

利用PWM实现温度PID控制

  [复制链接]

出0入0汤圆

发表于 2014-7-14 00:24:41 | 显示全部楼层 |阅读模式
大家好,最近在研究利用PID控制PWM的占空比,从而实现恒温。

参考了tim4146的帖子,http://www.amobbs.com/forum.php? ... 3&highlight=PID

有几个问题没有弄清楚的是,请大家帮忙看看:

1,PID返回的是一个温度的数据,怎么转换成占空比呢? 假如我设置占空比TIM_Pulse = CCR1Val, 加上增量CCR1Val += incPIDcalc(&PID1,I2C_Temp),接着直接输出调正后的PWM就ok了?还是需要乘一个系数?

2,怎么设置占空比的初始值? 温度的初始值是常温,假设25度,需要升温到100度,刚开始肯定是全速加热,那么占空比初始值设置成1? 那么增量再加到CCR1Val上面去是不是无效了,还是需要设置一个判断语句,假如加上增量后大于最大值,赋最大值给他,如果小于,多少就是多少?

3,怎么样才能尽可能减小过冲? 从PID的控制来看,一直是全速加热,直到超过预定温度,增加量为负值,这样才开始减少占空比,从这点来看,过冲是先天性的,好像没有办法减小?

谢谢大家!

出0入96汤圆

发表于 2014-7-14 11:25:41 | 显示全部楼层
过冲是避免不了的,看PID的曲线就知道,开始几次是大震荡,逐渐减小的

出0入0汤圆

发表于 2014-7-14 12:03:19 | 显示全部楼层
不理解为何一定会有过冲,发几张串口抓取的数据图片给楼主参考一下,控温算法是增量式PID。

本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2014-7-14 12:43:34 | 显示全部楼层
我也想知道怎么弄

出0入0汤圆

 楼主| 发表于 2014-7-14 12:54:11 | 显示全部楼层
coleyao 发表于 2014-7-14 12:03
不理解为何一定会有过冲,发几张串口抓取的数据图片给楼主参考一下,控温算法是增量式PID。 ...

你后面2张波形非常的好,一点都没有过冲,请问是怎么做到的啊?

按照我的程序,从室温加热到100度,那么PWM刚开始是占空比为1全速加热,按照PID的理论相当于前面不起作用,只有超过100度才开始调整,请问我这样理解有没有问题呢?

出0入0汤圆

发表于 2014-7-14 14:15:31 | 显示全部楼层
当然有问题,到了才调整不过冲才怪了。快到了就调整,比如90后开始调整。给几个小震荡后逐渐稳定下来。

出0入0汤圆

发表于 2014-7-14 16:35:42 | 显示全部楼层
本帖最后由 SMC 于 2014-7-14 17:49 编辑

对于温控系统超调的原因是系统的时滞,假如没有时滞,你想把它弄超调都难。
而且正是因为有了时滞才需要加入微分项,也就是说这个微分项的主要作用就是去控制时滞带来的不利影响。

出0入0汤圆

发表于 2014-7-14 17:20:19 | 显示全部楼层

出5入4汤圆

发表于 2014-7-14 19:34:20 | 显示全部楼层
看到不少用PID做温控的,我自己只用有电机控制的经验,所以温控里面有什么特别注意的我也说不出来,唯一的可能就是采样周期和系统滞后相对大一些吧。
下面就我的理解回答你的问题,难免有不足和简陋之处:
1、这是比较关键的问题,其实你没把温度和占空比这两个量联系起来。我们控制的是温度,实际也是控制的输出占空比,他们实际是简单的线性关系,温度和占空比大致就是正比,温度=系数*占空比。
那么在PID计算里面,为了方面理解,你PID公式里面的量最好是一致的,比如你的error不妨就是温度的误差(设定值-当前值,单位是℃),那么你通过增量PID算出的量就看成是单位是℃,然后用温度/系数得到真空比a,然后CCR1Val+a 就行了。你的CCR1Val += incPIDcalc(&PID1,I2C_Temp)也可以啊,但是你必须保证incPIDcalc(&PID1,I2C_Temp)输出的是占空比哦,否则你前面的CCR1Val表示占空比,后面的算出是温度,加起来没有意义。总结一句话,通过系数变换让单位一致就行。另外,注意一下你的控制精度,举个例子,你用0%~100%的占空比,如果这个真空比用的是整数型变量,那你得精度就是1%的真空比对应的温度了(大致)。
2、占空比初始值就是变量默认的零咯。放到系统里面理解就是最一开始控制量是零。你说占空比是1,应该是占空比100%是吧,你明明是让PID去做的,却人为干预让他初始的输出是最大,没道理这么做的吧。你怎么不考虑人家是用来降温呢...
3、过冲问题。不知道你有没有仔细看“coleyao”朋友的图,T_up是上升时间。图1,上升时间20s;图2,101s;图3,493秒。控制系统要求稳、快、准。你追求快速性,稳定性肯定有所牺牲的,追求稳定没超调,那你快速性要妥协。我没有温控的实际经验,个人认为这个看场合吧。
还有一个,我记得不是很清楚了,上面的三个图应该是调整的积分环节做到的。

出0入0汤圆

 楼主| 发表于 2014-7-14 21:06:25 | 显示全部楼层
tim4146 发表于 2014-7-14 19:34
看到不少用PID做温控的,我自己只用有电机控制的经验,所以温控里面有什么特别注意的我也说不出来,唯一的 ...

非常感谢4146详细的回复!

温度=系数*占空比,问题的关键是怎么确定这个系数呢?如果这个系数不准确,最后调整的结果肯定不好。是不是要通过无数的试验最后总结出温度和占空比的系数?

出0入0汤圆

 楼主| 发表于 2014-7-14 21:10:29 | 显示全部楼层
SMC 发表于 2014-7-14 16:35
对于温控系统超调的原因是系统的时滞,假如没有时滞,你想把它弄超调都难。
而且正是因为有了时滞才需要加 ...

嗯,我原来的理解有误。
就是说PID公式,在当前值比目标值小的时候结果就有可能是负值了,这样在还没到目标值的时候其实就开始调整了,所以理论上是可以完全不过冲的。

出5入4汤圆

发表于 2014-7-14 21:12:41 | 显示全部楼层
understone 发表于 2014-7-14 21:06
非常感谢4146详细的回复!

温度=系数*占空比,问题的关键是怎么确定这个系数呢?如果这个系数不准确,最 ...

额,这个还真不太能想出来。我只能说你的设备在加热,房间自己在散热,最后肯定会基本稳定在一个温度,找到这个大致系数就行,你试试看呢...
希望做过温控的朋友来帮忙看看就更好啦

出0入0汤圆

发表于 2014-7-15 19:58:40 | 显示全部楼层
understone 发表于 2014-7-14 21:10
嗯,我原来的理解有误。
就是说PID公式,在当前值比目标值小的时候结果就有可能是负值了,这样在还没到目 ...

http://www.amobbs.com/thread-5484520-1-1.html  27楼有一个温控算法仿真的小软件,我自己抽空写的,主要供PID控制入门用,可以看到在不同的参数下加热系统的温度和加热功率变化曲线,可以用来评估PID各种参数对过冲、稳态误差,温度上升时间、稳态波动幅度、抗扰动性能等温控参数的影响,希望能对你有帮助!

出0入0汤圆

 楼主| 发表于 2014-7-15 22:15:25 | 显示全部楼层
coleyao 发表于 2014-7-15 19:58
http://www.amobbs.com/thread-5484520-1-1.html  27楼有一个温控算法仿真的小软件,我自己抽空写的,主 ...

嗯,谢谢你的软件,看来我第二个问题算是解决了,及的确需要设置波特数的最大值和最小值。

出0入0汤圆

 楼主| 发表于 2014-7-15 22:19:30 | 显示全部楼层
tim4146 发表于 2014-7-14 21:12
额,这个还真不太能想出来。我只能说你的设备在加热,房间自己在散热,最后肯定会基本稳定在一个温度,找 ...

嗯,我想我大概想明白了,我首先需要得到一份自己设备的加热曲线,及全速加热的情况下由常温到目标温度需要的时间,这样可以得到加热速度曲线,然后设置一个合适的PWM的周期和波特数,根据加热速度曲线可以算出来上升1个温度需要对应的时间,然后时间和PWM周期对应起来,周期又和波特数对应,这样就可以得到这个常数了!

出0入0汤圆

 楼主| 发表于 2014-7-15 23:01:22 | 显示全部楼层
coleyao 发表于 2014-7-15 19:58
http://www.amobbs.com/thread-5484520-1-1.html  27楼有一个温控算法仿真的小软件,我自己抽空写的,主 ...

你好,使用了你的软件,有几个不太明白的地方请教一下:
1,使用位置增量模式,PWM最大值指的是什么啊?代表TIM_Pulse还是TIM_Period?
Position PID Inc:    Delta Output= KP*vT +KI*ET[CountT] +KD*aT;
ET[CountT]: 温度误差(在PID 模式下等于设置温度减去当前温度,在预测式负反馈模式下则相反)
vT=ET[CountT]-ET[CountT-1] :升温速率
aT=ET[CountT]-2ET[CountT-1]+ET[CountT-2]) : 升温加速度
Sum(ET[CountT]) 积分量

2,提前量为控制模式在达到设定温度前提前开启控制模式的时间;
--》按照说明里面的提前量应该是时间,但是实际控制界面单位写的是摄氏度,所以我的理解是距离目标设定温度开始PID控制?,即提前量为摄氏度单位,不知道对不对。

3,最大功率是不是可以由升温速率计算得到?因为升温速率不是线性的,所以才需要定义功率吗?不然我的理解是升温多少是由升温时间即波特数决定的,和功率无关啊。

4,楼主PWM的周期和PeriodValue是可以设置的还是后台固定的?我想通过设置完全模拟自己的情况,那么就可以得到PID初步整定的三个参数,再带到实际中去优化,这样应该事半功倍,我想这也是楼主这个软件最大的优点。

出0入0汤圆

发表于 2014-7-16 06:06:55 | 显示全部楼层
本帖最后由 coleyao 于 2014-7-16 06:20 编辑
understone 发表于 2014-7-15 23:01
你好,使用了你的软件,有几个不太明白的地方请教一下:
1,使用位置增量模式,PWM最大值指的是什么啊? ...


1、PWM中,脉宽和周期都是基本计时单元T的整数倍,如脉宽=nT,周期=NT,则若脉冲正控制加热开的话,加热功率与脉宽比nT/NT(n<=N)成正比,我讲的PWM最大值就是指N值,软件主要的目的是建立一个温度控制过程的直观印象,辅助用于对温度控制的进一步抽象。
2、提前是达到设定温度前提前多少度开始使用算法控制。
3、最大功率和升温速度间没有直接的线性关系,两者关系比较复杂,所以必须分别表示,并且升温速度是随温度值非线性变化的,而最大功率是个常量。
4、PWM周期即为软件中的PWM最大值*T,而这个T一般不影响控制效果,有影响的只是即时功率K*(nT/NT),其中的T抵消掉了。

出0入0汤圆

发表于 2014-11-9 20:49:14 | 显示全部楼层
understone 发表于 2014-7-14 12:54
你后面2张波形非常的好,一点都没有过冲,请问是怎么做到的啊?

按照我的程序,从室温加热到100度,那么 ...

为啥要到100℃才开始PID。100之前就PID不就好了?

出0入0汤圆

发表于 2014-11-9 20:54:05 | 显示全部楼层
请教下,如果目标温度是50℃,从20℃开始PID调整,之后加到了52℃。现在怎么处理?
当温度高于目标温度时就等待自然冷却

出0入0汤圆

发表于 2014-11-12 16:20:02 | 显示全部楼层
understone 发表于 2014-7-15 22:15
嗯,谢谢你的软件,看来我第二个问题算是解决了,及的确需要设置波特数的最大值和最小值。 ...

你好。你的温控做的怎么样了?方便加个Q吗?》

出0入0汤圆

发表于 2015-3-30 09:31:48 | 显示全部楼层
最近在搞温控器,这个帖子正好来当入门了

出0入0汤圆

发表于 2015-3-30 09:39:47 | 显示全部楼层
果断收藏

出0入0汤圆

发表于 2020-6-22 11:39:42 | 显示全部楼层
同是,第一个问题,没搞懂,楼主能描述一下问题一怎么解决的吗?

出0入0汤圆

发表于 2020-6-28 19:58:33 | 显示全部楼层
111,码起来吃灰去吧

出0入0汤圆

发表于 2020-6-29 23:35:43 | 显示全部楼层
过来学习一下。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-30 00:34

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

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