当前位置:首页 » 操作系统 » 温度控制系统pid算法

温度控制系统pid算法

发布时间: 2023-08-11 23:08:02

Ⅰ PID算法温控C语言

1. PID调试步骤
没有一种控制算法比PID调节规律更有效、更方便的了。现在一些时髦点的调节器基本源自PID。甚至可以这样说:PID调节器是其它控制调节算法的妈。
为什么PID应用如此广泛、又长久不衰?

因为PID解决了自动控制理论所要解决的最基本问题,既系统的稳定性、快速性和准确性。调节PID的参数,可实现在系统稳定的前提下,兼顾系统的带载能力和抗扰能力,同时,在PID调节器中引入积分项,系统增加了一个零积点,使之成为一阶或一阶以上的系统,这样系统阶跃响应的稳态误差就为零。
由于自动控制系统被控对象的千差万别,PID的参数也必须随之变化,以满足系统的性能要求。这就给使用者带来相当的麻烦,特别是对初学者。下面简单介绍一下调试PID参数的一般步骤:
1.负反馈
自动控制理论也被称为负反馈控制理论。首先检查系统接线,确定系统的反馈为负反馈。例如电机调速系统,输入信号为正,要求电机正转时,反馈信号也为正(PID算法时,误差=输入-反馈),同时电机转速越高,反馈信号越大。其余系统同此方法。
2.PID调试一般原则
a.在输出不振荡时,增大比例增益P。
b.在输出不振荡时,减小积分时间常数Ti。
c.在输出不振荡时,增大微分时间常数Td。
3.一般步骤
a.确定比例增益P
确定比例增益P 时,首先去掉PID的积分项和微分项,一般是令Ti=0、Td=0(具体见PID的参数设定说明),使PID为纯比例调节。输入设定为系统允许的最大值的60%~70%,由0逐渐加大比例增益P,直至系统出现振荡;再反过来,从此时的比例增益P逐渐减小,直至系统振荡消失,记录此时的比例增益P,设定PID的比例增益P为当前值的60%~70%。比例增益P调试完成。
b.确定积分时间常数Ti
比例增益P确定后,设定一个较大的积分时间常数Ti的初值,然后逐渐减小Ti,直至系统出现振荡,之后在反过来,逐渐加大Ti,直至系统振荡消失。记录此时的Ti,设定PID的积分时间常数Ti为当前值的150%~180%。积分时间常数Ti调试完成。
c.确定积分时间常数Td
积分时间常数Td一般不用设定,为0即可。若要设定,与确定 P和Ti的方法相同,取不振荡时的30%。
d.系统空载、带载联调,再对PID参数进行微调,直至满足要求。

2.PID控制简介

