2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩26頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、<p>  基于PID控制的淬火爐爐溫控制系統(tǒng)設(shè)計(jì)</p><p><b>  1總體方案設(shè)計(jì)</b></p><p>  這次課程設(shè)計(jì)針對(duì)PID控制的淬火爐進(jìn)行溫度控制,設(shè)計(jì)步驟分為以下幾步。</p><p>  首先進(jìn)行控制系統(tǒng)的建模和數(shù)字控制器設(shè)計(jì),設(shè)計(jì)方案為:選用Ziegler-Nichols方法進(jìn)行PID參數(shù)整定,建立閉環(huán)控

2、制系統(tǒng),用MATLAB仿真,得到達(dá)到要求的PID參數(shù)。</p><p>  硬件的設(shè)計(jì)與實(shí)現(xiàn),單片機(jī)選用AT89C52,溫度采集用熱電偶,配合MAX6675使用,DA轉(zhuǎn)換用DAC0802實(shí)現(xiàn),LCD用來顯示溫度。系統(tǒng)框圖如圖1-1。</p><p><b>  圖1-1 系統(tǒng)框圖</b></p><p>  軟件設(shè)計(jì),先編寫子程序,包括A/D轉(zhuǎn)

3、換和溫度檢測子程序,延遲子程序,D/A轉(zhuǎn)換子程序,PID控制程序,最后系統(tǒng)初始化并編寫主程序。</p><p>  最后用protues進(jìn)行硬件連線和仿真,看能否達(dá)到系統(tǒng)要求,對(duì)溫度進(jìn)行控制。</p><p>  2控制系統(tǒng)建模和數(shù)字控制器設(shè)計(jì)</p><p><b>  2.1設(shè)計(jì)內(nèi)容</b></p><p>  淬

4、火是生產(chǎn)過程中的一道關(guān)鍵工序,其溫度控制的精度直接影響到產(chǎn)品的質(zhì)量。淬火爐溫度控制通常由多個(gè)溫區(qū)。本設(shè)計(jì)針對(duì)一個(gè)溫區(qū)進(jìn)行溫度控制,要求控制溫度范圍600-800℃,控制精度在±1℃。溫度探頭選用熱電偶。輸出0-10mA電流信號(hào)通過雙向可控硅控制器控制加熱電阻兩端的電壓,輸入電流輸出電壓線性關(guān)系。其對(duì)象溫控?cái)?shù)學(xué)模型為:</p><p><b> ?。?-1)</b></p>

5、;<p>  其中:時(shí)間常數(shù) T=400秒,放大系數(shù) K=100℃/mA,滯后時(shí)間 τ=10秒,控制算法選用PID控制。</p><p>  2.2PID控制器的原理</p><p>  PID控制器是按照偏差的比例、積分、微分進(jìn)行控制的調(diào)節(jié)器的簡稱,主要針對(duì)控制對(duì)象進(jìn)行參數(shù)調(diào)節(jié)。當(dāng)被控對(duì)象的結(jié)構(gòu)和參數(shù)不能被完全掌握,或得不到精確的數(shù)學(xué)模型時(shí),應(yīng)用PID控制技術(shù)最為方便。PI

6、D控制器就是根據(jù)設(shè)定值與實(shí)際值的誤差,利用比例、積分、微分等基本控制規(guī)律,或者把它們適當(dāng)配合形成有PI,PD和PID等的復(fù)合控制規(guī)律,使控制系統(tǒng)滿足性能指標(biāo)要求。</p><p>  典型PID控制系統(tǒng)結(jié)構(gòu)圖如圖2-1,對(duì)誤差信號(hào)分別進(jìn)行比例、積分、微分、組合控制。</p><p>  圖2-1 PID控制系統(tǒng)結(jié)構(gòu)圖</p><p>  PID控制算法模擬表達(dá)式為:

7、</p><p><b>  (2-2)</b></p><p>  對(duì)應(yīng)的模擬PID調(diào)節(jié)器的傳遞函數(shù)為:</p><p><b> ?。?-3)</b></p><p>  在計(jì)算機(jī)控制系統(tǒng)中,PID控制規(guī)律的實(shí)現(xiàn)必須用數(shù)值逼近的方法。當(dāng)采樣周期相當(dāng)短時(shí),用求和代替積分,用后向差分代替微分,是模擬

8、PID離散化變?yōu)椴罘址匠獭?lt;/p><p>  數(shù)字PID位置型控制算式為:</p><p><b> ?。?-4)</b></p><p>  數(shù)字PID增量型控制算式為:</p><p><b>  (2-5)</b></p><p>  其中 稱為比例增益

