版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 單片機(jī)課程設(shè)計(jì)---退火爐溫度控制系統(tǒng)
- 大型立式淬火爐溫度分布參數(shù)系統(tǒng)參數(shù)辨識(shí)研究.pdf
- 單片機(jī)溫度控制課程設(shè)計(jì)
- 課程設(shè)計(jì)---基于單片機(jī)的電阻爐溫度控制系統(tǒng)設(shè)計(jì)
- 31m大型立式擠壓淬火爐溫度智能控制系統(tǒng).pdf
- 退火爐溫度控制系統(tǒng)課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)---基于單片機(jī)的溫度控制智能電風(fēng)扇
- 課程設(shè)計(jì)退火爐溫度控制系統(tǒng)
- 單片機(jī)課程設(shè)計(jì)--基于51單片機(jī)的溫度控制系統(tǒng)設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)——基于51單片機(jī)的溫度控制系統(tǒng)設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)---基于單片機(jī)溫度測量系統(tǒng)設(shè)計(jì)
- 單片機(jī)爐溫系統(tǒng)的課程設(shè)計(jì)
- 大型立式淬火爐溫度分布參數(shù)系統(tǒng)控制策略研究和應(yīng)用.pdf
- 單片機(jī)課程設(shè)計(jì)--基于51單片機(jī)的溫度控制系統(tǒng)設(shè)計(jì)
- 淬火爐爐溫Backstepping與最優(yōu)控制器設(shè)計(jì)及仿真研究.pdf
- 單片機(jī)課程設(shè)計(jì)---雞舍溫度控制設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)---空調(diào)機(jī)溫度控制
- 單片機(jī)課程設(shè)計(jì)-智能溫度控制顯示
- 單片機(jī)溫度控制系統(tǒng)課程設(shè)計(jì)
- 課程設(shè)計(jì)--單片機(jī)溫度控制系統(tǒng)
評(píng)論
0/150
提交評(píng)論