基于51單片機的PID調(diào)溫(熱得快)_第1頁
基于51單片機的PID調(diào)溫(熱得快)_第2頁
基于51單片機的PID調(diào)溫(熱得快)_第3頁
基于51單片機的PID調(diào)溫(熱得快)_第4頁
基于51單片機的PID調(diào)溫(熱得快)_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、自動控制原理課程設(shè)計指導(dǎo)老師:鄒恩年級專業(yè):13 自動化 4 班姓名學(xué)號(分工) 韓錦澎201330280107(電路設(shè)計) 韋伊玲201330280219 (程序編寫) 徐敏芳201330280723 (焊接調(diào)試)王可欣201330280102 (論文)2015 年 1 月 7 日目 錄1. 系統(tǒng)設(shè)計方案31.1方案一31.2 方案二31.3方案三31.4方案的比較和確定32.系統(tǒng)硬件部分設(shè)計32.1 系統(tǒng)硬件電路圖32.1.1 單片機AT89C5242.1.2單片機與LCD通信連接42.1.3 其他電路模塊及總電路53系統(tǒng)軟件部分53.1系統(tǒng)的主流程圖如下54.溫度控制系統(tǒng)PID調(diào)節(jié)64.

2、1 PID控制傳遞函數(shù)64.2 PID參數(shù)調(diào)節(jié)方法64.3 PID參數(shù)設(shè)定65.實驗與調(diào)試76.總論8附 錄8參 考 文 獻241. 系統(tǒng)設(shè)計方案1.1方案一 選用鉑電阻溫度傳感器。此類溫度傳感器線性度、穩(wěn)定性等方面性能都很好,但其成本較高。1.2 方案二 采用熱敏電阻。選用此類元器件有價格便宜的優(yōu)點,但由于熱敏電阻的非線性特性會影響系統(tǒng)的精度。1.3方案三 采用DS18B20溫度傳感器。DS18B20是DALLAS公司生產(chǎn)的一線式數(shù)字溫度傳感器,具有3引腳封裝形式;溫度測量范圍為55125,可編程為9位12位A/D轉(zhuǎn)換精度,測溫分辨率可達0.0625,被測溫度用符號擴展的16位數(shù)字量方式串行

3、輸出遠端引入1.4方案的比較和確定比較以上三種方案,方案三具有具有體積小、質(zhì)量輕、線形度好、性能穩(wěn)定等優(yōu)點其各方面特性都滿足此系統(tǒng)的設(shè)計要求的優(yōu)點,因此選用方案三。2. 系統(tǒng)硬件部分設(shè)計硬件設(shè)計包含DS18B20模塊,1602液晶顯示模塊,繼電器模塊,鍵盤輸入模塊和聲光報警模塊,DS18B20可以被編程,所以箭頭是雙向的,CPU(89C52)首先寫入命令給DS18B20,然后DS18B20開始轉(zhuǎn)換數(shù)據(jù),轉(zhuǎn)換后通89C52來處理數(shù)據(jù)。數(shù)據(jù)處理后的結(jié)果就顯示到1602液晶上。2.1系統(tǒng)硬件電路圖2.1.1 單片機STC89C522.1.2單片機與LCD通信連接2.1.3 其他電路模塊及總電路3.

4、系統(tǒng)軟件部分軟件設(shè)計的部分采用分層模塊化設(shè)計,主要有鍵盤掃描、按鍵處理程序、數(shù)碼管顯示程序、繼電器控制程序、溫度信號處理程序、超溫報警程序。另外以 AT89C52 單片機為控制核心。利用PID 控制算法提高了水溫的控制精度使用PID 控制算法實施自動控制系統(tǒng)具有控制參數(shù)精度高、反映速度快和穩(wěn)定性好的特點。 3.1系統(tǒng)的主流程圖如下4.溫度控制系統(tǒng)PID調(diào)節(jié)4.1 PID控制傳遞函數(shù) 通過熱電偶采集的被測溫度偏離所希望的給定值時,PID控制可根據(jù)測量信號與給定值的偏差進行比例(P)、積分(I)、微分(D)運算,從而輸出某個適當(dāng)?shù)目刂菩盘柦o執(zhí)行機構(gòu),促使測量值恢復(fù)到給定值,達到自動控制的效果。4.