9、;</p><p><b>  稱為積分系數(shù);</b></p><p><b>  稱為微分系數(shù)。</b></p><p>  如果單純的用數(shù)字PID控制器去模仿模擬調(diào)節(jié)器,不會(huì)獲得更好的效果。因此必須發(fā)揮計(jì)算機(jī)運(yùn)算速度快、邏輯判斷功能強(qiáng)、編程靈活等優(yōu)勢、才能在控制性能上超過模擬調(diào)節(jié)器。</p><p&

10、gt;  在單回路控制系統(tǒng)中,由于擾動(dòng)作用使被控參數(shù)偏離給定值,從而產(chǎn)生偏差。自動(dòng)控制系統(tǒng)的調(diào)節(jié)單元將來自變送器的測量值與給定值相比較后產(chǎn)生的偏差進(jìn)行比例、積分、微分(PID)運(yùn)算,并輸出統(tǒng)一標(biāo)準(zhǔn)信號(hào),去控制執(zhí)行機(jī)構(gòu)的動(dòng)作,以實(shí)現(xiàn)對(duì)溫度、壓力、流量、也為及其他工藝參數(shù)的自動(dòng)控制。比例作用P只與偏差成正比;積分作用I是偏差對(duì)時(shí)間的積累;微分作用D是偏差的變化率。</p><p>  比例控制能迅速反應(yīng)誤差,從而減少

11、穩(wěn)態(tài)誤差。除了系統(tǒng)控制輸入為0和系統(tǒng)過程值等于期望值這兩種情況,比例控制都能給出穩(wěn)態(tài)誤差。當(dāng)期望值有一個(gè)變化時(shí),系統(tǒng)過程值將產(chǎn)生一個(gè)穩(wěn)態(tài)誤差。但是,比例控制不能消除穩(wěn)態(tài)誤差。比例放大系數(shù)的加大,會(huì)引起系統(tǒng)的不穩(wěn)定。</p><p>  為了減小穩(wěn)態(tài)誤差,在控制器中加入積分項(xiàng),積分項(xiàng)對(duì)誤差取決于時(shí)間的積分,隨著時(shí)間的增加,積分項(xiàng)會(huì)增大。這樣,即使誤差很小,積分項(xiàng)也會(huì)隨著時(shí)間的增加而加大,它推動(dòng)控制器的輸出增大使穩(wěn)態(tài)

12、誤差進(jìn)一步減少,直到等于零。</p><p>  積分(I)和比例(P)通常一起使用,稱為比例+積分(PI)控制器,可以使系統(tǒng)在進(jìn)入穩(wěn)態(tài)后無穩(wěn)態(tài)誤差。如果單獨(dú)用積分(I)的話,由于積分輸出隨時(shí)間積累而逐漸增大,故調(diào)節(jié)動(dòng)作緩慢,這樣會(huì)造成調(diào)節(jié)不及時(shí),使系統(tǒng)穩(wěn)定裕度下降。</p><p>  由于自動(dòng)控制系統(tǒng)有較大的慣性組件(環(huán)節(jié))或有滯后(delay)組件,在調(diào)節(jié)過程中可能出現(xiàn)過沖甚至振蕩。