目前工业自动化水平已成为衡量各行各业现代化水平的一个重要标志。同时,控制理论的发展也经历了古典控制理论、现代控制理论和智能控制理论三个阶段。智能控制的典型实例是模糊全自动洗衣机等。自动控制系统可分为开环控制系统和闭环控制系统。一个控制系统包括控制器、传感器、变送器、执行机构、输入输出接口。控制器的输出经过输出接口、执行机构,加到被控系统上;控制系统的被控量,经过传感器,变送器,通过输入接口送到控制器。不同的控制系统,其传感器、变送器、执行机构是不一样的。比如压力控制系统要采用压力传感器。电加热控制系统的传感器是温度传感器。目前,PID控制及其控制器或智能PID控制器(仪表)已经很多,产品已在工程实际中得到了广泛的应用,有各种各样的PID控制器产品,各大公司均开发了具有PID参数自整定功能的智能调节器(intelligent regulator),其中PID控制器参数的自动调整是通过智能化调整或自校正、自适应算法来实现。有利用PID控制实现的压力、温度、流量、液位控制器,能实现PID控制功能的可编程控制器(PLC),还有可实现PID控制的PC系统等等。 可编程控制器(PLC) 是利用其闭环控制模块来实现PID控制,而可编程控制器(PLC)可以直接与ControlNet相连,如Rockwell的PLC-5等。还有可以实现PID控制功能的控制器,如Rockwell 的Logix产品系列,它可以直接与ControlNet相连,利用网络来实现其远程控制功能。
1、开环控制系统
开环控制系统(open-loop control system)是指被控对象的输出(被控制量)对控制器(controller)的输出没有影响。在这种控制系统中,不依赖将被控量反送回来以形成任何闭环回路。
2、闭环控制系统
闭环控制系统(closed-loop control system)的特点是系统被控对象的输出(被控制量)会反送回来影响控制器的输出,形成一个或多个闭环。闭环控制系统有正反馈和负反馈,若反馈信号与系统给定值信号相反,则称为负反馈( Negative Feedback),若极性相同,则称为正反馈,一般闭环控制系统均采用负反馈,又称负反馈控制系统。闭环控制系统的例子很多。比如人就是一个具有负反馈的闭环控制系统,眼睛便是传感器,充当反馈,人体系统能通过不断的修正最后作出各种正确的动作。如果没有眼睛,就没有了反馈回路,也就成了一个开环控制系统。另例,当一台真正的全自动洗衣机具有能连续检查衣物是否洗净,并在洗净之后能自动切断电源,它就是一个闭环控制系统。
3、阶跃响应
阶跃响应是指将一个阶跃输入(step function)加到系统上时,系统的输出。稳态误差是指系统的响应进入稳态后,系统的期望输出与实际输出之差。控制系统的性能可以用稳、准、快三个字来描述。稳是指系统的稳定性(stability),一个系统要能正常工作,首先必须是稳定的,从阶跃响应上看应该是收敛的;准是指控制系统的准确性、控制精度,通常用稳态误差来(Steady-state error)描述,它表示系统输出稳态值与期望值之差;快是指控制系统响应的快速性,通常用上升时间来定量描述。
4、PID控制的原理和特点
在工程实际中,应用最为广泛的调节器控制规律为比例、积分、微分控制,简称PID控制,又称PID调节。PID控制器问世至今已有近70年历史,它以其结构简单、稳定性好、工作可靠、调整方便而成为工业控制的主要技术之一。当被控对象的结构和参数不能完全掌握,或得不到精确的数学模型时,控制理论的其它技术难以采用时,系统控制器的结构和参数必须依靠经验和现场调试来确定,这时应用PID控制技术最为方便。即当我们不完全了解一个系统和被控对象,或不能通过有效的测量手段来获得系统参数时,最适合用PID控制技术。PID控制,实际中也有PI和PD控制。PID控制器就是根据系统的误差,利用比例、积分、微分计算出控制量进行控制的。
比例(P)控制
比例控制是一种最简单的控制方式。其控制器的输出与输入误差信号成比例关系。当仅有比例控制时系统输出存在稳态误差(Steady-state error)。
积分(I)控制
在积分控制中,控制器的输出与输入误差信号的积分成正比关系。对一个自动控制系统,如果在进入稳态后存在稳态误差,则称这个控制系统是有稳态误差的或简称有差系统(System with Steady-state Error)。为了消除稳态误差,在控制器中必须引入“积分项”。积分项对误差取决于时间的积分,随着时间的增加,积分项会增大。这样,即便误差很小,积分项也会随着时间的增加而加大,它推动控制器的输出增大使稳态误差进一步减小,直到等于零。因此,比例+积分(PI)控制器,可以使系统在进入稳态后无稳态误差。
微分(D)控制
在微分控制中,控制器的输出与输入误差信号的微分(即误差的变化率)成正比关系。 自动控制系统在克服误差的调节过程中可能会出现振荡甚至失稳。其原因是由于存在有较大惯性组件(环节)或有滞后(delay)组件,具有抑制误差的作用,其变化总是落后于误差的变化。解决的办法是使抑制误差的作用的变化“超前”,即在误差接近零时,抑制误差的作用就应该是零。这就是说,在控制器中仅引入“比例”项往往是不够的,比例项的作用仅是放大误差的幅值,而目前需要增加的是“微分项”,它能预测误差变化的趋势,这样,具有比例+微分的控制器,就能够提前使抑制误差的控制作用等于零,甚至为负值,从而避免了被控量的严重超调。所以对有较大惯性或滞后的被控对象,比例+微分(PD)控制器能改善系统在调节过程中的动态特性。
5、PID控制器的参数整定
PID控制器的参数整定是控制系统设计的核心内容。它是根据被控过程的特性确定PID控制器的比例系数、积分时间和微分时间的大小。PID控制器参数整定的方法很多,概括起来有两大类:一是理论计算整定法。它主要是依据系统的数学模型,经过理论计算确定控制器参数。这种方法所得到的计算数据未必可以直接用,还必须通过工程实际进行调整和修改。二是工程整定方法,它主要依赖工程经验,直接在控制系统的试验中进行,且方法简单、易于掌握,在工程实际中被广泛采用。PID控制器参数的工程整定方法,主要有临界比例法、反应曲线法和衰减法。三种方法各有其特点,其共同点都是通过试验,然后按照工程经验公式对控制器参数进行整定。但无论采用哪一种方法所得到的控制器参数,都需要在实际运行中进行最后调整与完善。现在一般采用的是临界比例法。利用该方法进行 PID控制器参数的整定步骤如下:(1)首先预选择一个足够短的采样周期让系统工作;(2)仅加入比例控制环节,直到系统对输入的阶跃响应出现临界振荡,记下这时的比例放大系数和临界振荡周期;(3)在一定的控制度下通过公式计算得到PID控制器的参数。

3.PID控制器参数的工程整定,各种调节系统中PID参数经验数据以下可参照:

温度T: P=20~60%,T=180~600s,D=3-180s

压力P: P=30~70%,T=24~180s,

液位L: P=20~80%,T=60~300s,

流量L: P=40~100%,T=6~60s。

4. PID常用口诀:

参数整定找最佳,从小到大顺序查

先是比例后积分,最后再把微分加

