溫度控制的PID算法的C語(yǔ)言程序_第1頁(yè)
溫度控制的PID算法的C語(yǔ)言程序_第2頁(yè)
溫度控制的PID算法的C語(yǔ)言程序_第3頁(yè)
溫度控制的PID算法的C語(yǔ)言程序_第4頁(yè)
溫度控制的PID算法的C語(yǔ)言程序_第5頁(yè)
已閱讀5頁(yè),還剩34頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上我的題目是:基于PID算法的溫度控制系統(tǒng) 89C51單片機(jī),通過(guò)鍵盤輸入預(yù)設(shè)值,與DS18B20測(cè)得的實(shí)際值做比較,然后驅(qū)動(dòng)制冷或加熱電路。用keil C語(yǔ)言來(lái)實(shí)現(xiàn)PID的控制。 最佳答案/PID算法溫控C語(yǔ)言2008-08-17 18:58#include<reg51.h> #include<intrins.h> #include<math.h> #include<string.h> struct PID unsigned int SetPoint; / 設(shè)定目標(biāo) Desired Value unsigned int

2、Proportion; / 比例常數(shù) Proportional Const unsigned int Integral; / 積分常數(shù) Integral Const unsigned int Derivative; / 微分常數(shù) 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

3、; / PID Response (Output) unsigned int rin; / PID Feedback (Input) sbit data1=P10; sbit clk=P11; sbit plus=P20; sbit subs=P21; sbit stop=P22; sbit output=P34; sbit DQ=P33; unsigned char flag,flag_1=0; unsigned char high_time,low_time,count=0;/占空比調(diào)節(jié)參數(shù) unsigned char set_temper=35; unsigned char temper

4、; unsigned char i; unsigned char j=0; unsigned int s; /* 延時(shí)子程序,延時(shí)時(shí)間以12M晶振為準(zhǔn),延時(shí)時(shí)間為30us×time */ void delay(unsigned char time) unsigned char m,n; for(n=0;n<time;n+) for(m=0;m<2;m+) /* 寫一位數(shù)據(jù)子程序 */ void write_bit(unsigned char bitval) EA=0; DQ=0; /*拉低DQ以開始一個(gè)寫時(shí)序*/ if(bitval=1) _nop_(); DQ=1; /

5、*如要寫1,則將總線置高*/ delay(5); /*延時(shí)90us供DA18B20采樣*/ DQ=1; /*釋放DQ總線*/ _nop_(); _nop_(); EA=1; /* 寫一字節(jié)數(shù)據(jù)子程序 */ void write_byte(unsigned char val) unsigned char i; unsigned char temp; EA=0; /*關(guān)中斷*/TR0=0; for(i=0;i<8;i+) /*寫一字節(jié)數(shù)據(jù),一次寫一位*/ temp=val>>i; /*移位操作,將本次要寫的位移到最低位*/ temp=temp&1; write_bit(t

6、emp); /*向總線寫該位*/ delay(7); /*延時(shí)120us后*/ / TR0=1; EA=1; /*開中斷*/ /* 讀一位數(shù)據(jù)子程序 */ unsigned char read_bit() unsigned char i,value_bit; EA=0; DQ=0; /*拉低DQ,開始讀時(shí)序*/ _nop_(); _nop_(); DQ=1; /*釋放總線*/ for(i=0;i<2;i+) value_bit=DQ; EA=1; return(value_bit); /* 讀一字節(jié)數(shù)據(jù)子程序 */ unsigned char read_byte() unsigned c