13、解決辦法是引入微分(D)控制,即在誤差很大的時(shí)候,抑制誤差的作用也很大;在誤差接近零時(shí),抑制誤差的作用也應(yīng)該是零。</p><p>  應(yīng)用PID控制,必須適當(dāng)?shù)卣{(diào)整比例放大系數(shù)KP,積分時(shí)間TI和微分時(shí)間TD,使整個(gè)控制系統(tǒng)得到良好的性能。本次設(shè)計(jì)采用Ziegler-Nichols方法來PID參數(shù)整定。</p><p>  2.3Ziegler-Nichols方法</p>

14、<p>  Ziegler-Nichols方法是基于系統(tǒng)穩(wěn)定性分析的PID整定方法.在設(shè)計(jì)過程中無需考慮任何特性要求,整定方法非常簡單,但控制效果卻比較理想。</p><p>  傳統(tǒng)的PID經(jīng)驗(yàn)調(diào)節(jié)大體分為以下幾步:</p><p>  1關(guān)閉控制器的I和D元件,加大P元件,使產(chǎn)生振蕩。</p><p>  2減小P,使系統(tǒng)找到臨界振蕩點(diǎn)。</p&

15、gt;<p>  3加大I,使系統(tǒng)達(dá)到設(shè)定值。</p><p>  4重新上電,觀察超調(diào)、振蕩和穩(wěn)定時(shí)間是否符合系統(tǒng)要求。</p><p>  5針對(duì)超調(diào)和振蕩的情況適當(dāng)增加微分項(xiàng)。</p><p>  以上5個(gè)步驟在調(diào)節(jié)PID控制器時(shí)的普遍步驟,但是在尋找合時(shí)的I和D參數(shù)時(shí),并非易事。</p><p>  John Ziegl

16、er和Nathaniel Nichols發(fā)明了著名的回路整定技術(shù)使得PID算法在所有應(yīng)用在工業(yè)領(lǐng)域內(nèi)的反饋控制策略中是最常用的。Ziegler-Nichols整定技術(shù)是1942年第一次發(fā)表出來,直到現(xiàn)在還被廣泛地應(yīng)用著。</p><p>  所謂的對(duì)PID回路的“整定”就是指調(diào)整控制器對(duì)實(shí)際值與設(shè)定值之間的誤差產(chǎn)生的反作用的積極程度。如果正巧控制過程是相對(duì)緩慢的話,那么PID算法可以設(shè)置成只要有一個(gè)隨機(jī)的干擾改變

17、了過程變量或者一個(gè)操作改變了設(shè)定值時(shí),就能采取快速和顯著的動(dòng)作?! ∠喾吹?,如果控制過程對(duì)執(zhí)行器是特別地靈敏而控制器是用來操作過程變量的話,那么PID算法必須在比較長的一段時(shí)間內(nèi)應(yīng)用更為保守的校正力?;芈氛ǖ谋举|(zhì)就是確定對(duì)控制器作用產(chǎn)生的過程反作用的積極程度和PID算法對(duì)消除誤差可以提供多大的幫助。</p><p>  經(jīng)過多年的發(fā)展,Ziegler-Nichols方法已經(jīng)發(fā)展成為一種在參數(shù)設(shè)定中,處于經(jīng)驗(yàn)和

18、計(jì)算法之間的中間方法。這種方法可以為控制器確定非常精確的參數(shù),在此之后也可進(jìn)行微調(diào)。</p><p>  Ziegler-Nichols方法分為兩步:</p><p>  1構(gòu)建閉環(huán)控制回路,確定穩(wěn)定極限。</p><p>  2根據(jù)公式計(jì)算控制器參數(shù)。</p><p>  穩(wěn)定極限是由P元件決定的。當(dāng)出現(xiàn)穩(wěn)態(tài)振蕩時(shí)就達(dá)到了這個(gè)極限。產(chǎn)生了臨

19、界系數(shù)Kpcrit和臨界振蕩周期Tcrit</p><p>  確定臨界系數(shù)Kpcrit和臨界振蕩周期Tcrit后,根據(jù)表2-1的公式,計(jì)算其他參數(shù):</p><p>  表2-1 PID參數(shù)的計(jì)算</p><p>  2.4PID參數(shù)的整定</p><p>  首先建立閉環(huán)系統(tǒng),采用階躍輸入,不加入PID控制器,如圖2-2,用MATLAB仿

20、真,得到輸出如圖2-3。</p><p>  圖2-2 不加PID控制器結(jié)構(gòu)圖</p><p>  圖2-3 不加PID控制器的階躍響應(yīng)</p><p>  加入PID控制器的結(jié)構(gòu)圖如圖2-4</p><p>  圖2-4 加入PID控制器的結(jié)構(gòu)圖</p><p>  根據(jù)Ziegler-Nichols方法,先使積分和

21、微分系數(shù)為0,只用比例控制,比例系數(shù)從小到大,使階躍響應(yīng)出現(xiàn)穩(wěn)態(tài)振蕩,當(dāng)時(shí),得到圖2-5所示曲線。</p><p><b>  圖2-5 時(shí)的曲線</b></p><p>  由此可知KPcrit=0.655,Tcrit=37,由表2-1可以計(jì)算出PID參數(shù):</p><p><b> ?。?-6)</b></p&g

22、t;<p><b> ?。?-7)</b></p><p><b> ?。?-8)</b></p><p>  圖2-6 用計(jì)算參數(shù)得到的曲線</p><p>  用計(jì)算的參數(shù)進(jìn)行仿真得到圖2-6,發(fā)現(xiàn)系統(tǒng)超調(diào)較大,將積分系數(shù)減小,比例和微分系數(shù)進(jìn)行微調(diào),最后當(dāng) 、 、