曲线振荡很频繁,比例度盘要放大

曲线漂浮绕大湾,比例度盘往小扳

曲线偏离回复慢,积分时间往下降

曲线波动周期长,积分时间再加长

曲线振荡频率快,先把微分降下来

动差大来波动慢。微分时间应加长

理想曲线两个波,前高后低4比1

一看二调多分析,调节质量不会低
参考资料:http://www.yuanqijian.com/bbs/htmled_topic.php?topi_id=64489

Ⅱ 温度控制的PID算法的C语言程序

//PID算法温控C语言2008-08-17 18:58
#include<reg51.h>
#include<intrins.h>
#include<math.h>
#include<string.h>
struct PID {
unsigned int SetPoint; // 设定目标 Desired Value
unsigned int Proportion; // 比例常数 Proportional Const
unsigned int Integral; // 积分常数 Integral Const
unsigned int Derivative; // 微分常数 Derivative Const
unsigned int LastError; // Error[-1]
unsigned int PrevError; // Error[-2]
unsigned int SumError; // Sums of Errors
};
struct PID spid; // PID Control Structure
unsigned int rout; // PID Response (Output)
unsigned int rin; // PID Feedback (Input)
sbit data1=P1^0;
sbit clk=P1^1;
sbit plus=P2^0;
sbit subs=P2^1;
sbit stop=P2^2;
sbit output=P3^4;
sbit DQ=P3^3;
unsigned char flag,flag_1=0;
unsigned char high_time,low_time,count=0;//占空比调节参数
unsigned char set_temper=35;
unsigned char temper;
unsigned char i;
unsigned char j=0;
unsigned int s;
/***********************************************************
延时子程序,延时时间以12M晶振为准,延时时间为30us×time
***********************************************************/
void delay(unsigned char time)
{
unsigned char m,n;
for(n=0;n<time;n++)
for(m=0;m<2;m++){}
}
/***********************************************************
写一位数据子程序
***********************************************************/
void write_bit(unsigned char bitval)
{
EA=0;
DQ=0; /*拉低DQ以开始一个写时序*/
if(bitval==1)
{
_nop_();
DQ=1; /*如要写1,则将总线置高*/
}
delay(5); /*延时90us供DA18B20采样*/
DQ=1; /*释放DQ总线*/
_nop_();
_nop_();
EA=1;
}
/***********************************************************
写一字节数据子程序
***********************************************************/
void write_byte(unsigned char val)
{
unsigned char i;
unsigned char temp;
EA=0; /*关中断*/
TR0=0;
for(i=0;i<8;i++) /*写一字节数据,一次写一位*/
{
temp=val>>i; /*移位操作,将本次要写的位移到最低位*/
temp=temp&1;
write_bit(temp); /*向总线写该位*/
}
delay(7); /*延时120us后*/
// TR0=1;
EA=1; /*开中断*/
}
/***********************************************************
读一位数据子程序
***********************************************************/
unsigned char read_bit()
{
unsigned char i,value_bit;
EA=0;
DQ=0; /*拉低DQ,开始读时序*/
_nop_();
_nop_();
DQ=1; /*释放总线*/
for(i=0;i<2;i++){}
value_bit=DQ;
EA=1;
return(value_bit);
}
/***********************************************************
读一字节数据子程序
***********************************************************/
unsigned char read_byte()
{
unsigned char i,value=0;
EA=0;
for(i=0;i<8;i++)
{
if(read_bit()) /*读一字节数据,一个时序中读一次,并作移位处理*/
value|=0x01<<i;
delay(4); /*延时80us以完成此次都时序,之后再读下一数据*/
}
EA=1;
return(value);
}
/***********************************************************
复位子程序
***********************************************************/
unsigned char reset()
{
unsigned char presence;
EA=0;
DQ=0; /*拉低DQ总线开始复位*/
delay(30); /*保持低电平480us*/
DQ=1; /*释放总线*/
delay(3);
presence=DQ; /*获取应答信号*/
delay(28); /*延时以完成整个时序*/
EA=1;
return(presence); /*返回应答信号,有芯片应答返回0,无芯片则返回1*/
}
/***********************************************************
获取温度子程序
***********************************************************/
void get_temper()
{
unsigned char i,j;
do
{
i=reset(); /*复位*/
}while(i!=0); /*1为无反馈信号*/
i=0xcc; /*发送设备定位命令*/
write_byte(i);
i=0x44; /*发送开始转换命令*/
write_byte(i);
delay(180); /*延时*/
do
{
i=reset(); /*复位*/
}while(i!=0);
i=0xcc; /*设备定位*/
write_byte(i);
i=0xbe; /*读出缓冲区内容*/
write_byte(i);
j=read_byte();
i=read_byte();
i=(i<<4)&0x7f;
s=(unsigned int)(j&0x0f);
s=(s*100)/16;
j=j>>4;
temper=i|j; /*获取的温度放在temper中*/
}
/*====================================================================================================
Initialize PID Structure
=====================================================================================================*/
void PIDInit (struct PID *pp)
{
memset ( pp,0,sizeof(struct PID));
}
/*====================================================================================================
PID计算部分
=====================================================================================================*/
unsigned int PIDCalc( struct PID *pp, unsigned int NextPoint )
{
unsigned int dError,Error;
Error = pp->SetPoint - NextPoint; // 偏差
pp->SumError += Error; // 积分
dError = pp->LastError - pp->PrevError; // 当前微分
pp->PrevError = pp->LastError;
pp->LastError = Error;
return (pp->Proportion * Error//比例
+ pp->Integral * pp->SumError //积分项
+ pp->Derivative * dError); // 微分项
}
/***********************************************************
温度比较处理子程序
***********************************************************/
compare_temper()
{
unsigned char i;
if(set_temper>temper)
{
if(set_temper-temper>1)
{
high_time=100;
low_time=0;
}
else
{
for(i=0;i<10;i++)
{ get_temper();
rin = s; // Read Input
rout = PIDCalc ( &spid,rin ); // Perform PID Interation
}
if (high_time<=100)
high_time=(unsigned char)(rout/800);
else
high_time=100;
low_time= (100-high_time);
}
}
else if(set_temper<=temper)
{
if(temper-set_temper>0)
{
high_time=0;
low_time=100;
}
else
{
for(i=0;i<10;i++)
{ get_temper();
rin = s; // Read Input
rout = PIDCalc ( &spid,rin ); // Perform PID Interation
}
if (high_time<100)
high_time=(unsigned char)(rout/10000);
else
high_time=0;
low_time= (100-high_time);
}
}
// else
// {}
}
/*****************************************************
T0中断服务子程序,用于控制电平的翻转 ,40us*100=4ms周期
******************************************************/
void serve_T0() interrupt 1 using 1
{
if(++count<=(high_time))
output=1;
else if(count<=100)
{
output=0;
}
else
count=0;
TH0=0x2f;
TL0=0xe0;
}
/*****************************************************
串行口中断服务程序,用于上位机通讯
******************************************************/
void serve_sio() interrupt 4 using 2
{
/* EA=0;
RI=0;
i=SBUF;
if(i==2)
{
while(RI==0){}
RI=0;
set_temper=SBUF;
SBUF=0x02;
while(TI==0){}
TI=0;
}
else if(i==3)
{
TI=0;
SBUF=temper;
while(TI==0){}
TI=0;
}
EA=1; */
}
void disp_1(unsigned char disp_num1[6])
{
unsigned char n,a,m;
for(n=0;n<6;n++)
{
// k=disp_num1[n];
for(a=0;a<8;a++)
{
clk=0;
m=(disp_num1[n]&1);
disp_num1[n]=disp_num1[n]>>1;
if(m==1)
data1=1;
else
data1=0;
_nop_();
clk=1;
_nop_();
}
}
}
/*****************************************************
显示子程序
功能:将占空比温度转化为单个字符,显示占空比和测得到的温度
******************************************************/
void display()
{
unsigned char code number[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};
unsigned char disp_num[6];
unsigned int k,k1;
k=high_time;
k=k%1000;
k1=k/100;
if(k1==0)
disp_num[0]=0;
else
disp_num[0]=0x60;
k=k%100;
disp_num[1]=number[k/10];
disp_num[2]=number[k%10];
k=temper;
k=k%100;
disp_num[3]=number[k/10];
disp_num[4]=number[k%10]+1;
disp_num[5]=number[s/10];
disp_1(disp_num);
}
/***********************************************************
主程序
***********************************************************/
main()
{
unsigned char z;
unsigned char a,b,flag_2=1,count1=0;
unsigned char phil[]={2,0xce,0x6e,0x60,0x1c,2};
TMOD=0x21;
TH0=0x2f;
TL0=0x40;
SCON=0x50;
PCON=0x00;
TH1=0xfd;
TL1=0xfd;
PS=1;
EA=1;
EX1=0;
ET0=1;
ES=1;
TR0=1;
TR1=1;
high_time=50;
low_time=50;
PIDInit ( &spid ); // Initialize Structure
spid.Proportion = 10; // Set PID Coefficients
spid.Integral = 8;
spid.Derivative =6;
spid.SetPoint = 100; // Set PID Setpoint
while(1)
{
if(plus==0)
{
EA=0;
for(a=0;a<5;a++)
for(b=0;b<102;b++){}
if(plus==0)
{
set_temper++;
flag=0;
}
}
else if(subs==0)
{
for(a=0;a<5;a++)
for(b=0;a<102;b++){}
if(subs==0)
{
set_temper--;
flag=0;
}
}
else if(stop==0)
{
for(a=0;a<5;a++)
for(b=0;b<102;b++){}
if(stop==0)
{
flag=0;
break;
}
EA=1;
}
get_temper();
b=temper;
if(flag_2==1)
a=b;
if((abs(a-b))>5)
temper=a;
else
temper=b;
a=temper;
flag_2=0;
if(++count1>30)
{
display();
count1=0;
}
compare_temper();
}
TR0=0;
z=1;
while(1)
{
EA=0;
if(stop==0)
{
for(a=0;a<5;a++)
for(b=0;b<102;b++){}
if(stop==0)
disp_1(phil);
// break;
}
EA=1;
}
}
//DS18b20 子程序
#include <REG52.H>
sbit DQ=P2^1; //定义端口

