搜索
bottom↓
回复: 59

总结一下我的PID温度控制 调试经验

  [复制链接]

出0入0汤圆

发表于 2018-3-14 18:10:30 | 显示全部楼层 |阅读模式
万事开头难。
刚接触PID的时候调得焦头烂额,当把程序调出来后,发现其实挺简单。
其实也都是因为网上的发出来的例程说得都太复杂,或者是发的资料没全还藏了部分(个人感觉)。
闲话少说直接上资料:
先前发的一些网上的资料,程序原理与实现上主要参考了“PID控制算法的C语言实现.(绝对的好东西)”。
https://www.amobbs.com/thread-5685071-1-1.html

本次PID主要是通过固态继电器控制加热片进行加热,温度探测使用的DS18B20,稳定后在0.5度范围内(然并卵)。

程序如下:
定义结构体
typedef struct
{
    float SetSpeed;         //定义设定值
    float ActualSpeed;      //定义实际值
    float err;              //定义偏差值
    float err_next;         //定义上一个偏差值
    float err_last;         //定义上上一个的偏差值
    float Kp;               //定义比例系数
    float Ki;               //定义积分系数
    float Kd;               //定义微分系数
    float voltage;          //定义电压值(控制执行器的变量)
    float integral;         //定义积分值
    float umax;             //正极限位置
    float umin;             //负极限位置

}_PID_T;
_PID_T pid;


/*
    PID初始化
*/
void PID_init(void)
{
    pid.SetSpeed = 0.0;
    pid.ActualSpeed = 0.0;
    pid.err = 0.0;
    pid.err_last = 0.0;
    pid.err_next = 0.0;
    pid.Kp = 1.0;       //比例调节
    pid.Ki = 0.01;      //积分调节
    pid.Kd = 0.0;       //微分调节
}
/*
    取绝对值
*/
float Abs(float val)
{
    if(val<0)
    {
        val = -val;
    }
    return val;
}

/*
    PID计算
*/
float PIDCalc(float speed)
{
    UINT8 index=0;
    index = index;
//------------------------------------------------------------------------------------------------------------//
//积分分离式
    pid.SetSpeed = speed;
    pid.ActualSpeed = (float)DS18B20Temp()/10;
    pid.err = pid.SetSpeed - pid.ActualSpeed;
    if(Abs(pid.err)>3)      //温度差值超过3度,不加入积分环节
    {
        index = 0;
    }
    else
    {
        index = 1;
        pid.integral += pid.err;
    }
    pid.voltage = pid.Kp*pid.err+index*pid.Ki*pid.integral+pid.Kd*(pid.err-pid.err_last); //算法具体实现过程
    pid.err_last = pid.err;
//    pid.ActualSpeed = pid.voltage*1.0;
    if(pid.voltage>50)
    {//设置一个PWM量程上限值
        pid.voltage = 50;
    }
    return pid.ActualSpeed;
}

定时器5中进行固态继电器的控制
void TIM5_IRQHandler(void)
{
    static UINT8 heatTime=0;
        if(TIM5->SR&TIM_IT_Update)//溢出中断
        {
                TIM5->SR &= ~TIM_IT_Update ;//清除中断标志位
                if(pid.ActualSpeed<40)
                {//调试时超过40度关闭加热,避免烧坏加热片
            if(pid.voltage>0)
                    {
                if(++heatTime>50)
                {
                    heatTime = 0;
                }
                ((heatTime*10)<(UINT8)(pid.voltage*10))?(HEAT_CTL = ON_OP):(HEAT_CTL = OFF_OP);
            }
            else
            {
                heatTime = 0;
                HEAT_CTL = OFF_OP;
            }

                }
        else
        {
            HEAT_CTL = OFF_OP;
        }
        }                                               
}

下面这个函数是在主函数里面调用的,我这里是250ms进行一次PID。
void DebugOut(void)
{
    UINT16 cnt=0;
    cnt = cnt;
    if(timerPara.timeDebug > 250)
    {
        timerPara.timeDebug = 0;
        if(PidEn)
        {
            PIDCalc(35.0);
        }
        else
        {
            pid.ActualSpeed = (float)DS18B20Temp()/10;
            pid.voltage=0;
        }
        printf("\r\nTEMPER=%f, U(t)=%f", pid.ActualSpeed,pid.voltage);
    }
}

这次调试主要觉得有两个难点:
1、程序算法怎么实现。参考上面的“PID控制算法的C语言实现.(绝对的好东西)”,基本就明白怎么写了,或者抄一下,网上的源码很多。
2、PID输出怎么用,U(t)是什么?算法程序有了,但是怎么拿来控制加热片进行加热?我反正是在网上找了好多圈,有写PID的基本都没说到这点,都只是说程序怎么实现,或者就是一句话,输出就是PWM。
说的其实也没错,只是不够明白。这里说说我的做法:
给输出设置一个上限,或者把输出当做PWM量程,比如50等分,实测中,实际温度与设置温度越来越靠近,PID的输出值会越来越小。那这个值就可以拿来做PWM方波的高电平,用于启动加热(参考定时器里的做法)。
3、参数的整定。网上的做法也很简单,一个参数一个参数调整,单个参数按一个方向进行调整。
a、把微积分的值设置为0,只调节比例参数,我这里调节到加热的时候不过冲,但是加热会比较慢。
b、调节积分参数,让稳定值会比较趋近到设置值。