23、 時(shí)曲線如圖2-7所示。</p><p>  圖2-7 參數(shù)調(diào)整后得到的曲線</p><p><b>  3硬件的設(shè)計(jì)與實(shí)現(xiàn)</b></p><p>  3.1完整系統(tǒng)電路圖</p><p>  圖3-1 完整系統(tǒng)電路圖</p><p>  圖3-1為本次設(shè)計(jì)的完整系統(tǒng)電路圖。</p&g

24、t;<p><b>  3.2溫度檢測</b></p><p>  本系統(tǒng)采用熱電偶來采集溫度,并使用MAX6675作為熱電偶放大器和A/D轉(zhuǎn)換。</p><p>  熱電偶是一種感溫元件,它把溫度信號(hào)轉(zhuǎn)換成熱電動(dòng)勢信號(hào),通過電氣儀表轉(zhuǎn)換成被測介質(zhì)的溫度。熱電偶測溫的基本原理是兩種不同成份的均質(zhì)導(dǎo)體組成閉合回路,當(dāng)兩端存在溫度梯度時(shí),回路中就會(huì)有電流通過

25、,此時(shí)兩端之間就存在Seebeck電動(dòng)勢:熱電動(dòng)勢,這就是所謂的塞貝克效應(yīng)。兩種不同成份的均質(zhì)導(dǎo)體為熱電極,溫度較高的一端為工作端,溫度較低的一端為自由端,自由端通常處于某個(gè)恒定的溫度下。根據(jù)熱電動(dòng)勢與溫度的函數(shù)關(guān)系,制成熱電偶分度表,分度表是自由端溫度在0 ℃時(shí)的條件下得到的,不同的熱電偶具有不同的分度表。在熱電偶回路中接入第三種金屬材料時(shí),只要該材料兩個(gè)接點(diǎn)的溫度相同,熱電偶所產(chǎn)生的熱電勢將保持不變,即不受第三種金屬接入回路中的影響

26、。因此,在熱電偶測溫時(shí),可接入測量儀表,測得熱電動(dòng)勢后,即可知道被測介質(zhì)的溫度。</p><p>  Maxim公司新近推出的MAX6675即是一個(gè)集成了熱電偶放大器、冷端補(bǔ)償、A/D轉(zhuǎn)換器及SPI串口的熱電偶放大器與數(shù)字轉(zhuǎn)換器。MAX6675的主要特性如下:簡單的SPI串行口溫度值輸出;0℃~+1024℃的測溫范圍;12位0.25℃的分辨率;片內(nèi)冷端補(bǔ)償;高阻抗差動(dòng)輸入;熱電偶斷線檢測;單一+5V的電源電壓;低

27、功耗特性;工作溫度范圍-20℃~+85℃;2000V的ESD信號(hào)。MAX6675是一復(fù)雜的單片熱電偶數(shù)字轉(zhuǎn)換器,內(nèi)部具有信號(hào)調(diào)節(jié)放大器、12位的模擬/數(shù)字化熱電偶轉(zhuǎn)換器、冷端補(bǔ)償傳感和校正、數(shù)字控制器、1個(gè)SPI兼容接口和1個(gè)相關(guān)的邏輯控制。</p><p><b>  3.3溫度顯示</b></p><p>  本次設(shè)計(jì)的顯示部分采用LM016L,可顯示2行16列英

28、文字符,有8位數(shù)據(jù)總線D0-D7,RS,R/W,EN三個(gè)控制端口(共14 線),工作電壓為 5V。沒背光,和常用的1602B功能和引腳一樣(除了調(diào)背光的二個(gè)線腳)。本次設(shè)計(jì)用LM016L顯示爐溫溫度和用戶設(shè)定的溫度。</p><p>  3.4D/A轉(zhuǎn)換電路</p><p>  D/A轉(zhuǎn)換采用DAC0832來實(shí)現(xiàn),DAC0832是雙列直插式8位D/A轉(zhuǎn)換器。能完成數(shù)字量輸入到模擬量(電流)

29、輸出的轉(zhuǎn)換。分辨率為8位,轉(zhuǎn)換時(shí)間為1μs,滿量程誤差為±1LSB,</p><p>  當(dāng)ILE為高電平,片選信號(hào)/CS和寫信號(hào)/WR1為低電平時(shí),輸入寄存器控制信號(hào)為1,這種情況下,輸入寄存器的輸出隨輸入而變化。此后,當(dāng)/WR1由低電平變高時(shí),控制信號(hào)成為低電平,此時(shí),數(shù)據(jù)被鎖存到輸入寄存器中,這樣輸入寄存器的輸出端不再隨外部數(shù)據(jù)DB的變化而變化。</p><p>  對(duì)第二