typedef unsigned char byte;
typedef unsigned int word;
//延时
void delay(word useconds)
{
for(;useconds>0;useconds--);
}
//复位
byte ow_reset(void)
{
byte presence;
DQ=0; //DQ低电平
delay(29); //480us
DQ=1; //DQ高电平
delay(3); //等待
presence=DQ; //presence信号
delay(25);
return(presence);
} //0允许,1禁止
//从1-wire 总线上读取一个字节
byte read_byte(viod)
{
byte i;
byte value=0;
for (i=8;i>0;i--)
{
value>>=1;
DQ=0;
DQ=1;
delay(1);

if(DQ)value|=0x80;
delay(6);
}
return(value);
}

//向1-wire总线上写一个字节
void write_byte(char val)
{
byte i;
for (i=8;i>0;i--) //一次写一个字节
{
DQ=0;
DQ=val&0x01;
delay(5);
DQ=1;
val=val/2;
}
delay(5);
}
//读取温度

char Read_Temperature(void)
{
union{
byte c[2];
int x;
}temp;

ow_reset();
write_byte(0xcc);
write_byte(0xBE);
temp.c[1]=read_byte();
temp.c[0]=read_byte();
ow_reset();
write_byte(0xCC);
write_byte(0x44);
return temp.x/2;
}