5、2 PID參數(shù)調(diào)節(jié)方法及參數(shù)設(shè)定PID模塊的溫度控制精度主要受P、I、D這三個參數(shù)影響。其中P代表比例,I代表積分,D代表微分。比例運算(P)比例控制是建立與設(shè)定值(SV)相關(guān)的一種運算,并根據(jù)偏差在求得運算值(控制輸出量)。如果當(dāng)前值(PV)小,運算值為100%。如果當(dāng)前值在比例帶內(nèi),運算值根據(jù)偏差比例求得并逐漸減小直到SV和PV匹配(即,直到偏差為0),此時運算值回復(fù)到先前值(前饋運算)。若出現(xiàn)靜差(殘余偏差),可用減小P方法減小殘余偏差。如果P太小,反而會出現(xiàn)振蕩。積分運算(I)將積分與比例運算相結(jié)合,隨著調(diào)節(jié)時間延續(xù)可減小靜差。積分強度用積分時間表示,積分時間相當(dāng)于積分運算值到比例運算

6、值在階躍偏差響應(yīng)下達到的作用所需要的時間。積分時間越小,積分運算的校正時間越強。但如果積分時間值太小,校正作用太強會出現(xiàn)振蕩。微分運算(D)比例和積分運算都校正控制結(jié)果,所以不可避免地會產(chǎn)生響應(yīng)延時現(xiàn)象。微分運算可彌補這些缺陷。在一個突發(fā)的干擾響應(yīng)中,微分運算提供了一個很大的運算值,以恢復(fù)原始狀態(tài)。微分運算采用一個正比于偏差變化率(微分系數(shù))的運算值校正控制。微分運算的強度由微分時間表示,微分時間相當(dāng)于微分運算值達到比例運算值在階躍偏差響應(yīng)下達到的作用所需的時間。微分時間值越大,微分運算的校正強度越強。5.實驗與調(diào)試 用繼電器模塊來控制200W“熱得快”來對1升水進行加熱,用鍵盤設(shè)定需要加熱溫

7、度值,觀察1602所顯示的穩(wěn)定水溫和環(huán)境溫度降低時溫度控制的靜態(tài)誤差。多次調(diào)試并合設(shè)定PID參數(shù)來完善系統(tǒng)。 實物圖:6.總論首先,通過本次應(yīng)用系統(tǒng)設(shè)計,在很大程度上提高了我們的獨立思考能力和專業(yè)知識相信在接下來的日子我們能在已有的基礎(chǔ)上做得更好。我們所設(shè)計的該系統(tǒng)主要根據(jù)目前省能源的發(fā)展趨勢和國內(nèi)實際的應(yīng)用特點和要求,采用了自動化的結(jié)構(gòu)形式,實現(xiàn)對水溫的自動檢測和控制。該系統(tǒng)的主要特點是: 1)適用性強,用戶只需對界面參數(shù)進行設(shè)置并啟動系統(tǒng)正常運行便可滿足不同用戶水溫的要求,實現(xiàn)對水溫的實時監(jiān)控。避免了電力力資源的浪費,節(jié)省了能源。 2)將單片機以及溫度傳感器引入對水溫的分析和處理中,單片機

8、控制決策無需建立被控對象的數(shù)學(xué)模型,系統(tǒng)的適應(yīng)性強,適合對非線性、時變、滯后系統(tǒng)的控制對水溫控制系統(tǒng)進行控制。 3)系統(tǒng)成本低廉,操作非常簡單,可擴展性強,只要稍加改變,即可增加其他使用功能。 通過對本設(shè)計的思考,更加加深了我們對單片機的認識,熟練了對單片機的控制,更對當(dāng)前的溫度傳感器有了更深刻的認識與了解,但是由于此系統(tǒng)依賴溫度傳感器,因而對溫度傳感器的穩(wěn)定性,線性等諸多方面有著嚴(yán)格的要求,但是傳感器的性能越好,相對而言其價格也就越高,因而在此設(shè)計中,溫度傳感器覺的還是存在遺憾,由于溫度計的使用溫度有限所以水溫不能達到90以上。最后由于時間緊迫,本設(shè)計還有諸多地方需要改進,我們會在接下來的時