7、har i,value=0; EA=0; for(i=0;i<8;i+) if(read_bit() /*讀一字節(jié)數(shù)據(jù),一個(gè)時(shí)序中讀一次,并作移位處理*/ value|=0x01<<i; delay(4); /*延時(shí)80us以完成此次都時(shí)序,之后再讀下一數(shù)據(jù)*/ EA=1; return(value); /* 復(fù)位子程序 */ unsigned char reset() unsigned char presence; EA=0; DQ=0; /*拉低DQ總線開始復(fù)位*/ delay(30); /*保持低電平480us*/ DQ=1; /*釋放總線*/ delay(3); pr

8、esence=DQ; /*獲取應(yīng)答信號(hào)*/ delay(28); /*延時(shí)以完成整個(gè)時(shí)序*/ EA=1; return(presence); /*返回應(yīng)答信號(hào),有芯片應(yīng)答返回0,無(wú)芯片則返回1*/ /* 獲取溫度子程序 */ void get_temper() unsigned char i,j; do i=reset(); /*復(fù)位*/ while(i!=0); /*1為無(wú)反饋信號(hào)*/ i=0xcc; /*發(fā)送設(shè)備定位命令*/ write_byte(i); i=0x44; /*發(fā)送開始轉(zhuǎn)換命令*/ write_byte(i); delay(180); /*延時(shí)*/ do i=reset();

9、 /*復(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=(unsigned int)(j&0x0f); s=(s*100)/16; j=j>>4; temper=i|j; /*獲取的溫度放在temper中*/ /*= Initialize PID Structure =*/ void PIDInit (struct PID *pp) memse

10、t ( pp,0,sizeof(struct PID); /*= PID計(jì)算部分 =*/ 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; / 當(dāng)前微分 pp->PrevError = pp->LastError; pp

11、->LastError = Error; return (pp->Proportion * Error/比例+ pp->Integral * pp->SumError /積分項(xiàng)+ pp->Derivative * dError); / 微分項(xiàng) /* 溫度比較處理子程序 */ 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_tempe

12、r(); 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

13、+) 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中斷服務(wù)子程序,用于控制電平的翻轉(zhuǎn) ,40us*100=4ms周期 */ void serve_T0() interrupt 1 using 1 if(+count

14、<=(high_time) output=1; else if(count<=100) output=0; else count=0; TH0=0x2f; TL0=0xe0; /* 串行口中斷服務(wù)程序,用于上位機(jī)通訊 */ 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;

15、EA=1; */ void disp_1(unsigned char disp_num16) unsigned char n,a,m; for(n=0;n<6;n+) / k=disp_num1n; for(a=0;a<8;a+) clk=0; m=(disp_num1n&1); disp_num1n=disp_num1n>>1; if(m=1) data1=1; else data1=0; _nop_(); clk=1; _nop_(); /* 顯示子程序 功能:將占空比溫度轉(zhuǎn)化為單個(gè)字符,顯示占空比和測(cè)得到的溫度 */ void display() unsi

16、gned char code number=0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6; unsigned char disp_num6; unsigned int k,k1; k=high_time; k=k%1000; k1=k/100; if(k1=0) disp_num0=0; else disp_num0=0x60; k=k%100; disp_num1=numberk/10; disp_num2=numberk%10; k=temper; k=k%100; disp_num3=numberk/10; disp_num4=num

17、berk%10+1; disp_num5=numbers/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; l

18、ow_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(

19、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;

20、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=P21; /定義端口typedef unsigned char byte;typedef unsigned int word; /延時(shí)void delay(word useconds) for(;useconds>0;useconds

21、-); /復(fù)位byte ow_reset(void) byte presence; DQ=0; /DQ低電平 delay(29); /480us DQ=1; /DQ高電平 delay(3); /等待 presence=DQ; /presence信號(hào) delay(25); return(presence); /0允許,1禁止 /從1-wire 總線上讀取一個(gè)字節(jié)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

22、; delay(6); return(value); /向1-wire總線上寫一個(gè)字節(jié)void write_byte(char val) byte i; for (i=8;i>0;i-) /一次寫一個(gè)字節(jié) DQ=0; DQ=val&0x01; delay(5); DQ=1; val=val/2; delay(5); /讀取溫度char Read_Temperature(void) union byte c2; int x; temp; ow_reset(); write_byte(0xcc); write_byte(0xBE); temp.c1=read_byte(); temp

23、.c0=read_byte(); ow_reset(); write_byte(0xCC); write_byte(0x44); return temp.x/2; 參考資料:你把這兩個(gè)程序組合就可以了 PID算法     PID算法是本程序中的核心部分。我們采用PID模糊控制技術(shù),通過(guò)Pvar、Ivar、Dvar(比例、積分、微分)三方面的結(jié)合調(diào)整形成一個(gè)模糊控制來(lái)解決慣性溫度誤差問(wèn)題。其原理如下:     本系統(tǒng)的溫度控制器的電熱元件之一是發(fā)熱絲。發(fā)熱絲通過(guò)電流加熱時(shí),內(nèi)部溫度都很高。當(dāng)容器內(nèi)溫度升高至

24、設(shè)定溫度時(shí),溫度控制器會(huì)發(fā)出信號(hào)停止加熱。但這時(shí)發(fā)熱絲的溫度會(huì)高于設(shè)定溫度,發(fā)熱絲還將會(huì)對(duì)被加熱的器件進(jìn)行加熱,即使溫度控制器發(fā)出信號(hào)停止加熱,被加熱器件的溫度還往往繼續(xù)上升幾度,然后才開始下降。當(dāng)下降到設(shè)定溫度的下限時(shí),溫度控制器又開始發(fā)出加熱的信號(hào),開始加熱,但發(fā)熱絲要把溫度傳遞到被加熱器件需要一定的時(shí)候,這就要視發(fā)熱絲與被加熱器件之間的介質(zhì)情況而定。通常開始重新加熱時(shí),溫度繼續(xù)下降幾度。所以,傳統(tǒng)的定點(diǎn)開關(guān)控制溫度會(huì)有正負(fù)誤差幾度的現(xiàn)象,但這不是溫度控制器本身的問(wèn)題,而是整個(gè)熱系統(tǒng)的結(jié)構(gòu)性問(wèn)題,使溫度控制器控溫產(chǎn)生一種慣性溫度誤差。     增量式

25、PID算法的輸出量為                Un = Kp(en-en-1)+(T/Ti)en+(Td/T)(en-2*en-1+en-2)    式中,en、en-1、en-2分別為第n次、n-1次和n-2次的偏差值,Kp、Ti、Td分別為比例系數(shù)、積分系數(shù)和微分系數(shù),T為采樣周期。     計(jì)算機(jī)每隔固定時(shí)間 T將現(xiàn)場(chǎng)溫度與用戶設(shè)定目標(biāo)溫度的差值帶入增量式

26、PID算法公式,由公式輸出量決定PWM方波的占空比,后續(xù)加熱電路根據(jù)此PWM方波的占空比決定加熱功率?,F(xiàn)場(chǎng)溫度與目標(biāo)溫度的偏差大則占空比大,加熱電路的加熱功率大,使溫度的實(shí)測(cè)值與設(shè)定值的偏差迅速減少;反之,二者的偏差小則占空比減小,加熱電路加熱功率減少,直至目標(biāo)值與實(shí)測(cè)值相等,達(dá)到自動(dòng)控制的目的。     PID參數(shù)的選擇是實(shí)驗(yàn)成敗的關(guān)鍵,它決定了溫度控制的準(zhǔn)確度。數(shù)字PID調(diào)節(jié)器參數(shù)的整定可以仿照模擬PID調(diào)節(jié)器參數(shù)整定的各種方法,根據(jù)工藝對(duì)控制性能的要求,決定調(diào)節(jié)器的參數(shù)。各個(gè)參數(shù)對(duì)系統(tǒng)性能的影響如下:     

27、;比例系數(shù)P對(duì)系統(tǒng)性能的影響:比例系數(shù)加大,使系統(tǒng)的動(dòng)作靈敏,速度加快,穩(wěn)態(tài)誤差減小;P偏大,振蕩次數(shù)加多,調(diào)節(jié)時(shí)間加長(zhǎng);P太大時(shí),系統(tǒng)會(huì)趨于不穩(wěn)定;P太小,又會(huì)使系統(tǒng)的動(dòng)作緩慢。P可以選負(fù)數(shù),這主要是由執(zhí)行機(jī)構(gòu)、傳感器以及控制對(duì)象的特性決定的。如果P的符號(hào)選擇不當(dāng)對(duì)象測(cè)量值就會(huì)離控制目標(biāo)的設(shè)定值越來(lái)越遠(yuǎn),如果出現(xiàn)這樣的情況P的符號(hào)就一定要取反。     積分控制I對(duì)系統(tǒng)性能的影響:積分作用使系統(tǒng)的穩(wěn)定性下降,I?。ǚe分作用強(qiáng))會(huì)使系統(tǒng)不穩(wěn)定,但能消除穩(wěn)態(tài)誤差,提高系統(tǒng)的控制精度。 微分控制D對(duì)系統(tǒng)性能的影響:微分作用可以改善動(dòng)態(tài)特性,D偏大時(shí),超調(diào)量較

28、大,調(diào)節(jié)時(shí)間較短;D偏小時(shí),超調(diào)量也較大,調(diào)節(jié)時(shí)間也較長(zhǎng);只有D合適,才能使超調(diào)量較小,減短調(diào)節(jié)時(shí)間。   溫底控制PID的算法設(shè)計(jì)及實(shí)現(xiàn) -PID 簡(jiǎn)介    PID(Proportional Integral Derivative)控制是控制工程中技術(shù)成熟、應(yīng)用廣泛的一種控制策略,經(jīng)過(guò)長(zhǎng)期的工程實(shí)踐,已形成了一套完整的控制方法和典型的結(jié)構(gòu)。它不僅適用于數(shù)學(xué)模型已知的控制系統(tǒng)中,而且對(duì)于大多數(shù)數(shù)學(xué)模型難以確定的工業(yè)過(guò)程也可應(yīng)用,在眾多工業(yè)過(guò)程控制中取得了滿意的應(yīng)用效果。    PID 工作基理:由于來(lái)自

29、外界的各種擾動(dòng)不斷產(chǎn)生,要想達(dá)到現(xiàn)場(chǎng)控制對(duì)象值保持恒定的目的,控制作用就必須不斷的進(jìn)行。若擾動(dòng)出現(xiàn)使得現(xiàn)場(chǎng)控制對(duì)象值(以下簡(jiǎn)稱被控參數(shù))發(fā)生變化,現(xiàn)場(chǎng)檢測(cè)元件就會(huì)將這種變化采集后經(jīng)變送器送至PID 控制器的輸入端,并與其給定值(以下簡(jiǎn)稱SP 值)進(jìn)行比較得到偏差值(以下簡(jiǎn)稱e 值),調(diào)節(jié)器按此偏差并以我們預(yù)先設(shè)定的整定參數(shù)控制規(guī)律發(fā)出控制信號(hào),去改變調(diào)節(jié)器的開度,使調(diào)節(jié)器的開度增加或減少,從而使現(xiàn)場(chǎng)控制對(duì)象值發(fā)生改變,并趨向于給定值(SP 值),以達(dá)到控制目的 ,如圖 1 所示,其實(shí)PID 的實(shí)質(zhì)就是對(duì)偏差(e 值)進(jìn)行比例、積分、微分運(yùn)算,根據(jù)運(yùn)算結(jié)果控制執(zhí)行部件的過(guò)程。 圖1 模

30、擬PID 控制系統(tǒng)原理圖    PID 控制器的控制規(guī)律可以描述為:  (1)    比例(P)控制能迅速反應(yīng)誤差,從而減小穩(wěn)態(tài)誤差。但是,比例控制不能消除穩(wěn)態(tài)誤差。比例放大系數(shù)的加大,會(huì)引起系統(tǒng)的不穩(wěn)定。積分(I)控制的作用是:只要系統(tǒng)有誤差存在,積分控制器就不斷地積累,輸出控制量,以消除誤差。因而,只要有足夠的時(shí)間,積分控制將能完全消除誤差,使系統(tǒng)誤差為零,從而消除穩(wěn)態(tài)誤差。積分作用太強(qiáng)會(huì)使系統(tǒng)超調(diào)加大,甚至使系統(tǒng)出現(xiàn)振蕩。微分(D)控制可以減小超調(diào)量,克服振蕩,使系統(tǒng)的穩(wěn)定性提高,同時(shí)加快系統(tǒng)的動(dòng)態(tài)響應(yīng)速度,

31、減小調(diào)整時(shí)間,從而改善系統(tǒng)的動(dòng)態(tài)性能。根據(jù)不同的被控對(duì)象的控制特性,又可以分為P、PI、PD、PID 等不同的控制模型。數(shù)字PID 的實(shí)現(xiàn)    在連續(xù)-時(shí)間控制系統(tǒng)(模擬PID 控制系統(tǒng))中,PID 控制器應(yīng)用得非常廣泛。其設(shè)計(jì)技術(shù)成熟,長(zhǎng)期以來(lái)形成了典型的結(jié)構(gòu),參數(shù)整定方便,結(jié)構(gòu)更改靈活,能滿足一般的控制要求。隨著計(jì)算機(jī)的快速發(fā)展,人們將計(jì)算機(jī)引入到PID 控制領(lǐng)域,也就出現(xiàn)了數(shù)字式PID 控制。    由于計(jì)算機(jī)基于采樣控制理論,計(jì)算方法也不能沿襲傳統(tǒng)的模擬PID 控制算法(如公式1 所示),所以必須將控制模型離散化,離散化的方

32、法:以T 為采樣周期,k 為采樣序號(hào),用求和的形式代替積分,用增量的形式(求差)代替微分,這樣可以將連續(xù)的PID 計(jì)算公式離散: (2)式1 就可以離散為: (3)或者: (4)    這樣就可以讓計(jì)算機(jī)或者單片機(jī)通過(guò)采樣的方式實(shí)現(xiàn)PID 控制,具體的PID 控制又分為位置式PID 控制和增量式PID 控制,公式4 給出了控制量的全部大小,所以稱之為全量式或者位置式控制;如果計(jì)算機(jī)只對(duì)相鄰的兩次作計(jì)算,只考慮在前一次基礎(chǔ)上,計(jì)算機(jī)輸出量的大小變化,而不是全部輸出信息的計(jì)算,這種控制叫做增量式PID 控制算法,其實(shí)質(zhì)就是求的大小,而&#

33、160;  k =k -k-1 ;所以將式4 做自減變換有: (5)其中 溫度控制PID 算法設(shè)計(jì)    本設(shè)計(jì)利用了上面所介紹的位置式PID 算法,將溫度傳感器采樣輸入作為當(dāng)前輸入,然后與設(shè)定值進(jìn)行相減得偏差ek,然后再對(duì)之進(jìn)行PID 運(yùn)算產(chǎn)生輸出結(jié)果fOut,然后讓fOut 控制定時(shí)器的時(shí)間進(jìn)而控制加熱器。為了方便PID 運(yùn)算,首先建立一個(gè)PID 的結(jié)構(gòu)體數(shù)據(jù)類型,該數(shù)據(jù)類型用于保存PID 運(yùn)算所需要的P、I、D 系數(shù),以及設(shè)定值,歷史誤差的累加和等信息:typedef struct PIDfloat SetPoint; / 設(shè)定

34、目標(biāo) Desired Valuefloat Proportion; / 比例系數(shù) Proportional Constfloat Integral; / 積分系數(shù) Integral Constfloat Derivative; / 微分系數(shù) Derivative Constint LastError; / 上次偏差int SumError; / 歷史誤差累計(jì)值 PID;PID stPID; / 定義一個(gè)stPID 變量    下面是PID 運(yùn)算的算法程序,通過(guò)PID 運(yùn)算返回fOut,fOut 的值決定是否加熱,加熱時(shí)間是多少。PID 運(yùn)算的C 實(shí)現(xiàn)代碼:floa

35、t PIDCalc( PID *pp, int NextPoint )int dError,Error;Error = pp->SetPoint*10 - NextPoint; / 偏差,設(shè)定值減去當(dāng)前采樣值pp->SumError += Error; / 積分,歷史偏差累加dError = Error-pp->LastError; / 當(dāng)前微分,偏差相減pp->PrevError = pp->LastError; / 保存pp->LastError = Error;+ pp->Integral * pp->SumError / 積分項(xiàng)- pp-

36、>Derivative * dError / 微分項(xiàng));    在實(shí)際運(yùn)算時(shí),由于水具有很大的熱慣性,而且PID 運(yùn)算中的I(積分項(xiàng))具有非常明顯的延遲效應(yīng)所以不能保留,我們必須把積分項(xiàng)去掉,相反D(微分項(xiàng))則有很強(qiáng)的預(yù)見性,能夠加快反應(yīng)速度,抑制超調(diào)量,所以積分作用應(yīng)該適當(dāng)加強(qiáng)才能達(dá)到較佳的控制效果,系統(tǒng)最終選擇PD 控制方案,下面C 代碼所示為PD 控制的實(shí)現(xiàn)過(guò)程:float PIDCalc( PID *pp, int NextPoint )int dError,Error;Error = pp->SetPoint*10 - NextPoint;

37、/ 偏差,設(shè)定值減去當(dāng)前采樣值dError = Error-pp->LastError; / 當(dāng)前微分,偏差相減pp->PrevError = pp->LastError; / 保存pp->LastError = Error;return (pp->Proportion * Error / 比例項(xiàng)- pp->Derivative * dError / 微分項(xiàng));溫度控制實(shí)現(xiàn)    通過(guò)溫度的PID 運(yùn)算,產(chǎn)生結(jié)果fOut,該參數(shù)決定是否加熱,加熱時(shí)間是多長(zhǎng)。該程序如下:stPID.Proportion = 2; /設(shè)置PID 比

38、例值stPID.Integral = 0; /設(shè)置PID 積分值stPID.Derivative = 5; /設(shè)置PID 微分值fOut = PIDCalc ( &stPID,(int)(fT*10) ); /PID 計(jì)算if(fOut<=0)*P_IOA_Buffer &= 0xff7f; /溫度高于設(shè)定值,關(guān)閉加熱器else*P_IOA_Buffer |= 0x0080; /溫度低于設(shè)定值,打開加熱器    加熱時(shí)間由主函數(shù)計(jì)算,由TimerB 中斷控制。主程序中通過(guò)PIDCalc 函數(shù)得到fOut 參數(shù),如果該參數(shù)大于“0”,則開啟加熱

39、器。IRQ2_TMB 中斷一直處于允許狀態(tài),每進(jìn)入一次IRQ2_TMB 中斷,fOut 參數(shù)減1,直到fOut = 0,停止加熱。如果PIDCalc 計(jì)算結(jié)果比較大說(shuō)明離目標(biāo)溫度相差較大,則加熱時(shí)間比較長(zhǎng),如果計(jì)算結(jié)果比較小,說(shuō)明離目標(biāo)溫度相差較小,加熱時(shí)間相對(duì)較短。  基于PID算法和89C52單片機(jī)的溫度控制系統(tǒng)作者:張艷艷 安徽電子信息職業(yè)技術(shù)學(xué)院  來(lái)源:現(xiàn)代電子技術(shù)  發(fā)布時(shí)間:2009-12-22 17:36:09   基于PID算法和89C52單片機(jī)的溫度控制系統(tǒng)0 引 言   

40、溫控技術(shù)無(wú)論是在工業(yè)生產(chǎn),還是日常生活中都起著非常重要的作用。在冶金、石油、化工、電力和現(xiàn)代農(nóng)業(yè)等行業(yè),溫度是極為重要而又普遍的熱工參數(shù)之一,在普通家庭里熱水器、電飯煲、電烤箱等依賴于溫控技術(shù)的家電設(shè)備也是必不可少??梢哉f(shuō)溫度控制技術(shù)無(wú)處不在。    常規(guī)的溫度控制方法以設(shè)定溫度為臨界點(diǎn),超出設(shè)定允許范圍即進(jìn)行溫度調(diào)控:低于設(shè)定值就加熱,反之就停止或降溫。這種方法實(shí)現(xiàn)簡(jiǎn)單、成本低,但控制效果不理想,控制溫度精度不高、容易引起震蕩,達(dá)到穩(wěn)定點(diǎn)的時(shí)間也長(zhǎng),因此,只能用在精度要求不高的場(chǎng)合。    而采用PID算法進(jìn)行溫度控制,它具有控制精

41、度高,能夠克服容量滯后的特點(diǎn),特別適用于負(fù)荷變化大、容量滯后較大、控制品質(zhì)要求又很高的控制系統(tǒng)。    單片機(jī)作為控制系統(tǒng)中必不可少的部分,在各個(gè)領(lǐng)域得到了廣泛的應(yīng)用,用單片機(jī)進(jìn)行實(shí)時(shí)系統(tǒng)數(shù)據(jù)處理和控制,保證系統(tǒng)工作在最佳狀態(tài),提高系統(tǒng)的控制精度,有利于提高系統(tǒng)的工作效率。本系統(tǒng)采用單片機(jī)編程實(shí)現(xiàn)PID算法進(jìn)行溫度控制。 1 PID控制的原理和特點(diǎn)    在工程實(shí)際中,應(yīng)用最為廣泛的調(diào)節(jié)器控制規(guī)律為比例、積分、微分控制,簡(jiǎn)稱PID控制,又稱PID調(diào)節(jié)。PID控制器以其結(jié)構(gòu)簡(jiǎn)單、穩(wěn)定性好、工作可靠、調(diào)整方便而成為工業(yè)控制的主要技術(shù)之一。

42、當(dāng)被控對(duì)象的結(jié)構(gòu)和參數(shù)不能完全掌握,或得不到精確的數(shù)學(xué)模型,控制理論的其他技術(shù)也難以采用,系統(tǒng)控制器的結(jié)構(gòu)和參數(shù)必須依靠經(jīng)驗(yàn)和現(xiàn)場(chǎng)調(diào)試來(lái)確定時(shí),應(yīng)用PID控制技術(shù)最為方便。    PID控制器的參數(shù)整定是控制系統(tǒng)設(shè)計(jì)的核心內(nèi)容。它是根據(jù)被控過(guò)程的特性確定PID控制器的比例系數(shù)、積分時(shí)問(wèn)和微分時(shí)間的大小。PID控制器參數(shù)整定的方法概括起來(lái)有兩大類:一是理論計(jì)算整定法。它主要是依據(jù)系統(tǒng)的數(shù)學(xué)模型,經(jīng)過(guò)理論計(jì)算確定控制器參數(shù)。這種方法所得到的計(jì)算數(shù)據(jù)未必可以直接用,還必須通過(guò)工程實(shí)際進(jìn)行調(diào)整和修改。二是工程整定方法,它主要依賴工程經(jīng)驗(yàn),直接在控制系統(tǒng)的試驗(yàn)中進(jìn)行,且方法

43、簡(jiǎn)單、易于掌握,在工程實(shí)際中被廣泛采用。    PID一般算式及模擬控制規(guī)律如式(1)所示:        式中:u(t)為控制器的輸出;e(t)為偏差,即設(shè)定值與反饋值之差;KC為控制器的放大系數(shù),即比例增益;TI為控制器的積分常數(shù);TD為控制器的微分時(shí)間常數(shù)。PID算法的原理即調(diào)節(jié)KC,TI,TD三個(gè)參數(shù)使系統(tǒng)達(dá)到穩(wěn)定。    由于計(jì)算機(jī)控制是一種采樣控制,它只能根據(jù)采樣時(shí)刻的偏差值計(jì)算控制量。因此在計(jì)算機(jī)控制系統(tǒng)中,必須首先對(duì)式(1)進(jìn)行離散化處理,用數(shù)字形式的差分方程

44、代替連續(xù)系統(tǒng)的微分方程,此時(shí)積分項(xiàng)和微分項(xiàng)可用求和及增量式表示:        將式(2)和式(3)代入式(1),則可得到離散的PID表達(dá)式:        式中:t=T為采樣周期,必須使T足夠小,才能保證系統(tǒng)有一定的精度(采樣定理);E(K)為第K次采樣時(shí)的偏差值;E(K-1)為第K-1次采樣時(shí)的偏差值;P(K)為第K次采樣是調(diào)節(jié)器的輸出。2 系統(tǒng)的硬件構(gòu)成    本系統(tǒng)由傳感器AD采樣輸入、單片機(jī)控制、人機(jī)交互、控制信號(hào)輸出四部分組成,其中溫

45、度傳感部分由測(cè)試采樣電路實(shí)現(xiàn),人機(jī)交互由矩陣鍵盤和LCD液晶屏構(gòu)成,PID控制算法由89C52單片機(jī)實(shí)現(xiàn),控制信號(hào)輸出部分則由功率放大和開關(guān)控制電路組成。系統(tǒng)框圖如圖1所示。 3 主程序流程    軟件程序是本控制系統(tǒng)的核心,它包括從溫度采樣到信號(hào)輸出的整個(gè)流程控制,其示意圖如圖2所示。    程序功能主要由以下的幾部分組成:    (1)初始化:設(shè)定各參數(shù)的初始值,設(shè)定各中斷及定時(shí)器。    (2)接收發(fā)射:此部分程序主要完成數(shù)據(jù)的控制及顯示,主要通過(guò)89C52單片機(jī)的全雙

46、工串行口完成和鍵盤部分的雙向通信。    (3)PC機(jī)通信:此部分完成與微機(jī)控制接口RS 232的連接及通信的控制。    (4)數(shù)值轉(zhuǎn)換子程序:由于主程序中用到了很多的數(shù)值轉(zhuǎn)換及數(shù)值的運(yùn)算(如十進(jìn)制轉(zhuǎn)換成十六進(jìn)制、雙字節(jié)與單字節(jié)的除法運(yùn)算等),為了程序調(diào)用的方便,特將其編寫成子程序的形式。    (5)PID算法。4 實(shí)驗(yàn)測(cè)試    系統(tǒng)的性能與穩(wěn)定度需要通過(guò)具體實(shí)驗(yàn)測(cè)試完成?,F(xiàn)用1 kW的電爐將電熱杯中的1 L清水進(jìn)行加熱。    觀測(cè)設(shè)定值

47、和實(shí)測(cè)值之間的誤差(當(dāng)水溫達(dá)到穩(wěn)定時(shí)的值),計(jì)算絕對(duì)誤差和相對(duì)誤差,見表1。    設(shè)定溫度為50,每隔30 s記錄實(shí)測(cè)溫度,如表2所示。    從表2中的數(shù)據(jù)可知,系統(tǒng)運(yùn)行5 min時(shí)基本達(dá)到穩(wěn)定。5 結(jié) 語(yǔ)    由實(shí)驗(yàn)結(jié)果可以看出,系統(tǒng)的誤差基本穩(wěn)定在±03,可見系統(tǒng)的精度很好。此外,系統(tǒng)運(yùn)行5 min時(shí)溫度基本達(dá)到穩(wěn)定,穩(wěn)定所需時(shí)間較短??梢钥闯?,基于PID算法的單片機(jī)溫度控制系統(tǒng)具有較高的精確度和穩(wěn)定性,在溫度調(diào)節(jié)階段平衡溫度時(shí)間較短。因此本系統(tǒng)可以應(yīng)用于各種對(duì)精度要求較高的溫度控制場(chǎng)

48、合。溫度控制中,用PID算法得到的是一個(gè)數(shù)值,這個(gè)數(shù)值如何轉(zhuǎn)換為占空比? 回復(fù)數(shù):5,點(diǎn)擊數(shù):1528 【樓主位】 xuxianhai 積分:2派別:等級(jí):-來(lái)自:我在用MEGA16控制電加熱調(diào)節(jié)水溫時(shí),采用PID算法,輸出采用占空比通斷控制。為求階躍響應(yīng),我用15%占空比達(dá)到穩(wěn)定后,將占空比調(diào)至30%,開始測(cè)量溫度。得到階躍響應(yīng)曲線后,為求加熱器的靜態(tài)增益K,采用K=Y/X公式。我知道Y用溫度值的單位,但X的單位該如何取呢?是用15,還是0.15? 另外,我用PID算法得到的是一個(gè)數(shù)值,這個(gè)數(shù)值如何轉(zhuǎn)換為占空比?是要先設(shè)定一個(gè)較大的值嗎?如果是的話,這個(gè)數(shù)值是否有一個(gè)經(jīng)驗(yàn)值,大概取多少? 懇

49、請(qǐng)各位高手幫忙看一下,謝謝! 2006-02-17,10:51:03 郵件       編輯 刪除 【1樓】 sanol 積分:8派別:等級(jí):-來(lái)自:哥們,我也做這個(gè),交流下? qq  2009-04-23,09:42:23 郵件       編輯 刪除 【2樓】 huangstone 積分:47派別:等級(jí):-來(lái)自:關(guān)于PID有點(diǎn)心得,供LZ參考:     1、PID運(yùn)算出來(lái)是一個(gè)數(shù)據(jù)沒(méi)有量綱,在這里這個(gè)數(shù)據(jù)和占空比沒(méi)有什么直接的關(guān)系,這個(gè)數(shù)據(jù)的

50、大小表示的PID調(diào)節(jié)的強(qiáng)度,數(shù)據(jù)大調(diào)節(jié)度就大。     2、占空比的輸出一般通過(guò)定時(shí)器,我們假設(shè)當(dāng)定時(shí)器的值為255時(shí),占空比為100%。第1點(diǎn)計(jì)算的數(shù)據(jù)是和你PID的三個(gè)參數(shù)密切相關(guān)的,在相同的被控量測(cè)量值下,不同的PID參數(shù)會(huì)得出不同的值,這其實(shí)就是PID參數(shù)要調(diào)節(jié)的原因。因此要對(duì)PID參數(shù)加以調(diào)整,將計(jì)算出的數(shù)據(jù)可以直接賦給定時(shí)器控制占空比,但是要對(duì)最大和最小值加以限定。     3、想象一下,如果你的PID參數(shù)不合適,計(jì)算出的數(shù)據(jù)要么大于255,要么小于0,這就變成了開關(guān)控制了。   &

51、#160;      其實(shí)最關(guān)鍵的就是我寫的第一點(diǎn),只要理解了PID計(jì)算出的數(shù)據(jù)是表示的調(diào)節(jié)強(qiáng)度的大小,和占空比和溫度都沒(méi)有直接的對(duì)應(yīng)關(guān)系的。那PID就沒(méi)有什么困難的。 2009-04-23,11:52:49 郵件       編輯 刪除 【3樓】 deepin 積分:402派別:等級(jí):-來(lái)自:【2樓】 huangstone  學(xué)習(xí)了! 2009-04-24,14:48:14 郵件       編輯 刪除 【4樓】 lengq

52、ing1309 積分:209派別:等級(jí):-來(lái)自:泉州這個(gè)樓的時(shí)間跨度太大了吧? 2009-04-24,16:33:29       編輯 刪除 【5樓】 aglen 積分:58派別:等級(jí):-來(lái)自:學(xué)習(xí)了 2009-10-11,11:05:24       單片機(jī)高精度溫度控制實(shí)例【摘要】 本文介紹了以AT89S51單片機(jī)為核心的溫度控制器的設(shè)計(jì),在該設(shè)計(jì)中采用高精度的溫度傳感器AD590對(duì)電熱鍋爐的溫度進(jìn)行實(shí)時(shí)精確測(cè)量,用超低溫漂移高精度運(yùn)算放大器OP07將溫度-電壓信號(hào)進(jìn)行放大,再送入12位的AD574A進(jìn)行AD轉(zhuǎn)換,從而實(shí)現(xiàn)自動(dòng)檢測(cè),實(shí)時(shí)顯示及越限報(bào)警。控制部分采用PID算法,實(shí)時(shí)更新PWM控制輸出參數(shù),控制可控硅的通斷時(shí)間,最終實(shí)現(xiàn)對(duì)爐溫的高精度控制。 【關(guān)鍵詞】 水溫控制系統(tǒng)  PID控制單片機(jī) 溫度控制是工業(yè)生產(chǎn)過(guò)程中經(jīng)常遇到的過(guò)程控制,有些工藝過(guò)程對(duì)其溫度的控制效果直接影響著產(chǎn)品的質(zhì)量,因而設(shè)計(jì)一種較為理想的溫度控制系統(tǒng)是非常有價(jià)值的。 一  系統(tǒng)設(shè)計(jì)方案的論證與比較 根據(jù)題目要求,電熱鍋爐溫度控制系統(tǒng)由核心處理模塊、溫度采集模塊、鍵盤顯示

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論