Ⅲ 有谁对温度PID控制有了解的吗

在工程中,应用最为广泛的调节器控制方式:比例、积分、微分控制——PID控制(PID调节)。PID控制在实际中有PI、PID、PD、纯I控制等组合。PID控制器就是根据系统的差值(差值=设定值-反馈值),利用比例、积分、微分计算出控制量进行控制的。需要说明的是差值(误差信号)是带符号计算的,如设定温度为200度,仪表反馈温度为180度,差值为+20度。
若仪表反馈温度为220度,则差值为-20度比例(P)控制
比例控制是一种最简单的控制方式。其控制器的输出大小与误差信号成比例关系。当仅有比例控制时系统输出存在稳态误差(Steady-state
error)。
对一个自动控制系统,如果在进入稳态后存在稳态误差,则称这个控制系统是有稳态误差的或简称有差系统(System
with
Steady-state
Error)。积分(I)控制
在积分控制中,控制器的输出大小与误差信号的积分成正比关系。在控制器中引入“积分项”,积分项对误差取决于时间的积分,随着时间的增加,积分项也会随着时间的增加而加大,(注,由于误差是带符号计算的,当误差为0时,积分项输出才停止)。因此,比例+积分(PI)控制器,可以使系统在进入稳态后无稳态误差。
微分(D)控制
在微分控制中,控制器的输出大小与误差信号的微分(即误差变化趋势——变化率)成正比关系。由于存在有较大惯性组件(环节)或有滞后(delay)组件,具有抑制误差的作用,其变化总是落后于误差的变化。比如10自动控制系统在克服误差的调节过程中可能会出现振荡甚至失稳。解决的办法是使抑制误差的作用的变化“超前”。(好比打雷和闪电,闪电发生后,可以事先预测出可能有雷声,提前捂住耳朵)在误差接近零时,抑制误差的作用就应该是零。“微分项”能预测误差变化的趋势。这样,具有比例+微分的控制器,就能够提前使抑制误差的控制作用等于零,甚至为负值,从而避免了被控量的严重超调。所以对有较大惯性或滞后的被控对象,比例+微分(PD)控制器能改善系统在调节过程中的动态特性。

Ⅳ 关于温度控制系统PD/PID算法程序问题

