打印
[C语言]

关于PID控温的相关问题讨论

[复制链接]
2687|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zmw809154465|  楼主 | 2014-11-5 16:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人现在想做一个类似烤箱的机器,内部用电热丝加热1200W,电热丝以可控硅驱动。请问我要实现控温±2°,我看过PID控温的相关知识,但是没有实战过,准备启动项目。为了避免工作中的弯路,来这里求仙,用增量式PID控温还是位置式PID,因为控温不像控电机这样直接,会出现热缓冲的现象,如何避免这一问题。采样周期又有什么学问?我将进入程序编写,希望大家多多指导,我也回将后续调试结果,调试方法总结记录分享,欢迎一起参与学习?

相关帖子

沙发
zmw809154465|  楼主 | 2014-11-5 16:53 | 只看该作者
也可以提供一些资料:$

使用特权

评论回复
板凳
wy3383818| | 2014-11-5 17:22 | 只看该作者
MARK一下,关于烤箱的PID感觉和冰箱的PID类似,我也想学习一下,帮你顶起来。

使用特权

评论回复
地板
zmw809154465|  楼主 | 2014-11-5 18:11 | 只看该作者
顶起:)

使用特权

评论回复
5
cqxyy| | 2014-11-5 23:59 | 只看该作者
响应速度比较不好调,  响应速度不敏感控温±2很容易做。

使用特权

评论回复
6
gx_huang| | 2014-11-6 08:34 | 只看该作者
难度比你想象的还大,做过就知道了。
买一个现成的温控仪表,看看效果,都白菜价了。

使用特权

评论回复
7
zmw809154465|  楼主 | 2014-11-6 09:06 | 只看该作者
#include "pid.h"

#define Kp 3.0
#define Ki 0.3
#define Kd 200.0
#define Ts 20                //采样周期为2S,采样频率为100ms一次
typedef unsigned char uchar;
typedef unsigned int  uint;
typedef unsigned long ulong;

uchar sampl_cnt = 0;                //采样数变量,100ms加一次
bit   flag_100ms = 0;
typedef struct _PID_
{
        uint SetPoint; //设定目标Desired Value
        long SumError; //误差累计
        uint Proportion; //比例常数Proportional Const
        uint Integral; //积分常数Integral Const
        uint Derivative; //微分常数Derivative Const
       
        int LastError; //Error[-1]
        //int PrevError; //Error[-2]
}PID_TYPE;

static PID_TYPE  ContlHeatPID;           
static PID_TYPE *pPID = &ContlHeatPID;

/******************************
函数名称:
函数功能:
函数参数:
函数返回值:
******************************/
void PIDInit(void)
{
        pPID->SetPoint    = 0;
        pPID->Proportion = Kp;
        pPID->Integral   = Ki;
        pPID->Derivative = Kd;
        pPID->LastError  = 0;
        pPID->SumError   = 0;
}

/******************************
函数名称:
函数功能:积分项每100ms累加一次误差值,20次后清零,但是PID也每100ms更新一次
函数参数:
函数返回值:
******************************/
void CalPID1(int nexPoint)
{
        int   iError,dError;
        uint pOut;
        iError = pPID->SetPoint - nexPoint;
        if(flag_100ms)
        {
                flag_100ms = 0;
                if(sampl_cnt < 20)
                {
                        sampl_cnt++;
                        pPID->SumError += iError;
                }
                if(sampl_cnt == 20)
                {
                        pPID->SumError = 0;
                        pPID->SumError += iError;
                }
        }
        dError= iError - pPID->LastError;
        pPID->LastError = iError;
        pOut = pPID->Proportion*iError + pPID->Integral*pPID->Integral
                         + pPID->Derivative*dError;
       
}
/******************************
函数名称:
函数功能: 每经过20采样数,也就是每间隔2S输出一个调节PID数据
函数参数:
函数返回值:
******************************/
void CalPID2(int nexPoint)
{
        int   iError,dError;
        uint pOut;
        iError = pPID->SetPoint - nexPoint;
        if(flag_100ms)
        {
                flag_100ms = 0;
                sampl_cnt++;
                if(sampl_cnt < 20)        //如果采样数据小于20个,积累积分项
                {
                        pPID->SumError += iError;
                        dError= iError - pPID->LastError;
                        pPID->LastError = iError;
                }
                else if(sampl_cnt == 20)//如果采样数据为20个,输出PID调节数据,清0 SunError为下次准备
                {
                        sampl_cnt = 0;
                        pPID->SumError += iError;
                        dError= iError - pPID->LastError;
                        pPID->LastError = iError;                       
                        pOut = pPID->Proportion*iError + pPID->Integral*pPID->Integral
                                         + pPID->Derivative*dError;
                        pPID->SumError = 0;
                }
        }
}

使用特权

评论回复
8
zmw809154465|  楼主 | 2014-11-6 09:06 | 只看该作者
请问上面的程序哪一种是对的??第一次还是第二种,每隔2s输出一次PID数据???

使用特权