30、級(jí)鎖存來說,傳送控制信號(hào) /XFER和寫信號(hào) /WR2同時(shí)為低電平時(shí),二級(jí)鎖存控制信號(hào)為高電平,8位的DAC寄存器的輸出隨輸入而變化,此后,當(dāng)/WR2由低電平變高時(shí),控制信號(hào)變?yōu)榈碗姡谑菍⑤斎爰拇嫫鞯男畔㈡i存到DAC寄存器中。</p><p><b>  3.5加熱電路</b></p><p>  加熱電路如圖3-2。</p><p><

31、;b>  圖3-2 加熱電路</b></p><p>  當(dāng)爐溫溫度低于設(shè)定的溫度時(shí),L1進(jìn)行加熱,而由于電容,加熱的快慢取決于兩個(gè)溫度值的差值。</p><p><b>  4軟件設(shè)計(jì)</b></p><p>  圖4-1 主程序流程圖</p><p>  主程序流程圖如圖4-1所示。</p&g

32、t;<p>  熱電偶檢測到的溫度經(jīng)MAX6675放大和A/D轉(zhuǎn)換送入單片機(jī),程序首先在液晶顯示器上顯示開始設(shè)定的溫度和實(shí)際溫度,接著一直掃描鍵盤,如果KS0按下一次,則設(shè)定溫度加1,并在液晶顯示器上顯示出來;如果KS1按下一次,則設(shè)定溫度減1,在液晶顯示器上顯示出來。將設(shè)定值溫度與實(shí)際值比較,計(jì)算差值,如果實(shí)際溫度小于設(shè)定溫度,將差值送入DAC轉(zhuǎn)換器,是加熱電路進(jìn)行加熱,如果實(shí)際溫度大于設(shè)定溫度,因?yàn)闆]有冷卻裝置,只能不

33、進(jìn)行加熱,是溫度自然將下來。運(yùn)行過程對(duì)鍵盤掃描重復(fù)上述過程。</p><p><b>  參考文獻(xiàn)</b></p><p>  [1]潘新民.單片微型計(jì)算機(jī)實(shí)用系統(tǒng)設(shè)計(jì).人民郵電出版社, 1992.07</p><p>  [2]沙占友.單片機(jī)外圍電路設(shè)計(jì)[M].北京:電子工業(yè)出版社, 2003.01</p><p> 

34、 [3]于海生.微型計(jì)算機(jī)控制技術(shù).清華大學(xué)出版社,2007</p><p>  [4]孫育才. ATMEL新型AT89S51系列單片機(jī)及其應(yīng)用.清華大學(xué)出版社,2005.01</p><p>  [5]賈金玲.單片機(jī)原理及應(yīng)用.電子科技大學(xué)出版社,2004.08</p><p><b>  附錄1 主程序</b></p><

35、;p>  #include <reg52.h></p><p>  #include <LCD1602.h></p><p>  #include <intrins.h> </p><p>  #include <ABSACC.H> </p><p>  #include <S

36、TRING.H> </p><p>  #include <STDIO.H> </p><p>  #include<MATH.H> </p><p>  #defineuchar unsigned char</p><p>  #define uint unsigned

37、int</p><p><b>  uchar m;</b></p><p>  sbit lcd=P2^0;</p><p>  sbit DOUT=P2^3;</p><p>  sbit SCLK=P2^4;</p><p>  sbit CS=P2^5;</p><p&

38、gt;  sbit le=P2 ^ 1; </p><p>  sbit oe=P2 ^ 2;</p><p>  sbit RELAY=P2^6;</p><p>  sbit KS0=P1^0;</p><p>  sbit KS1=P1^1;</p><p>  sbit KS2=P1^2;</

39、p><p>  uchar code LcdBuf1[]= {"Set temp:"} ;</p><p>  uchar code LcdBuf2[]= {"Rel temp:"};</p><p>  uchar Vref=5;</p><p>  uchar a[6];</p><