PID控制的概念 所谓的控制首先分有反馈控制和无反馈控制,我们当然讨论的PID当然是有反馈控制了。所谓的有反馈控制无非是要根据被控量的情况参与运算来决定操纵量的大小或者方向,那么到底如何根据被控两来决定操纵量的大小呢,唉,这就有很多分类了,所谓的高级的控制方式也就是“高级”在这个节骨眼上,有什么“自适应控制、模糊控制、预测控制、神经网络控制、专家智能控制”等等(至于到底这些控制方式有什么优点,唉,我只用过PID,别的也说不清楚,去抄书的话也没有说服力,关键是也懒的去抄。那位老弟如果要作论文,可以在这里发挥一下,资料到处都是)。但是就目前而言,在工业控制领域尤其是控制系统的底层,PID控制算法仍然独霸鳌头,占领着80%左右的市场份额,当然,这里所说的PID控制算法不是侠义上的固定PID,现在不是讲究多学科融合吗?人们在PID控制规律中吸取了其他“高级”的控制规律的优点,出现了诸多的新颖的控制器如自校正PID、专家自适应PID、预估PID、模糊PID、神经网络PID、非线性 PID等新型PID控制器。至于所谓的变种的PID算法如什么“遇限削弱微分”微分先行,积分分离“bangbang+PID”等等,已经不算是什么高级的控制方式了作控制器的厂商大多都会或多等等或少的采取一些,至于是神经网络PID,模糊PID,自适应PID是如何实现的,我所知道的就是利用对应的控制算法,适时的调节PID的参数。还是举个例子吧。传统PID的算法公式是: ⊿U(n)=Kp[e(n)-e(n-1)]+Kie(n)+Kd[e(n)-2e(n-1)+e(n-2)] U(n)=⊿U(n)+U(n-1) e(n) ,e(n-1), e(n-2)就是历史上的三个设定值跟过程值之间的偏差了。 这是一个增量式的PID算式(如果有谁不明白什么式增量是算式,呵呵,可能以后会提到,偶的写作水平有限,不会组织内容,再说我是想到哪,写道哪,呵呵,见凉)。 所谓的新型PID控制器,就是根据e(n)的不同,利用那些先进的控制规律来适当的调整Kp,Ki,Ke。至于怎么调整,呵呵,这就太罗嗦了,也不是这篇内容所该介绍的,(关键是我也不太清楚,呵呵,见笑),需要这些功能的大侠应该是我的前辈,还请指教哟。 好了,现在正式介绍一下所谓的PID各个参数吧。 所谓的PID大家在大学期间都应该学过,就是比例(P)、积分(I)、微分(D)。 比例控制:就是对偏差进行控制,偏差一旦产生,控制器立即就发生作用即调节控制输出,使被控量朝着减小偏差的方向变化,偏差减小的速度取决于比例系数Kp, Kp越大偏差减小的越快,但是很容易引起振荡,尤其是在迟滞环节比较大的情况下,Kp减小,发生振荡的可能性减小但是调节速度变慢。但单纯的比例控制存在静差不能消除的缺点。这里就需要积分控制。 积分控制:实质上就是对偏差累积进行控制,直至偏差为零。积分控制作用始终施加指向给定值的作用力,有利于消除静差,其效果不仅与偏差大小有关,而且还与偏差持续的时间有关。简单来说就是把偏差积累起来,一起算总帐。 微分控制:它能敏感出误差的变化趋势,可在误差信号出现之前就起到修正误差的作用,有利于提高输出响应的快速性,减小被控量的超调和增加系统的稳定性。但微分作用很容易放大高频噪声,降低系统的信噪比,从而使系统抑制干扰的能力下降。因此,在实际应用中,应慎用微分控制,尤其是当你开始作实验时,不防将微分控制项去掉,看看行不行,呵呵,不行啊?还是看看别的地方吧,肯定行的。 行了,这三个参数说明白了,再来说说怎么确定这几个参数的数值吧。这几个参数的确定比较先进的方式是自整定,但是如果是开始涉及这部分还是先不要讲了,按照经验值吧。估计大家用来控制温度比较多。大家按照这个规律来选吧。 Kp=100/P Ki= kp*T/I Kd= kp*D/T 分别介绍一下各个参数的意义: T:计算周期,就是各多少时间计算一次 ⊿U(n)=Kp[e(n)-e(n-1)]+Kie(n)+Kd[e(n)-2e(n-1)+e(n-2)],单位是秒。一般1秒或者0.5秒甚至5秒都行。 P:比例带 I:积分时间 D:微分时间 P、I、D跟kp,ki,kd有什么关系呢? Kp=100/P, Ki=kp*T/I Kd=kp*D/T 然后就可以计算 ⊿U(n)=Kp[e(n)-e(n-1)]+Kie(n)+Kd[e(n)-2e(n-1)+e(n-2)] 算出来⊿U(n)之后再怎么办呢?怎么把这一个数据跟控制输出联系在一起呢?说道这里我们先说说PID控制方式大体都有那些? 其一为线形连续PID输出,也就是说,PID运算的结果以模拟电压,电流或者可控硅导通角的形式按比例输出。 其二为时间-比例PID输出,也就是说,事先定一个时间长度,T1,然后PID运算的结果就在控制周期内以ON-OFF的形式输出出来,比如你控制一个炉子的温度,用电热丝来加热,就可以控制电热丝的一个控制周期内通电占整个控制周期的比例来实现,电路上可以用继电器或者过零触发的方式来切断或者接通电热丝供电。 起三为位置比例PID,PID运算的结果主要是对应于调节阀的阀门开度。 再回到前面,我们以第二种控制方式为例,计算出⊿U(n)后,一般首先将其归一化,也就是说除以你所要控制的温度的量程。 ⊿U(n)0_1=⊿U(n)/(hh-ll) 而时间比例PID输出对应的是“位置式PID运算”的结果 所以呢,我们要讲结果累积起来, U(n)0_1+=⊿U(n)0_1 然后将次结果换算成对应于控制周期的占空比。来输出

Ⅳ 请教温控PID增量型算法公式