评论回复
9
QuakeGod| | 2014-11-6 12:19 | 只看该作者
每2秒输出一次数据,估计温度早就超温了。
另外一个,温度传感器是个大问题,如果加热的物体热传导很好,温度传感器装在上面,倒还可以。
如果是直接加热温度传感器得话,可能表面上看起来还马马虎虎,实际效果彻底完蛋。

使用特权

评论回复
评论
gx_huang 2014-11-6 12:35 回复TA
2S一次还算好的,如果是继电器输出的,一般20S呢。 
10
menghubei| | 2014-11-6 12:51 | 只看该作者
关于温度传感器,一个肯定是不够的,你说的控制精度±2℃是局部温度还是整体温度,效果还跟你电热丝的布局有关;
pid算法增量和位置只是编程有区别,原理都是一样的,最后成品就看调参调的怎么样了。

采样周期要参考温度传感器的精度,烤箱的大小,功率,粗略计算一下应该可以得到一个比较靠谱的值

空气的密度为1.29kg/m^3
空气的比热容为1.0×103J/(kg.℃)
当然这两个参数是会随温度变化的,容量选10L(根据项目定)
温升大概≈自己算下

使用特权

评论回复
11
zmw809154465|  楼主 | 2014-11-6 16:41 | 只看该作者
我的温度只是特定中心点的温度,如果到后期应该腔体的温度是比较均一的

使用特权

评论回复
12
zmw809154465|  楼主 | 2014-11-6 16:42 | 只看该作者
menghubei 发表于 2014-11-6 12:51
关于温度传感器,一个肯定是不够的,你说的控制精度±2℃是局部温度还是整体温度,效果还跟你电热丝的布局 ...

我的温度只是特定中心点的温度,如果到后期应该腔体的温度是比较均一的

使用特权

评论回复
13
zmw809154465|  楼主 | 2014-11-6 16:43 | 只看该作者
menghubei 发表于 2014-11-6 12:51
关于温度传感器,一个肯定是不够的,你说的控制精度±2℃是局部温度还是整体温度,效果还跟你电热丝的布局 ...

我的温度只是特定中心点的温度,如果到后期应该腔体的温度是比较均一的

使用特权

评论回复
14
menghubei| | 2014-11-6 16:53 | 只看该作者
zmw809154465 发表于 2014-11-6 16:43
我的温度只是特定中心点的温度,如果到后期应该腔体的温度是比较均一的 ...

这个我也不太了解,只是理论上的一点知识

使用特权

评论回复
15
zmw809154465|  楼主 | 2014-11-6 16:53 | 只看该作者
menghubei 发表于 2014-11-6 12:51
关于温度传感器,一个肯定是不够的,你说的控制精度±2℃是局部温度还是整体温度,效果还跟你电热丝的布局 ...

请问控制温度,过冲的问题,不用考虑是增量式,位置式?两者真的没区别吗?

使用特权

评论回复
16
menghubei| | 2014-11-6 17:11 | 只看该作者
zmw809154465 发表于 2014-11-6 16:53
请问控制温度,过冲的问题,不用考虑是增量式,位置式?两者真的没区别吗? ...

我理解的增量式和位置式的区别只是在算法上的区别,你可以找找这些算法的资料,

我理解的增量式是:每次采样输出=上次的值+计算增量

使用特权

评论回复
17
cauhorse| | 2014-11-6 18:45 | 只看该作者
位置式算法可以用。如果容积大,输出定时周期还可以大一些,我不到100立升用3s周期。

使用特权

评论回复
18
zmw809154465|  楼主 | 2014-11-7 09:19 | 只看该作者
cauhorse 发表于 2014-11-6 18:45
位置式算法可以用。如果容积大,输出定时周期还可以大一些,我不到100立升用3s周期。 ...

你可以看看我的程序,我这个是不是正规的位置式程序?我的sumerror没有一直从开始累积,而是20采集点累积,输出一个pout后,再采样20个累加,这样可以吗??

使用特权

评论回复
19
xuyaqi| | 2014-11-7 17:07 | 只看该作者
楼主如果是想学习PID温控可以自己搞搞,如果是项目还是买现成仪表简单一些,PID不是简单单片机程序问题,他是一个系统每个环节都对控制结果有影响,pid参数整定不是初学者容易掌握的。

使用特权

评论回复
20
cauhorse| | 2014-11-7 21:56 | 只看该作者
zmw809154465 发表于 2014-11-7 09:19
你可以看看我的程序,我这个是不是正规的位置式程序?我的sumerror没有一直从开始累积,而是20采集点累积 ...

为什么这么写呢?你PID输出周期为2s,完全可以在2s内完成多次采样(可以应用滤波算法)后进行一次PID运算输出即可。这样累加,是想削弱积分效应吗?那可以通过乘以较小的积分系数KI来解决,没有必要用两个if增加复杂度。
直接if(--Sample_Cnt <= 0){}当中执行PID运算就可以了。20次采样做一次均值滤波也比这个有效用吧。

使用特权

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

本版积分规则

8

主题

41

帖子

3

粉丝