40、p>  uchar g[6];</p><p>  unsigned char sumout; </p><p>  uint SET_TEMP=650;</p><p>  unsigned int read_max6675(void) </p><p>  {unsigned char i; </p>&

41、lt;p>  unsigned int AD=0; </p><p><b>  CS=0; </b></p><p>  SCLK=0; /*輸出數(shù)據(jù)D15*/ </p><p><b>  SCLK=1; </b></p><p>  for(i=12;i>0;i--) /

42、*讀取轉(zhuǎn)換結(jié)果*/ </p><p>  {SCLK=0; </p><p>  if(DOUT==1)AD++; </p><p>  AD=AD<<1; /*數(shù)據(jù)左移*/ </p><p><b>  SCLK=1; </b></p><p><b>  } &

43、lt;/b></p><p><b>  SCLK=0; </b></p><p>  //flag=SO;/*讀取D2斷偶標(biāo)志*/ </p><p><b>  SCLK=1; </b></p><p><b>  SCLK=0; </b></p><

44、;p>  /*輸出數(shù)據(jù)D1*/ </p><p><b>  SCLK=1; </b></p><p><b>  SCLK=0; </b></p><p>  /*輸出數(shù)據(jù)D0*/ </p><p><b>  SCLK=1; </b></p><p

45、><b>  CS=1; </b></p><p>  return AD; </p><p><b>  } </b></p><p>  unsigned ADC1() </p><p><b>  {</b></p><p><b>

46、;  long l;</b></p><p><b>  uint q=0;</b></p><p>  l=read_max6675();</p><p>  l=(24489/4100)*l*Vref+1; //轉(zhuǎn)換為電壓值</p><p><b>  l=l+7500;</b>

47、</p><p>  g[0]=(l/10000)%10+'0'; //取得整數(shù)值到數(shù)組 </p><p>  g[1]=(l/1000)%10+'0'; </p><p>  g[2]=(l/100)%10+'

48、0'; </p><p>  //a[3]='.'; //忽略小數(shù)</p><p>  //a[4]=t%10+'0'; </p><p>  q=(g[0]-'0')*100+(g[1]-'0')*10+(g[2]-'0');</p>&l

49、t;p>  return q ;</p><p><b>  }</b></p><p>  void ADC() </p><p><b>  {</b></p><p><b>  long t;</b></p><p>  t=read_m

50、ax6675();</p><p>  t=(24489/4100)*t*Vref+1;//轉(zhuǎn)換為電壓值</p><p><b>  t=t+7500;</b></p><p>  a[0]=(t/10000)%10+'0'; //取得整數(shù)值到數(shù)組 </p><p

51、>  a[1]=(t/1000)%10+'0'; </p><p>  a[2]=(t/100)%10+'0'; </p><p><b>  } </b></p><p>  void constant_temperature()

52、//恒溫</p><p><b>  {</b></p><p><b>  uint b;</b></p><p>  b=(a[0]-'0')*100+(a[1]-'0')*10+(a[2]-'0');</p><p>  if(b<=

53、SET_TEMP)</p><p><b>  {</b></p><p><b>  RELAY=0;</b></p><p>  m=SET_TEMP-b;</p><p>  m=(unsigned char)(m/256);</p><p><b>  }&

54、lt;/b></p><p>  else </p><p><b>  {

55、</b></p><p><b>  RELAY=1;</b></p><p>  m=SET_TEMP-b;</p><p>  m=(unsigned char)(m/256);</p><p><b>  }</b></p><p><b>  }

56、</b></p><p>  void delay_ms(uchar ms)</p><p><b>  {</b></p><p><b>  uint i,j;</b></p><p>  for(i=0;i<ms;i++)</p><p>  for(

57、j=0;j<120;j++);</p><p><b>  }</b></p><p>  typedef struct { </p><p>  double SetPoint; /* 設(shè)定目標(biāo) Desired Value */ </p><p>  double Propor

58、tion; /* 比例常數(shù) Proportional Const */ </p><p>  double Integral; /* 積分常數(shù) Integral Const */ </p><p>  double Derivative; /* 微分常數(shù) Derivative Const */ </p>

59、<p>  double LastError; /* 前一項(xiàng)誤差 */ </p><p>  double PrevError; /* 前第二項(xiàng)誤差 */ </p><p>  double SumError; /* 總誤差 */ </p><p>  } PID;