南京星德机械提供:增量式PID控制算法

当执行机构需要的不是控制量的绝对值,而是控制量的增量(例如去驱

动步进电动机)时,需要用PID的“增量算法”。

Ⅵ 几种常用温控算法的比较与总结

        最近在做一个有关大气VOCs实时监测的项目,由于该项目要求控温精度在0.1度之内,所以就研究了一下有关温控的算法,我们知道对于一些大惯性的系统,比如加热炉、智能小车中都会用到PID(比例、积分和微分)算法,而PID算法分为二值式、位置式、增量式和分段式,当然也有模糊式等。现根据在实际项目中的应用情况将其总结如下:

        (1)二值式

        二值式温控算法只存在两个状态,不是开,就是关。常用在一些控温精度不高的场合。

        (2)位置式

        位置式PID算法由于计算量比较大,降低了单片机的运行速度,需要单片机比较大的内存,所以在实际应用中应用的比较少,除非有特除要求的场合。

        (3)增量式

        增量式PID算法相比二值式控温精度比较高,相比位置式计算量减少了许多,提高了单片机的运行速度,也增大了单片机的选择余地(内存要求降低)。为了提高温控的速度,减少温控所需要的时间,所以该增加式PID算法常与BangBang算法、大林算法相结合使用。BangBang算法和大林算法即是全功率加热,比如BangBang-PID算法通过会有一个阈值,一旦采用BangBang或大林算法升温到阈值时,就会自动切换到增量式PID算法进行控温。另外该阈值的选择是个难点,阈值小了,升温时间比较长,阈值大了,过冲量比较大,所以说该阈值的选择需要从以下两个方面去确定:升温速率、距离设定值的差值大小等方面。

        (4)分段式

        分段式PID算法虽然比模糊PID算法差一些,但是模糊PID控制大多数还停留在理论阶段,应用到实际系统的还比较少,控制效果如何还不是很确定。分段式PID算法在某些方面与模糊式PID算法有很多相近的地方,也是对信号进行阈值的划分,然后在不同的阈值阶段采用不同的控制参数。分段PID优于模糊PID的地方在于我们现有的工控机在编辑控制算法时是数字式的,模糊PID算法要想实现其功能除了要进行数据的离散化外,其用到的数据参数也比较多导致统计起来比较麻烦,经过以上对比分析,从系统的可实现性方面考虑,还是采用分段式PID算法的比较多些。

        根据项目的实际控制结果表明单纯的采用单一的PID参数进行调节要想达到较为理想的控制效果是不容易的。所以可以根据控制对象的实际情况及偏差的大小,在不同的控制阶段给定不同的PID调节参数,这样可以在偏差大的时候加大比例调节,降低积分作用,偏差小的时候减少比例作用,加大积分作用。这样既可以增加响应速度,超调量也不会太大,这就是分段PID的控制思想。  下面对普通PID与分段PID在同一控制变量下做出的反应做一下对比,他们的输出曲线如下图:

        在上图输出曲线中可以看出在目标值情况相同的情况下,分段PID的响应速度更快,达到目标值时分段PID比普通PID所用的时间少一半,所用控制系统的快速性被分段PID明显提高了。采用分段PID即是将一个控制过程进行分段控制,可以避免采用单一PID控制时对误差积累较多的缺点(采用单一PID算法时,刚开始启动时目标值与实际值的差值会很大,如果有积分变量的话,积分变量大了会导致较大的积累偏差,导致消除困难,造成系统较大的系统超调;积分变量小了会导致精差消除较慢。),这样在每一阶段都对误差进行消除,最后误差结果会小很多。分段PID算法的实现步骤:这里假定阈值a为偏差的50%,阈值b为偏差的30%。

        a、根据工程需要设置阈值a>b>0;

        b、当偏差较大,且偏差大于等于a时,采用PD控制,可加快系统响应;

        c、当偏差较小,且大于b,小于a时采用PI控制;

        d、当偏差小于b时,采用PID控制(P设的小些,I设的大些),可减少系统精差。

        以上是对几种常用PID算法的比较和总结,在实际的项目中用的比较多的是增量式PID算法和分段式PID算法,分段式PID算比单一的增量式PID算法控温速度快,精度更高,虽然分段PID算法参数整定比较繁琐些,但鉴于它的控制速度快、精度高,还是推荐使用分段PID算法应用于温度控制、电机控制等领域或项目中。

Ⅶ 基于PID算法的单片机温度控制系统设计(实现制冷效果)

