千萬建筑資料下載 →
我的題目是:基于PID算法的溫度控制系統(tǒng)
89C51單片機,通過鍵盤輸入預(yù)設(shè)值,與DS18B20測得的實際值做比較,然后驅(qū)動制冷或加熱電路。用keilC語言來實現(xiàn)PID的控制。
最佳答案
//PID算法溫控C語言2008-08-1718:58
#include<reg51.h>
#include<intrins.h>
#include<math.h>
#include<string.h>
structPID{
unsignedintSetPoint;//設(shè)定目標(biāo)DesiredValue
unsignedintProportion;//比例常數(shù)ProportionalConst
unsignedintIntegral;//積分常數(shù)IntegralConst
unsignedintDerivative;//微分常數(shù)DerivativeConst
unsignedintLastError;//Error[-1]
unsignedintPrevError;//Error[-2]
unsignedintSumError;//SumsofErrors
};
structPIDspid;//PIDControlStructure
unsignedintrout;//PIDResponse(Output)
unsignedintrin;//PIDFeedback(Input)
sbitdata1=P1^0;
sbitclk=P1^1;
sbitplus=P2^0;
sbitsubs=P2^1;
sbitstop=P2^2;
sbitoutput=P3^4;
sbitDQ=P3^3;
unsignedcharflag,flag_1=0;
unsignedcharhigh_time,low_time,count=0;//占空比調(diào)節(jié)參數(shù)
unsignedcharset_temper=35;
unsignedchartemper;
unsignedchari;
unsignedcharj=0;
unsignedints;
/***********************************************************
延時子程序,延時時間以12M晶振為準(zhǔn),延時時間為30us×time
***********************************************************/
voiddelay(unsignedchartime)
{
unsignedcharm,n;
for(n=0;n<time;n++)
for(m=0;m<2;m++){}
}
/***********************************************************寫一位數(shù)據(jù)子程序
***********************************************************/voidwrite_bit(unsignedcharbitval)
{
EA=0;
DQ=0;/*拉低DQ以開始一個寫時序*/
if(bitval==1)
{
_nop_();
DQ=1;/*如要寫1,則將總線置高*/
}
delay(5);/*延時90us供DA18B20采樣*/
DQ=1;/*釋放DQ總線*/
_nop_();
_nop_();
EA=1;
}
/***********************************************************寫一字節(jié)數(shù)據(jù)子程序
***********************************************************/voidwrite_byte(unsignedcharval)
{
unsignedchari;
unsignedchartemp;
EA=0;
TR0=0;
for(i=0;i<8;i++)/*寫一字節(jié)數(shù)據(jù),一次寫一位*/{
temp=val>>i;/*移位操作,將本次要寫的位移到最低位*/temp=temp&1;
write_bit(temp);/*向總線寫該位*/
}
delay(7);/*延時120us后*/
//TR0=1;
EA=1;/*開中斷*/
}
/***********************************************************讀一位數(shù)據(jù)子程序/*關(guān)中斷*/
***********************************************************/
unsignedcharread_bit()
{
unsignedchari,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);
}
/***********************************************************
讀一字節(jié)數(shù)據(jù)子程序
***********************************************************/
unsignedcharread_byte()
{
unsignedchari,value=0;
EA=0;
for(i=0;i<8;i++)
{
if(read_bit())/*讀一字節(jié)數(shù)據(jù),一個時序中讀一次,并作移位處理*/value|=0x01<<i;
delay(4);/*延時80us以完成此次都時序,之后再讀下一數(shù)據(jù)*/}
EA=1;
return(value);
}
/***********************************************************
復(fù)位子程序
***********************************************************/
unsignedcharreset()
{
unsignedcharpresence;
EA=0;
DQ=0;/*拉低DQ總線開始復(fù)位*/
delay(30);/*保持低電平480us*/
DQ=1;/*釋放總線*/
delay(3);
presence=DQ;/*獲取應(yīng)答信號*/
delay(28);/*延時以完成整個時序*/
EA=1;
return(presence);/*返回應(yīng)答信號,有芯片應(yīng)答返回0,無芯片則返回1*/
}
/***********************************************************
獲取溫度子程序
***********************************************************/
voidget_temper()
{
unsignedchari,j;
do
{
i=reset();/*復(fù)位*/
}while(i!=0);/*1為無反饋信號*/
i=0xcc;/*發(fā)送設(shè)備定位命令*/
write_byte(i);
i=0x44;/*發(fā)送開始轉(zhuǎn)換命令*/
write_byte(i);
delay(180);/*延時*/
do
{
i=reset();/*復(fù)位*/
}while(i!=0);
i=0xcc;/*設(shè)備定位*/
write_byte(i);
i=0xbe;/*讀出緩沖區(qū)內(nèi)容*/
write_byte(i);
j=read_byte();
i=read_byte();
i=(i<<4)&0x7f;
s=(unsignedint)(j&0x0f);
s=(s*100)/16;
j=j>>4;
temper=i|j;/*獲取的溫度放在temper中*/
}
/*====================================================================================================
InitializePIDStructure
=====================================================================================================*/
voidPIDInit(structPID*pp)
{
memset(pp,0,sizeof(structPID));
}
/*====================================================================================================
PID計算部分
=====================================================================================================*/
unsignedintPIDCalc(structPID*pp,unsignedintNextPoint)
{
unsignedintdError,Error;
Error=pp->SetPoint-NextPoint;//偏差
pp->SumError+=Error;//積分
dError=pp->LastError-pp->PrevError;//當(dāng)前微分
pp->PrevError=pp->LastError;
pp->LastError=Error;
return(pp->Proportion*Error//比例
+pp->Integral*pp->SumError
+pp->Derivative*dError);//
}
/***********************************************************
溫度比較處理子程序
***********************************************************/
compare_temper()
{
unsignedchari;
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;//ReadInput
rout=PIDCalc(&spid,rin);//PerformPIDInteration
}
if(high_time<=100)
high_time=(unsignedchar)(rout/800);
else//積分項微分項
溫度控制的PID算法的C語言程序1.doc下載high_time=100;
low_time=(100-high_time);
}
}
elseif(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;//ReadInput
rout=PIDCalc(&spid,rin);//PerformPIDInteration}
if(high_time<100)
high_time=(unsignedchar)(rout/10000);
else
high_time=0;
low_time=(100-high_time);
}
}
//else
//{}
}
/*****************************************************
T0中斷服務(wù)子程序,用于控制電平的翻轉(zhuǎn),40us*100=4ms周期******************************************************/
voidserve_T0()interrupt1using1
{
if(++count<=(high_time))
output=1;
elseif(count<=100)
{
output=0;
}
else
count=0;
TH0=0x2f;
TL0=0xe0;
}
/*****************************************************串行口中斷服務(wù)程序,用于上位機通訊
******************************************************/voidserve_sio()interrupt4using2
{
/*EA=0;
RI=0;
i=SBUF;
if(i==2)
{
while(RI==0){}
RI=0;
set_temper=SBUF;
SBUF=0x02;
while(TI==0){}
TI=0;
}
elseif(i==3)
{
TI=0;
SBUF=temper;
while(TI==0){}
TI=0;
}
EA=1;*/
}
voiddisp_1(unsignedchardisp_num1[6]){
unsignedcharn,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_();
}
}
}
/*****************************************************
顯示子程序
功能:將占空比溫度轉(zhuǎn)化為單個字符,顯示占空比和測得到的溫度
******************************************************/
voiddisplay()
{
unsignedcharcodenumber[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};unsignedchardisp_num[6];
unsignedintk,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()
{
unsignedcharz;
unsignedchara,b,flag_2=1,count1=0;
unsignedcharphil[]={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);//InitializeStructure
spid.Proportion=10;//SetPIDCoefficientsspid.Integral=8;
spid.Derivative=6;
spid.SetPoint=100;//SetPIDSetpointwhile(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;
}
}
elseif(subs==0)
{
for(a=0;a<5;a++)
for(b=0;a<102;b++){}
if(subs==0)
{
set_temper--;
flag=0;
}
}
elseif(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>sbitDQ=P2^1;
typedefunsignedchar
typedefunsignedintbyte;word;
//延時
voiddelay(worduseconds){
for(;useconds>0;useconds--);}
//復(fù)位
byteow_reset(void){
bytepresence;
DQ=0;
delay(29);
DQ=1;
delay(3);
presence=DQ;
delay(25);
return(presence);
}
byteread_byte(viod){
bytei;
bytevalue=0;
for(i=8;i>0;i--)
{
value>>=1;
DQ=0;
DQ=1;
delay(1);
if(DQ)value|=0x80;delay(6);
}
return(value);//0允許,1禁止//從1-wire總線上讀取一個字節(jié)//DQ低電平//480us//DQ高電平//等待//presence信號//定義端口
第11 / 39頁
}
//向1-wire總線上寫一個字節(jié)
voidwrite_byte(charval){
byte
{
DQ=0;
DQ=val&0x01;
delay(5);
DQ=1;
val=val/2;
}
delay(5);
}
//讀取溫度
charRead_Temperature(void){
union{
bytec[2];
intx;
}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
}
參考資料:你把這兩個程序組合就可以了i;//一次寫一個字節(jié)for(i=8;i>0;i--)temp.x/2;
PID算法
PID算法是本程序中的核心部分。我們采用PID模糊控制技術(shù),通過Pvar、Ivar、Dvar(比例、積分、微分)三方面的結(jié)合調(diào)整形成
模糊控制來解決慣性溫度誤差問題。其原理如下:
本系統(tǒng)的溫度控制器的電熱元件之一是發(fā)熱絲。發(fā)熱絲通過電流加熱時,內(nèi)部溫度都很高。當(dāng)容器內(nèi)溫度升高至設(shè)定溫度時,溫度
器會發(fā)出信號停止加熱。但這時發(fā)熱絲的溫度會高于設(shè)定溫度,發(fā)熱絲還將會對被加熱的器件進(jìn)行加熱,即使溫度控制器發(fā)出信號停止加熱
加熱器件的溫度還往往繼續(xù)上升幾度,然后才開始下降。當(dāng)下降到設(shè)定溫度的下限時,溫度控制器又開始發(fā)出加熱的信號,開始加熱,但發(fā)
要把溫度傳遞到被加熱器件需要一定的時候,這就要視發(fā)熱絲與被加熱器件之間的介質(zhì)情況而定。通常開始重新加熱時,溫度繼續(xù)下降幾度
生一種慣性溫度誤差。
增量式PID算法的輸出量為
ΔUn=Kp[(en-en-1)+(T/Ti)en+(Td/T)(en-2*en-1+en-2)]以,傳統(tǒng)的定點開關(guān)控制溫度會有正負(fù)誤差幾度的現(xiàn)象,但這不是溫度控制器本身的問題,而是整個熱系統(tǒng)的結(jié)構(gòu)性問題,使溫度控制器控
式中,en、en-1、en-2分別為第n次、n-1次和n-2次的偏差值,Kp、Ti、Td分別為比例系數(shù)、積分系數(shù)和微分系數(shù),T為采樣周
計算機每隔固定時間T將現(xiàn)場溫度與用戶設(shè)定目標(biāo)溫度的差值帶入增量式PID算法公式,由公式輸出量決定PWM方波的占空比,后
偏差迅速減少;反之,二者的偏差小則占空比減小,加熱電路加熱功率減少,直至目標(biāo)值與實測值相等,達(dá)到自動控制的目的。
法,根據(jù)工藝對控制性能的要求,決定調(diào)節(jié)器的參數(shù)。各個參數(shù)對系統(tǒng)性能的影響如下:熱電路根據(jù)此PWM方波的占空比決定加熱功率,F(xiàn)場溫度與目標(biāo)溫度的偏差大則占空比大,加熱電路的加熱功率大,使溫度的實測值與設(shè)定PID參數(shù)的選擇是實驗成敗的關(guān)鍵,它決定了溫度控制的準(zhǔn)確度。數(shù)字PID調(diào)節(jié)器參數(shù)的整定可以仿照模擬PID調(diào)節(jié)器參數(shù)整定的各
①比例系數(shù)P對系統(tǒng)性能的影響:比例系數(shù)加大,使系統(tǒng)的動作靈敏,速度加快,穩(wěn)態(tài)誤差減;P偏大,振蕩次數(shù)加多,調(diào)節(jié)時間
P的符號選擇不當(dāng)對象測量值就會離控制目標(biāo)的設(shè)定值越來越遠(yuǎn),如果出現(xiàn)這樣的情況P的符號就一定要取反。
控制精度。P太大時,系統(tǒng)會趨于不穩(wěn)定;P太小,又會使系統(tǒng)的動作緩慢。P可以選負(fù)數(shù),這主要是由執(zhí)行機構(gòu)、傳感器以及控制對象的特性決定的。②積分控制I對系統(tǒng)性能的影響:積分作用使系統(tǒng)的穩(wěn)定性下降,I。ǚe分作用強)會使系統(tǒng)不穩(wěn)定,但能消除穩(wěn)態(tài)誤差,提高系
③微分控制D對系統(tǒng)性能的影響:微分作用可以改善動態(tài)特性,D偏大時,超調(diào)量較大,調(diào)節(jié)時間較短;D偏小時,超調(diào)量也較大,調(diào)節(jié)時間
長;只有D合適,才能使超調(diào)量較小,減短調(diào)節(jié)時間。溫底控制PID的算法設(shè)計及實現(xiàn)
PID簡介
PID(ProportionalIntegralDerivative)控制是控制工程中技術(shù)成熟、應(yīng)用廣泛的一種控制策略,經(jīng)過長期的工程實踐,已形成了一控制方法和典型的結(jié)構(gòu)。它不僅適用于數(shù)學(xué)模型已知的控制系統(tǒng)中,而且對于大多數(shù)數(shù)學(xué)模型難以確定的工業(yè)過程也可應(yīng)用,在眾多工業(yè)過取得了滿意的應(yīng)用效果。
PID工作基理:由于來自外界的各種擾動不斷產(chǎn)生,要想達(dá)到現(xiàn)場控制對象值保持恒定的目的,控制作用就必須不斷的進(jìn)行。若擾動出現(xiàn)控制對象值(以下簡稱被控參數(shù))發(fā)生變化,現(xiàn)場檢測元件就會將這種變化采集后經(jīng)變送器送至PID控制器的輸入端,并與其給定值(以下簡行比較得到偏差值(以下簡稱e值),調(diào)節(jié)器按此偏差并以我們預(yù)先設(shè)定的整定參數(shù)控制規(guī)律發(fā)出控制信號,去改變調(diào)節(jié)器的開度,使調(diào)節(jié)器加或減少,從而使現(xiàn)場控制對象值發(fā)生改變,并趨向于給定值(SP值),以達(dá)到控制目的,如圖1所示,其實PID的實質(zhì)就是對偏差(e例、積分、微分運算,根據(jù)運算結(jié)果控制執(zhí)行部件的過程。
模擬PID控制系統(tǒng)原理圖PID
控制器的控制規(guī)律可以描述為:
(1)
比例(P)控制能迅速反應(yīng)誤差,從而減小穩(wěn)態(tài)誤差。但是,比例控制不能消除穩(wěn)態(tài)誤差。比例放大系數(shù)的加大,會引起系統(tǒng)的不穩(wěn)定。控制的作用是:只要系統(tǒng)有誤差存在,積分控制器就不斷地積累,輸出控制量,以消除誤差。因而,只要有足夠的時間,積分控制將能完全,使系統(tǒng)誤差為零,從而消除穩(wěn)態(tài)誤差。積分作用太強會使系統(tǒng)超調(diào)加大,甚至使系統(tǒng)出現(xiàn)振蕩。微分(D)控制可以減小超調(diào)量,克服振蕩的穩(wěn)定性提高,同時加快系統(tǒng)的動態(tài)響應(yīng)速度,減小調(diào)整時間,從而改善系統(tǒng)的動態(tài)性能。根據(jù)不同的被控對象的控制特性,又可以分為PID等不同的控制模型。
ID的實現(xiàn)
在連續(xù)-時間控制系統(tǒng)(模擬PID控制系統(tǒng))中,PID控制器應(yīng)用得非常廣泛。其設(shè)計技術(shù)成熟,長期以來形成了典型的結(jié)構(gòu),參數(shù)整定更改靈活,能滿足一般的控制要求。隨著計算機的快速發(fā)展,人們將計算機引入到PID控制領(lǐng)域,也就出現(xiàn)了數(shù)字式PID控制。
由于計算機基于采樣控制理論,計算方法也不能沿襲傳統(tǒng)的模擬PID控制算法(如公式1所示),所以必須將控制模型離散化,離散化以
T為采樣周期,k為采樣序號,用求和的形式代替積分,用增量的形式(求差)代替微分,這樣可以將連續(xù)的PID
計算公式離散:(2)
就可以離散為:
(3)
:
(4)
這樣就可以讓計算機或者單片機通過采樣的方式實現(xiàn)PID控制,具體的PID控制又分為位置式PID控制和增量式PID控制,公式4給出
的全部大小,所以稱之為全量式或者位置式控制;如果計算機只對相鄰的兩次作計算,只考慮在前一次基礎(chǔ)上,計算機輸出量的大小變化,部輸出信息的計算,這種控制叫做增量式PID控制算法,其實質(zhì)就是求Δμ的大小,而Δμk=μk-μk-1;所以將式4
做自減變換有
(5)
控制PID算法設(shè)計
本設(shè)計利用了上面所介紹的位置式PID算法,將溫度傳感器采樣輸入作為當(dāng)前輸入,然后與設(shè)定值進(jìn)行相減得偏差ek,然后再對之進(jìn)行產(chǎn)生輸出結(jié)果fOut,然后讓fOut控制定時器的時間進(jìn)而控制加熱器。為了方便PID運算,首先建立一個PID的結(jié)構(gòu)體數(shù)據(jù)類型,該數(shù)據(jù)類存PID運算所需要的P、I、D系數(shù),以及設(shè)定值,歷史誤差的累加和等信息:
efstructPID
SetPoint;//設(shè)定目標(biāo)DesiredValue
Proportion;//比例系數(shù)ProportionalConst
Integral;//積分系數(shù)IntegralConst
Derivative;//微分系數(shù)DerivativeConst
astError;//上次偏差
umError;//歷史誤差累計值
;
tPID;//定義一個stPID變量
下面是PID運算的算法程序,通過PID運算返回fOut,fOut的值決定是否加熱,加熱時間是多少。
運算的C實現(xiàn)代碼:
PIDCalc(PID*pp,intNextPoint)
Error,Error;
第15 / 39頁
=pp->SetPoint*10-NextPoint;//偏差,設(shè)定值減去當(dāng)前采樣值
umError+=Error;//積分,歷史偏差累加
r=Error-pp->LastError;//當(dāng)前微分,偏差相減
revError=pp->LastError;//保存
astError=Error;
>Integral*pp->SumError//積分項
>Derivative*dError//微分項
在實際運算時,由于水具有很大的熱慣性,而且PID運算中的I(積分項)具有非常明顯的延遲效應(yīng)所以不能保留,我們必須把積分項去(微分項)則有很強的預(yù)見性,能夠加快反應(yīng)速度,抑制超調(diào)量,所以積分作用應(yīng)該適當(dāng)加強才能達(dá)到較佳的控制效果,系統(tǒng)最終選擇PD,下面C代碼所示為PD控制的實現(xiàn)過程:
PIDCalc(PID*pp,intNextPoint)
Error,Error;
=pp->SetPoint*10-NextPoint;//偏差,設(shè)定值減去當(dāng)前采樣值
r=Error-pp->LastError;//當(dāng)前微分,偏差相減
revError=pp->LastError;//保存
astError=Error;
n(pp->Proportion*Error//比例項
>Derivative*dError//微分項
控制實現(xiàn)
通過溫度的PID運算,產(chǎn)生結(jié)果fOut,該參數(shù)決定是否加熱,加熱時間是多長。該程序如下:
.Proportion=2;//設(shè)置PID比例值
.Integral=0;//設(shè)置PID積分值
.Derivative=5;//設(shè)置PID微分值
=PIDCalc(&stPID,(int)(fT*10));//PID計算
ut<=0)
A_Buffer&=0xff7f;//溫度高于設(shè)定值,關(guān)閉加熱器
A_Buffer|=0x0080;//溫度低于設(shè)定值,打開加熱器
加熱時間由主函數(shù)計算,由TimerB中斷控制。主程序中通過PIDCalc函數(shù)得到fOut參數(shù),如果該參數(shù)大于“0”,則開啟加熱器。IR斷一直處于允許狀態(tài),每進(jìn)入一次IRQ2_TMB中斷,fOut參數(shù)減1,直到fOut=0,停止加熱。如果PIDCalc計算結(jié)果比較大說明離目標(biāo)溫大,則加熱時間比較長,如果計算結(jié)果比較小,說明離目標(biāo)溫度相差較小,加熱時間相對較短。
基于PID算法和89C52單片機的溫度控
制系統(tǒng)
作者:張艷艷安徽電子信息職業(yè)技術(shù)學(xué)院來源:現(xiàn)代電子技術(shù)發(fā)布時間:2009-12-2217:36:09[收藏]
[]
基于PID算法和89C52單片機的溫度控制系統(tǒng)
0引言
溫控技術(shù)無論是在工業(yè)生產(chǎn),還是日常生活中都起著非常重要的作用。在冶金、石油、化工、電力和現(xiàn)
代農(nóng)業(yè)等行業(yè),溫度是極為重要而又普遍的熱工參數(shù)之一,在普通家庭里熱水器、電飯煲、電烤箱等依賴
于溫控技術(shù)的家電設(shè)備也是必不可少?梢哉f溫度控制技術(shù)無處不在。
常規(guī)的溫度控制方法以設(shè)定溫度為臨界點,超出設(shè)定允許范圍即進(jìn)行溫度調(diào)控:低于設(shè)定值就加熱,反
之就停止或降溫。這種方法實現(xiàn)簡單、成本低,但控制效果不理想,控制溫度精度不高、容易引起震蕩,
達(dá)到穩(wěn)定點的時間也長,因此,只能用在精度要求不高的場合。
而采用PID算法進(jìn)行溫度控制,它具有控制精度高,能夠克服容量滯后的特點,特別適用于負(fù)荷變化大、
容量滯后較大、控制品質(zhì)要求又很高的控制系統(tǒng)。
單片機作為控制系統(tǒng)中必不可少的部分,在各個領(lǐng)域得到了廣泛的應(yīng)用,用單片機進(jìn)行實時系統(tǒng)數(shù)據(jù)處
理和控制,保證系統(tǒng)工作在最佳狀態(tài),提高系統(tǒng)的控制精度,有利于提高系統(tǒng)的工作效率。本系統(tǒng)采用單
片機編程實現(xiàn)PID算法進(jìn)行溫度控制。
1PID控制的原理和特點
在工程實際中,應(yīng)用最為廣泛的調(diào)節(jié)器控制規(guī)律為比例、積分、微分控制,簡稱PID控制,又稱PID調(diào)
節(jié)。PID控制器以其結(jié)構(gòu)簡單、穩(wěn)定性好、工作可靠、調(diào)整方便而成為工業(yè)控制的主要技術(shù)之一。當(dāng)被控
對象的結(jié)構(gòu)和參數(shù)不能完全掌握,或得不到精確的數(shù)學(xué)模型,控制理論的其他技術(shù)也難以采用,系統(tǒng)控制
器的結(jié)構(gòu)和參數(shù)必須依靠經(jīng)驗和現(xiàn)場調(diào)試來確定時,應(yīng)用PID控制技術(shù)最為方便。
PID控制器的參數(shù)整定是控制系統(tǒng)設(shè)計的核心內(nèi)容。它是根據(jù)被控過程的特性確定PID控制器的比例系
數(shù)、積分時問和微分時間的大小。PID控制器參數(shù)整定的方法概括起來有兩大類:一是理論計算整定法。
它主要是依據(jù)系統(tǒng)的數(shù)學(xué)模型,經(jīng)過理論計算確定控制器參數(shù)。這種方法所得到的計算數(shù)據(jù)未必可以直接
用,還必須通過工程實際進(jìn)行調(diào)整和修改。二是工程整定方法,它主要依賴工程經(jīng)驗,直接在控制系統(tǒng)的
試驗中進(jìn)行,且方法簡單、易于掌握,在工程實際中被廣泛采用。
PID一般算式及模擬控制規(guī)律如式(1)
所示:
式中:u(t)為控制器的輸出;e(t)為偏差,即設(shè)定值與反饋值之差;KC為控制器的放大系數(shù),即比例增益;TI為控制器的積分常數(shù);TD為控制器的微分時間常數(shù)。PID算法的原理即調(diào)節(jié)KC,TI,TD三個參
數(shù)使系統(tǒng)達(dá)到穩(wěn)定。
由于計算機控制是一種采樣控制,它只能根據(jù)采樣時刻的偏差值計算控制量。因此在計算機控制系統(tǒng)中,必須首先對式(1)進(jìn)行離散化處理,用數(shù)字形式的差分方程代替連續(xù)系統(tǒng)的微分方程,此時積分項和微分項
可用求和及增量式表示:
將式(2)和式(3)代入式(1),則可得到離散的PID
表達(dá)式:
式中:△t=T為采樣周期,必須使T足夠小,才能保證系統(tǒng)有一定的精度(采樣定理);E(K)為第K次采
樣時的偏差值;E(K-1)為第K-1次采樣時的偏差值;P(K)為第K次采樣是調(diào)節(jié)器的輸出。
2系統(tǒng)的硬件構(gòu)成
本系統(tǒng)由傳感器A/D采樣輸入、單片機控制、人機交互、控制信號輸出四部分組成,其中溫度傳感部分由測試采樣電路實現(xiàn),人機交互由矩陣鍵盤和LCD液晶屏構(gòu)成,PID控制算法由89C52單片機實現(xiàn),控
制信號輸出部分則由功率放大和開關(guān)控制電路組成。系統(tǒng)框圖如圖1
所示。
3主程序流程
軟件程序是本控制系統(tǒng)的核心,它包括從溫度采樣到信號輸出的整個流程控制,其示意圖如圖2
所示。
程序功能主要由以下的幾部分組成:
(1)初始化:設(shè)定各參數(shù)的初始值,設(shè)定各中斷及定時器。
(2)接收/發(fā)射:此部分程序主要完成數(shù)據(jù)的控制及顯示,主要通過89C52單片機的全雙工串行口完成和
鍵盤部分的雙向通信。
(3)PC機通信:此部分完成與微機控制接口RS232的連接及通信的控制。
(4)數(shù)值轉(zhuǎn)換子程序:由于主程序中用到了很多的數(shù)值轉(zhuǎn)換及數(shù)值的運算(如十進(jìn)制轉(zhuǎn)換成十六進(jìn)制、雙
字節(jié)與單字節(jié)的除法運算等),為了程序調(diào)用的方便,特將其編寫成子程序的形式。
(5)PID算法。
4實驗測試
系統(tǒng)的性能與穩(wěn)定度需要通過具體實驗測試完成。現(xiàn)用1kW的電爐將電熱杯中的1L清水進(jìn)行加熱。
觀測設(shè)定值和實測值之間的誤差(當(dāng)水溫達(dá)到穩(wěn)定時的值),計算絕對誤差和相對誤差,見表1。
設(shè)定溫度為50℃,每隔30s記錄實測溫度,如表2
所示。
從表2中的數(shù)據(jù)可知,系統(tǒng)運行5min時基本達(dá)到穩(wěn)定。
5結(jié)語
由實驗結(jié)果可以看出,系統(tǒng)的誤差基本穩(wěn)定在±0.3℃,可見系統(tǒng)的精度很好。此外,系統(tǒng)運行5min時溫度基本達(dá)到穩(wěn)定,穩(wěn)定所需時間較短。可以看出,基于PID算法的單片機溫度控制系統(tǒng)具有較高的精確度和穩(wěn)定性,在溫度調(diào)節(jié)階段平衡溫度時間較短。因此本系統(tǒng)可以應(yīng)用于各種對精度要求較高的溫度控
制場合。
單片機高精度溫度控制實例
【摘要】本文介紹了以AT89S51單片機為核心的溫度控制器的設(shè)計,在該設(shè)計中采用高精度的溫度傳感器AD590對電熱鍋爐的溫度進(jìn)行實時精確測量,用超低溫漂移高精度運算放大器OP07將溫度-電壓信號進(jìn)行放大,再送入12位的AD574A進(jìn)行AD轉(zhuǎn)換,從而實現(xiàn)自動檢測,實時顯示及越限報警?刂撇糠植捎肞ID算法,實時更新PWM控制輸出參數(shù),控制可控硅的通斷時間,最終實現(xiàn)對爐溫的高精度控制。
【關(guān)鍵詞】水溫控制系統(tǒng)PID控制單片機
溫度控制是工業(yè)生產(chǎn)過程中經(jīng)常遇到的過程控制,有些工藝過程對其溫度的控制效果直接影響著產(chǎn)品的質(zhì)量,因而設(shè)計一種較為理想的溫度控制系統(tǒng)是非常有價值的。
一系統(tǒng)設(shè)計方案的論證與比較
久久建筑網(wǎng)m.brightonrobinsfc.com提供大量:建筑圖紙、施工方案、工程書籍、建筑論文、合同表格、標(biāo)準(zhǔn)規(guī)范、CAD圖紙等內(nèi)容。