60、 </p><p>  /**************************************************************************** </p><p><b>  PID計(jì)算部分 </b></p><p>  *******************************************

61、*********************************/ </p><p>  double PIDCalc( PID *pp, double NextPoint ) </p><p><b>  { </b></p><p>  double dError,Error; </p><p>  

62、double SetPoint; </p><p>  SetPoint=SET_TEMP;</p><p>  Error = pp->SetPoint - NextPoint; /* 計(jì)算當(dāng)前偏差 */ </p><p>  pp->SumError += Error; /* 積分《

63、總偏差》*/ </p><p>  dError = pp->LastError - pp->PrevError; /* 當(dāng)前微分 */ </p><p>  pp->PrevError = pp->LastError; </p><p>  pp->LastError = Error;

64、 /* 三個(gè)誤差值移位 */ </p><p>  return(NextPoint+pp->Proportion * Error + pp->Integral * pp->SumError + pp->Derivative * dError ); /*《返回總的誤差值》*/ <

65、;/p><p><b>  } </b></p><p>  void pid(void) </p><p><b>  { </b></p><p>  PID sPID; /* 定義PID結(jié)構(gòu)體變量 */

66、</p><p>  double rOut; /* PID 響應(yīng)輸出 */ </p><p>  unsigned char rIn; /* PID 反饋 (Input) */ </p><p>  double

67、 x; </p><p>  sPID.Proportion = 0.36; /* 設(shè)置 PID 比例系數(shù) */ </p><p>  sPID.Integral = 0.0006; /* 設(shè)置PID積分系數(shù) */ </p><p>  s

68、PID.Derivative = 1.8; /* 設(shè)置PID微分系數(shù) */ </p><p>  sPID.SetPoint = 2.0; /* 設(shè)置 PID 輸出值 */ </p><p><b>  { </b></p>

69、;<p>  unsigned char sumout; /* PID進(jìn)入循環(huán)檢測狀態(tài)中 */ </p><p>  unsigned char i; </p><p>  rIn = ADC1(); /* 讀傳感器輸出 */

70、 </p><p>  for(i=0;i<50;i++) </p><p>  x = 5.0 * (double)rIn / 256.0; </p><p>  rOut = PIDCalc ( &sPID,x ); /* 計(jì)算PID 輸出 */ </p><p>  s

71、umout=rOut*256/5; </p><p><b>  } </b></p><p><b>  } </b></p><p>  void dac0832(out)</p><p><b>  {</b></p><p><

72、b>  RELAY=0;</b></p><p><b>  P3=out;</b></p><p>  delay(100);</p><p><b>  RELAY=1;</b></p><p><b>  }</b></p><p&g

73、t;  void key(void )</p><p><b>  {</b></p><p>  if(KS0==0)</p><p>  delay_ms(1);</p><p>  if(KS0==0)</p><p>  SET_TEMP++;</p><p>  

74、while(!KS0);</p><p>  if(KS1==0)</p><p>  delay_ms(1);</p><p>  if(KS1==0)</p><p>  SET_TEMP--;</p><p>  while(!KS1);</p><p>  display_onechar

75、(0,9,SET_TEMP/100+'0');</p><p>  display_onechar(0,10,(SET_TEMP%100)/10+'0');</p><p>  display_onechar(0,11,SET_TEMP%10+'0');</p><p><b>  }</b>&l

76、t;/p><p><b>  main()</b></p><p><b>  { </b></p><p>  lcd_init();</p><p>  display_string(0,0,LcdBuf1);</p><p>  display_string(1,0,L

77、cdBuf2);</p><p>  Write_CGRAM(LcdBuf); //向CGRAM寫入自定義的攝氏度符號(hào)</p><p>  display_onechar(0,12,0); //顯示自定義的攝氏度符號(hào)</p><p>  display_onechar(0,13,1); //顯示自定義的攝氏度符號(hào)</p><p&g

78、t;  display_onechar(1,12,0);</p><p>  display_onechar(1,13,1);</p><p><b>  while(1)</b></p><p><b>  { </b></p><p><b>  key();</b><

79、;/p><p><b>  ADC();</b></p><p>  constant_temperature();</p><p>  display_string(1,9,a);</p><p><b>  pid();</b></p><p>  dac0832(sumou

80、t);</p><p>  delay_ms(100);</p><p><b>  }</b></p><p><b>  } </b></p><p><b>  附錄2 LCD程序</b></p><p>  #ifndef LCD_1602_&l

81、t;/p><p>  #define LCD_1602_</p><p>  #include <reg52.h></p><p>  #include <intrins.h></p><p>  sbit LCD_RS = P2 ^ 0; </p><p>  sbit LCD_RW = P

82、2 ^ 1; </p><p>  sbit LCD_E = P2 ^ 2;</p><p>  #define LCD_DATA P0 </p><p>  unsigned char code LcdBuf[]= {//自定義漢字5X7;最大能存儲(chǔ)64個(gè)字節(jié)</p><p>  0x0c,0x12,0