本帖子中包含更多资源

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

x

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

阿莫论坛才是最爱国的,关心国家的经济、社会的发展、担心国家被别国牵连卷入战争、知道珍惜来之不易的和平发展,知道师夷之长,关注世界的先进文化与技术,也探讨中国文化的博大精深,也懂得警惕民粹主义的祸国殃民等等等等,无不是爱国忧民的表现。(坛友:tianxian)

出0入21汤圆

发表于 2018-3-14 19:09:59 | 显示全部楼层
图片上看是不能加热的

出0入0汤圆

发表于 2018-3-14 21:08:01 | 显示全部楼层
标记下,说不定哪天要用到了

出0入0汤圆

发表于 2018-3-14 22:21:49 | 显示全部楼层
做个记号,不错的,加油

出0入0汤圆

发表于 2018-3-14 22:36:11 | 显示全部楼层
mark一下

出0入0汤圆

 楼主| 发表于 2018-3-14 23:10:57 | 显示全部楼层
qd118118 发表于 2018-3-14 19:09
图片上看是不能加热的

可以啊,继电器灯是亮的,在加热着的

出0入21汤圆

发表于 2018-3-15 20:03:49 | 显示全部楼层
blavy 发表于 2018-3-14 23:10
可以啊,继电器灯是亮的,在加热着的

负载只接了一根线

出0入0汤圆

发表于 2018-3-15 20:40:17 来自手机 | 显示全部楼层
楼主干得不错,鼓励一下开源!

出0入0汤圆

 楼主| 发表于 2018-3-16 10:40:36 | 显示全部楼层
qd118118 发表于 2018-3-15 20:03
负载只接了一根线

我是直接把温度探头放在加热片上测温的

出0入21汤圆

发表于 2018-3-16 10:51:39 | 显示全部楼层
blavy 发表于 2018-3-16 10:40
我是直接把温度探头放在加热片上测温的

哈哈,看走眼了,把制冷片当加热片

出0入0汤圆

 楼主| 发表于 2018-3-16 11:07:38 | 显示全部楼层
本帖最后由 blavy 于 2018-3-16 11:09 编辑
qd118118 发表于 2018-3-16 10:51
哈哈,看走眼了,把制冷片当加热片


我没说清楚,因为懒得去找合适的加热器件,就用一个帕尔贴制冷片来做,用了散热的那一面做加热,

出0入0汤圆

发表于 2018-3-16 11:32:23 | 显示全部楼层
学习了

出0入0汤圆

发表于 2018-3-16 11:42:08 | 显示全部楼层
好东西,楼主能否把工程文件发一下,这样更方便。

出0入85汤圆

发表于 2018-3-16 11:56:10 | 显示全部楼层
你这负载太轻了,你换个滞后强烈点的负载,你就知道PID的复杂了

出5入10汤圆

发表于 2018-3-16 13:20:41 | 显示全部楼层
楼主这程序不错

出0入0汤圆

发表于 2018-3-16 14:22:25 | 显示全部楼层
mark一下,以后备用

出0入0汤圆

发表于 2018-3-16 14:58:11 | 显示全部楼层
收藏,谢谢了,最近用到

出1310入193汤圆

发表于 2018-3-16 15:02:53 | 显示全部楼层
楼主好样的

出0入0汤圆

 楼主| 发表于 2018-3-16 21:53:34 | 显示全部楼层
marshallemon 发表于 2018-3-16 11:56
你这负载太轻了,你换个滞后强烈点的负载,你就知道PID的复杂了

是的,现在的负载就参数已经不好定了

出0入0汤圆

发表于 2018-3-19 08:54:14 | 显示全部楼层
mark 一下!

出210入8汤圆

发表于 2018-3-19 09:21:46 | 显示全部楼层
这个要马克一下

出0入0汤圆

发表于 2018-3-19 09:48:53 | 显示全部楼层
对于上程序我都会顶一下,以表示赞一个。PID

出10入95汤圆

发表于 2018-3-19 13:28:27 来自手机 | 显示全部楼层
多谢分享

出0入0汤圆

发表于 2018-3-19 13:55:00 | 显示全部楼层
谢谢blavy的分享

出0入0汤圆

发表于 2018-3-19 14:39:53 | 显示全部楼层
谢谢楼主先MARK下

出0入0汤圆

发表于 2018-3-20 10:17:46 | 显示全部楼层
我也要搞温控了,楼主资料很及时,PID应该是很复杂的,之前也看了网上的一些资料,讲PID感觉就是纯粹在讲名词解释"P、I、D",也可能是我太愚钝。另外楼主的控制板貌似很漂亮,怎么不露个全脸

出0入0汤圆

发表于 2018-3-20 10:22:30 | 显示全部楼层
学习一下 正好需要使用

出0入0汤圆

发表于 2018-3-20 10:44:00 | 显示全部楼层
算法没这么简单吧,公司就是卖温控的