9、間里繼續(xù)完善該設(shè)計,以期做的更好。附錄:部分程序:/main.c:#include#includelcd.h#includetemp.h#includepid.hsbit c1=P26;sbit c2=P27;sbit beep=P13;sbit K3=P32;sbit K4=P33;void IntConfiguration();void Delay(unsigned int n);unsigned char KeyValue=0;extern float set_temper;/* 函數(shù)名 : main* 函數(shù)功能 : 主函數(shù)* 輸入 : 無* 輸出 : 無*/void main()ext

10、ern struct PID spid; / PID Control Structure LcdInit();IntConfiguration();PIDInit ( &spid );spid.Proportion = 10; / Set PID Coefficients spid.Integral = 8; spid.Derivative =6; spid.SetPoint = 100; / Set PID Setpoint beep=1;TMOD=0x21; TH0=0x2f; TL0=0x40; /PCON=0X80;/波特率加倍/TH1=0XF3;/計數(shù)器初始值設(shè)置,注意波特率是480

11、0的/TL1=0XF3;EA=1; ET0=1; /ES=1; TR0=1; TR1=1; c1=0;c2=0;P1=0XFF;while(1)LcdDisplay(Ds18b20ReadTemp();LcdDisplay2(set_temper);/LcdDisplay3(realtmp);/*if(set_temper-realtmp)1&(realtmper-set_temp)0;n-) for(b=1;b0;b-) for(a=22;a0;a-);/* 函數(shù)名 : Int0()interrupt 0* 函數(shù)功能 : 外部中斷0的中斷函數(shù)* 輸入 : 無* 輸出 : 無*/void In

12、t0()interrupt 0/外部中斷0的中斷函數(shù)Delay(1); /延時消抖if(K3=0)while(K3=0);set_temper+;if(set_temper60.00)set_temper=60.00;/* 函數(shù)名 : Int1() interrupt 2* 函數(shù)功能 : 外部中斷1的中斷函數(shù)* 輸入 : 無* 輸出 : 無*/void Int1() interrupt 2/外部中斷1的中斷函數(shù)Delay(1);/延時消抖if(K4=0)while(K4=0);set_temper-;if(set_temperSetPoint - NextPoint; / 偏差 pp-SumE

13、rror += 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); / 微分項 /* 溫度比較處理子程序 */ void compare_temper() unsigned char i; extern float realtmp;extern unsi

14、gned int s; if(set_temperrealtmp) if(set_temper-realtmp1) high_time=100; low_time=0; /P1=0XFF;/mod1=0; else /P1=0XFF;/mod2=0;for(i=0;i10;i+) Ds18b20ReadTemp(); rin = s; / Read Input rout = PIDCalc ( &spid,rin ); / Perform PID Interation if (high_time=100) high_time=(unsigned char)(rout/800); else hi

15、gh_time=100; low_time= (100-high_time); else if(set_temper0) /P1=0XFF;/mod3=0;high_time=0; low_time=100; /mod2=0; else /P1=0XFF;/mod4=0;for(i=0;i10;i+) Ds18b20ReadTemp(); rin = s; / Read Input rout = PIDCalc ( &spid,rin ); / Perform PID Interation if (high_time100) high_time=(unsigned char)(rout/100

16、00); else high_time=0; low_time= (100-high_time); / else / /* T0中斷服務(wù)子程序,用于控制電平的翻轉(zhuǎn) ,40us*100=4ms周期 */ void serve_T0() interrupt 1 using 1 j+;if(+count=(high_time) output=1;i+;else if(count0;y-)for(x=110;x0;x-);/* 函數(shù)名 : Ds18b20Init* 函數(shù)功能 : 初始化* 輸入 : 無* 輸出 : 初始化成功返回1,失敗返回0*/unsigned char Ds18b20Init()u

17、nsigned int i;DSPORT=0; /將總線拉低480us960usi=70;while(i-);/延時642usDSPORT=1;/然后拉高總線,如果DS18B20做出反應(yīng)會將在15us60us后總線拉低i=0;while(DSPORT)/等待DS18B20拉低總線i+;if(i5000)/等待5MSreturn 0;/初始化失敗return 1;/初始化成功/* 函數(shù)名 : Ds18b20WriteByte* 函數(shù)功能 : 向18B20寫入一個字節(jié)* 輸入 : com* 輸出 : 無*/void Ds18b20WriteByte(unsigned char dat)unsign

18、ed int i,j;for(j=0;j=1;/* 函數(shù)名 : Ds18b20ReadByte* 函數(shù)功能 : 讀取一個字節(jié)* 輸入 : com* 輸出 : 無*/unsigned char Ds18b20ReadByte()unsigned char byte,bi;unsigned int i,j;for(j=8;j0;j-)DSPORT=0;/先將總線拉低1usi+;DSPORT=1;/然后釋放總線i+;i+;/延時6us等待數(shù)據(jù)穩(wěn)定bi=DSPORT; /讀取數(shù)據(jù),從最低位開始讀取/*將byte左移一位,然后與上右移7位后的bi,注意移動之后移掉那位補0。*/byte=(byte1)|

19、(bi7); i=4;/讀取完之后等待48us再接著讀取下一個數(shù)while(i-);return byte;/* 函數(shù)名 : Ds18b20ChangTemp* 函數(shù)功能 : 讓18b20開始轉(zhuǎn)換溫度* 輸入 : com* 輸出 : 無*/void Ds18b20ChangTemp()Ds18b20Init();Delay1ms(1);Ds18b20WriteByte(0xcc);/跳過ROM操作命令 Ds18b20WriteByte(0x44); /溫度轉(zhuǎn)換命令Delay1ms(100);/* 函數(shù)名 : Ds18b20ReadTempCom* 函數(shù)功能 : 發(fā)送讀取溫度命令* 輸入 : c

20、om* 輸出 : 無*/void Ds18b20ReadTempCom()Ds18b20Init();Delay1ms(1);Ds18b20WriteByte(0xcc); /跳過ROM操作命令Ds18b20WriteByte(0xbe); /發(fā)送讀取溫度命令/* 函數(shù)名 : Ds18b20ReadTemp* 函數(shù)功能 : 讀取溫度* 輸入 : com* 輸出 : 無*/int Ds18b20ReadTemp()unsigned char tmh,tml;Ds18b20ChangTemp(); /先寫入轉(zhuǎn)換命令Ds18b20ReadTempCom();/然后等待轉(zhuǎn)換完后發(fā)送讀取溫度命令tml=

21、Ds18b20ReadByte();/讀取溫度值共16位,先讀低字節(jié)tmh=Ds18b20ReadByte();/再讀高字節(jié)temp=tmh;temp0;c-)for(b=110;b0;b-);/* 函數(shù)名 : LcdWriteCom* 函數(shù)功能 : 向LCD寫入一個字節(jié)的命令* 輸入 : com* 輸出 : 無*/void LcdWriteCom(unsigned char com) /寫入命令RS=0;RW=0;GPIO_LCD=com;Delay1us(10);LCDE=1;Delay1us(10);LCDE=0;/* 函數(shù)名 : LcdWriteData* 函數(shù)功能 : 向LCD寫入一

22、個字節(jié)的數(shù)據(jù)* 輸入 : dat* 輸出 : 無*/ void LcdWriteData(unsigned char dat)/寫入數(shù)據(jù)RS=1;RW=0;GPIO_LCD=dat;Delay1us(10);LCDE=1;Delay1us(10);LCDE=0;/* 函數(shù)名 : LcdInit()* 函數(shù)功能 : 初始化LCD屏* 輸入 : 無* 輸出 : 無*/ void LcdInit() /LCD初始化子程序 LcdWriteCom(0x38); /開顯示LcdWriteCom(0x0c); /開顯示不顯示光標(biāo)LcdWriteCom(0x06); /寫一個指針加1LcdWriteCom(

23、0x01); /清屏LcdWriteCom(0x80); /設(shè)置數(shù)據(jù)指針起點void LcdDisplay(int temp) /lcd顯示 unsigned char datas = 0, 0, 0, 0, 0; /定義數(shù)組float tp; /初始化LCDif(temp 0)/當(dāng)溫度值為負數(shù) LcdWriteCom(0x80);/寫地址 80表示初始地址 LcdWriteData(-); /顯示負/因為讀取的溫度是實際溫度的補碼,所以減1,再取反求出原碼temp=temp-1;temp=temp;tp=temp;temp=tp*0.0625*100+0.5;/留兩個小數(shù)點就*100,+0.

24、5是四舍五入,因為C語言浮點數(shù)轉(zhuǎn)換為整型的時候把小數(shù)點/后面的數(shù)自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就/算加上0.5,還是在小數(shù)點后面。 else LcdWriteCom(0x80);/寫地址 80表示初始地址 LcdWriteData(+); /顯示正tp=temp;/因為數(shù)據(jù)處理有小數(shù)點所以將溫度賦給一個浮點型變量/如果溫度是正的那么,那么正數(shù)的原碼就是補碼它本身temp=tp*0.0625*100+0.5;/留兩個小數(shù)點就*100,+0.5是四舍五入,因為C語言浮點數(shù)轉(zhuǎn)換為整型的時候把小數(shù)點/后面的數(shù)自動去掉,不管是否大于0.5,而+0.5之后

25、大于0.5的就是進1了,小于0.5的就/算加上0.5,還是在小數(shù)點后面。realtmp=(float)temp/100; datas0 = temp / 10000; datas1 = temp % 10000 / 1000; datas2 = temp % 1000 / 100; datas3 = temp % 100 / 10; datas4 = temp % 10; LcdWriteCom(0x82); /寫地址 80表示初始地址 LcdWriteData(0+datas0); /百位 LcdWriteCom(0x83); /寫地址 80表示初始地址 LcdWriteData(0+dat

26、as1); /十位LcdWriteCom(0x84);/寫地址 80表示初始地址 LcdWriteData(0+datas2); /個位 LcdWriteCom(0x85);/寫地址 80表示初始地址 LcdWriteData(.); /顯示 .LcdWriteCom(0x86); /寫地址 80表示初始地址 LcdWriteData(0+datas3); /顯示小數(shù)點 LcdWriteCom(0x87); /寫地址 80表示初始地址 LcdWriteData(0+datas4); /顯示小數(shù)點 LcdWriteCom(0x88);/寫地址 80表示初始地址 LcdWriteData(C);

27、void LcdDisplay2(float num)unsigned char datas = 0, 0, 0, 0, 0; /定義數(shù)組int temp;/LcdInit(); /初始化LCD LcdWriteCom(0xC0);/寫地址 80表示初始地址 LcdWriteData(+); /顯示正temp=num*100+0.5;/留兩個小數(shù)點就*100,+0.5是四舍五入,因為C語言浮點數(shù)轉(zhuǎn)換為整型的時候把小數(shù)點/后面的數(shù)自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就/算加上0.5,還是在小數(shù)點后面。datas0 = temp / 10000; dat

28、as1 = temp % 10000 / 1000; datas2 = temp % 1000 / 100; datas3 = temp % 100 / 10; datas4 = temp % 10; LcdWriteCom(0xC1); /寫地址 80表示初始地址 LcdWriteData(0+datas0); /百位 LcdWriteCom(0xC2); /寫地址 80表示初始地址 LcdWriteData(0+datas1); /十位LcdWriteCom(0xC3);/寫地址 80表示初始地址 LcdWriteData(0+datas2); /個位 LcdWriteCom(0xC4);/寫地址 80表示初始地址 LcdWriteData(.); /顯示 .LcdWriteCom(0xC5); /寫地址 80表示初始地址 LcdWriteData(0+datas3); /顯示小數(shù)點 LcdWriteCom(0xC6); /寫地址 80表示初始地址 LcdWriteData(0+datas4); /顯示小數(shù)點 LcdWriteCom(0xC7);/寫地址 80表示初始地址 LcdWriteData(C)

溫馨提示

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

評論

0/150

提交評論