看看我以前回答过的一个问题,或许有帮助。
所谓PID指的是Proportion-Integral-Differential。翻译成中文是比例-积分-微分。
记住两句话:
1、PID是经典控制(使用年代久远)
2、PID是误差控制()
压缩泵转速进行控制:
1、变频器-作为压缩机驱动;2、温度传感器-作为输出反馈。
PID怎么对误差控制,听我细细道来:
所谓“误差”就是命令与输出的差值。比如你希望控制压缩机转速为1500转(“命令电压”=6V),而事实上控制压缩机转速只有1000转(“输出电压”=4V),则误差: e=500转(对应电压2V)。如果泵实际转速为2000转,则误差e=-500转(注意正负号)。
该误差值送到PID控制器,作为PID控制器的输入。PID控制器的输出为:误差乘比例系数Kp+Ki*误差积分+Kd*误差微分。
Kp*e + Ki*∫edt + Kd*(de/dt) (式中的t为时间,即对时间积分、微分)
上式为三项求和(希望你能看懂),PID结果后送入电机变频器或驱动器。
从上式看出,如果没有误差,即e=0,则Kp*e=0;Kd*(de/dt)=0;而Ki*∫edt 不一定为0。三项之和不一定为0。
总之,如果“误差”存在,PID就会对变频器作调整,直到误差=0。
评价一个控制系统是否优越,有三个指标:快、稳、准。
所谓快,就是要使压力能快速地达到“命令值”(不知道你的系统要求多少时间)
所谓稳,就是要压力稳定不波动或波动量小(不知道你的系统允许多大波动)
所谓准,就是要求“命令值”与“输出值”之间的误差e小(不知道你的系统允许多大误差)
对于你的系统来说,要求“快”的话,可以增大Kp、Ki值
要求“准”的话,可以增大Ki值
要求“稳”的话,可以增大Kd值,可以减少压力波动
仔细分析可以得知:这三个指标是相互矛盾的。
如果太“快”,可能导致不“稳”;
如果太“稳”,可能导致不“快”;
只要系统稳定且存在积分Ki,该系统在静态是没有误差的(会存在动态误差);
所谓动态误差,指当“命令值”不为恒值时,“输出值”跟不上“命令值”而存在的误差。不管是谁设计的、再好的系统都存在动态误差,动态误差体现的是系统的跟踪特性,比如说,有的音响功放对高频声音不敏感,就说困厅明功放跟踪性能不好。
调整PID参数有两种方法:1、仿真法;2、“试凑法”
仿真法我想你是不会的,介绍一下“试凑法”
“试凑法”设置PID参数的建议步骤:
1、把Ki与Kd设为0,不要积分与微分;
2、把Kp值从0开始慢慢增大,观察压力的反应速度是否在你的要求内;
3、当压力的反应速度达到扰卖你的要求,停止增大Kp值;
4、在该Kp值的基础上减少10%;
5、把Ki值从0开始慢慢增大;
6、当压力开始波动,停止增大Ki值;
7、在该Ki值的基础上减少10%;
8、把Kd值从0开始慢慢缓尺逗增大,观察压力的反应速度是否在你的要求内;

Ⅷ pid_PWM 温控pwm 利用pid算法

PID算法本身是很简单的,你随便找本讲PID的书,大胆的把公式抄上,肯定就能用。

至于好用不好用的问题,在于另外两点,
第一是你用的参数的精度问题,如果你全部用浮点数来计算,当然不会出错,但程序可能会很大,可能大到你无法接受(看你用的什么芯片了),如果你用短整,或者长整来做,那么小数点后面的精度会被丢弃,严重的时候,你有算法无法正常运行。一般是用定点数来做,说白了就是用整数做,但整数1不要代表1度,而是代表0.1度,0.01度,或者16分之一度,具体的你自己来约定。
第二,是关于PID的几个参数的整定问题,这个需要经验,网上可以找到一些口诀,但具体操作还是要经验的。整定好的PID才是能用的PID,整定不好,温度就会失控。

回到你的问题,你需要先决定你的输出的精度,比如你的PWM输出是几位精度的,可能是8位,也可能是10位,假设是10位,那么输出是大值就是1023,最小值是0。你套上公式计算,像这样,以浮点数为例
EK_1 = EK;
Ek = settemp - runtemp;
Up = Ek * KP; // KP 是设定的比例系数,需要整定
Ui = Ui + Ek * Ki;
Ud = ( EK - EK_1 ) * Kd;
Upid = Uk + Ui + Ud;
整定KP, Ki, Kd,使Upid 的范围在+/-1.0范围,
最后
PWM_Out( Upid * 1024 );

热点内容
网易我的世界如何登陆服务器 发布:2025-03-11 06:23:22 浏览:713
用电脑玩逆战连接服务器很久 发布:2025-03-11 06:13:18 浏览:181
天翼智能路由器的初始密码是多少 发布:2025-03-11 06:10:17 浏览:914
安卓机怎么领岭南通 发布:2025-03-11 05:56:54 浏览:132
求生之路2虐电脑服务器 发布:2025-03-11 05:35:40 浏览:632
编译学堂 发布:2025-03-11 05:31:06 浏览:185
苹果文件夹隐藏 发布:2025-03-11 05:26:42 浏览:546
短信设置密码如何关闭 发布:2025-03-11 05:26:39 浏览:915
re管理器主文件夹 发布:2025-03-11 05:26:37 浏览:714
手机优酷缓存在哪 发布:2025-03-11 05:25:58 浏览:434