83、x12,0x0c,0x00,0x00,0x00,0x00,</p><p>  0x0f,0x10,0x10,0x10,0x10,0x10,0x0f,0x00,</p><p><b>  };</b></p><p>  void delay(unsigned int ms)</p><p><b>

84、;  {</b></p><p>  unsigned char y;</p><p>  for(;ms>0;ms--)</p><p>  for(y=120;y>0;y--);</p><p><b>  }</b></p><p>  bit lcd_busy()&

85、lt;/p><p>  { // 測試LCD忙碌狀態(tài)</p><p>  bit result;</p><p>  LCD_RS = 0;</p><p>  LCD_RW = 1;</p><p>  LCD_E = 1;</p><p><

86、;b>  _nop_();</b></p><p><b>  _nop_();</b></p><p><b>  _nop_();</b></p><p><b>  _nop_();</b></p><p>  result =(LCD_DATA &a

87、mp; 0x80);</p><p>  LCD_E = 0;</p><p>  return result; </p><p><b>  }</b></p><p>  void WriteCommand(unsigned char wdata)</p><p><b>  {

88、</b></p><p>  while(lcd_busy());</p><p>  LCD_DATA=wdata;</p><p><b>  LCD_RS=0;</b></p><p><b>  LCD_RW=0;</b></p><p><b>

89、;  LCD_E=1;</b></p><p><b>  LCD_E=0;</b></p><p>  delay(5); </p><p><b>  LCD_E=1;</b></p><p><b>  }</b></p><p>

90、;  void WriteData(unsigned char wdata)</p><p><b>  {</b></p><p>  while(lcd_busy());</p><p>  LCD_DATA=wdata;</p><p><b>  LCD_RS=1;</b></p&

91、gt;<p><b>  LCD_RW=0;</b></p><p><b>  LCD_E=1;</b></p><p><b>  LCD_E=0;</b></p><p>  delay(5); </p><p><b>  LCD_E=1;

92、</b></p><p><b>  }</b></p><p>  void lcd_init(void)</p><p><b>  {</b></p><p>  WriteCommand(0x38);</p><p>  WriteCommand(0x3

93、8); </p><p>  WriteCommand(0x38); </p><p>  delay(5); </p><p>  WriteCommand(0x08); </p><p>  WriteCommand(0x01); </p><p>  WriteCommand(0x06); </p>

94、<p>  WriteCommand(0x0c); </p><p><b>  }</b></p><p>  void set_xy(unsigned char x,unsigned char y)</p><p><b>  { </b></p><p>  switch (

95、x)</p><p><b>  {</b></p><p>  case 0: y+=0x80; break;</p><p>  case 1: y+=0xc0; break;</p><p><b>  }</b></p><p>  WriteCommand(y);&

96、lt;/p><p><b>  }</b></p><p>  void display_onechar(unsigned char x,unsigned char y,unsigned char wdate)</p><p><b>  {</b></p><p>  set_xy(x,y);

97、</p><p>  WriteData(wdate);</p><p><b>  }</b></p><p>  void display_string(unsigned char x,unsigned char y,unsigned char *s)</p><p><b>  {</b&g

98、t;</p><p>  set_xy(x,y);</p><p><b>  while(*s)</b></p><p><b>  {</b></p><p>  WriteData(*s);</p><p><b>  s++;</b></p

99、><p><b>  }</b></p><p><b>  }</b></p><p>  /******************************************************************/</p><p>  void Write_CGRAM(unsigned

100、 char *p)</p><p><b>  {</b></p><p>  unsigned char i,j,kk;</p><p>  unsigned char tmp=0x40; //操作CGRAM的命令碼</p><p><b>  kk=0;</b></p>

101、<p>  for(j=0;j<2;j++) //64 字節(jié)存儲(chǔ)空間,可以生成 8 個(gè)自定義字符點(diǎn)陣 64X8</p><p><b>  {</b></p><p>  for(i=0;i<8;i++) // 8 個(gè)字節(jié)生成 1 個(gè)字符點(diǎn)陣</p><p><b>  {&l

102、t;/b></p><p>  WriteCommand(tmp+i); //操作CGRAM的命令碼+寫入CGRAM地址.</p><p>  WriteData(p[kk]); //寫入數(shù)據(jù)</p><p><b>  kk++;</b></p><p><b>  }</b

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲(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)論