出0入0汤圆

发表于 2018-3-20 12:57:36 | 显示全部楼层
挺有用的,感谢楼主分享。

出0入0汤圆

发表于 2018-4-7 21:06:17 | 显示全部楼层
soga238 发表于 2018-3-20 10:44
算法没这么简单吧,公司就是卖温控的

这个算法是增量式,加上了积分分离,并且控制了占空比上限。一般卖温控的算法会更加完善,可能有的会有参数自整定。

出0入0汤圆

发表于 2018-4-7 21:17:03 | 显示全部楼层
PID入门 
做个记号,不错的,加油

出0入0汤圆

发表于 2018-4-7 21:17:38 | 显示全部楼层
感谢楼主分享

出0入98汤圆

发表于 2018-4-7 21:21:55 | 显示全部楼层
我看做化工自动化的
说他们调一轮参数可能要几个月
好在我是做机电的多,调几百次也不用多久...

出0入10汤圆

发表于 2018-4-7 21:43:46 | 显示全部楼层
做个记号,不错的PID入门资料

出0入0汤圆

发表于 2018-4-7 23:23:03 | 显示全部楼层
387646983 发表于 2018-4-7 21:06
这个算法是增量式,加上了积分分离,并且控制了占空比上限。一般卖温控的算法会更加完善,可能有的会有参 ...

自整定必须有,功能多且复杂。

出0入0汤圆

 楼主| 发表于 2018-4-7 23:29:15 | 显示全部楼层
soga238 发表于 2018-4-7 23:23
自整定必须有,功能多且复杂。

初学者,只是业余学习打发时间。
把自己的一些调试经历,发出来互相交流,也算是一种学习笔记。

出0入0汤圆

发表于 2018-4-8 01:08:24 | 显示全部楼层
有没有温度曲线呢

出0入24汤圆

发表于 2018-4-8 07:41:54 | 显示全部楼层
Mark!学习一下!

出0入0汤圆

发表于 2018-4-8 10:41:59 | 显示全部楼层

标记下,说不定哪天要用到了

出0入0汤圆

 楼主| 发表于 2018-4-8 11:25:22 | 显示全部楼层
deadline2012 发表于 2018-4-8 01:08
有没有温度曲线呢

有用匿名上位机做了曲线,后面不知道被我扔到哪去了

出0入0汤圆

发表于 2018-4-8 11:35:40 | 显示全部楼层
楼主,稳定在0.5度范围内时间要经过多久?

出0入0汤圆

发表于 2018-4-8 14:15:08 | 显示全部楼层
这个也可以用在煎烤器上,赞

出0入0汤圆

发表于 2018-4-8 14:48:30 | 显示全部楼层
需要注意最大最小时候的效果

出0入0汤圆

发表于 2018-5-14 17:26:24 | 显示全部楼层
mak...................................

出0入0汤圆

发表于 2018-5-14 20:14:41 | 显示全部楼层
感觉不错的帖子啊

出0入0汤圆

发表于 2018-5-15 17:46:38 | 显示全部楼层
好帖,参考,好帖,参考,好帖,参考,

出0入0汤圆

发表于 2018-5-15 19:12:51 | 显示全部楼层
不错的帖子

出0入0汤圆

发表于 2018-5-16 02:13:58 | 显示全部楼层
本帖最后由 yangzi8000 于 2018-5-16 03:27 编辑

楼主怎么驱动固态继电器的?直接IO吗,还是加了功率管子?能截个原理图吗

((heatTime*10)<(UINT8)(pid.voltage*10))?(HEAT_CTL = ON_OP):(HEAT_CTL = OFF_OP);  这句逻辑关系没看明白 ,这个是什么时候关闭继电器的

出0入0汤圆

发表于 2018-5-16 08:05:05 | 显示全部楼层
PID一直想用,可惜一直没用上!

出0入0汤圆

发表于 2018-7-7 09:01:23 | 显示全部楼层
谢谢分享,好东西。

出180入0汤圆

发表于 2018-7-7 11:46:47 | 显示全部楼层
感谢楼主分享

出0入0汤圆

发表于 2018-8-30 16:40:41 | 显示全部楼层
PID算法。。。

出0入0汤圆

发表于 2020-4-9 09:09:24 | 显示全部楼层
加入pid参数自整定吧

出0入0汤圆

发表于 2020-4-15 02:12:55 | 显示全部楼层
收藏这个源码,待以后学习

出10入10汤圆

发表于 2020-4-15 05:50:15 来自手机 | 显示全部楼层
收藏学习

出0入0汤圆

发表于 2020-4-15 06:41:13 来自手机 | 显示全部楼层
感谢楼主分享

出0入0汤圆

发表于 2020-4-16 16:19:42 | 显示全部楼层
不错收藏一波

出0入0汤圆

发表于 2020-4-17 08:49:35 | 显示全部楼层
做个记号,不错,用得着~

出675入8汤圆

发表于 2020-4-17 12:53:44 来自手机 | 显示全部楼层
做个记号,不错,用得着

出85入85汤圆

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

本版积分规则

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

GMT+8, 2024-4-16 12:53

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

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