版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 目錄</b></p><p><b> 摘要2</b></p><p><b> 1.設計目的3</b></p><p> 2.設計要求和設計指標3</p><p> 3. 總體方案設計3</p><p>
2、 4.硬件選擇以及相關電路設計4</p><p> 4.1溫度傳感器的選擇4</p><p> 4.2 模數(shù)轉換器5</p><p> 4.2.1ADC0809內(nèi)部結構6</p><p> 4.2.2信號引腳7</p><p> 4.2.3工作時序與使用說明8</p><p&g
3、t; 4.3控制器89C5110</p><p> 4.4數(shù)碼管顯示電路11</p><p> 4.4.1 LED數(shù)碼管的組成11</p><p> 4.4.2數(shù)碼管顯示方式12</p><p> 5.PID控制算法14</p><p> 6. 各子程序流程圖15</p><
4、p> 6.1 PID控制程序流程圖15</p><p> 6.2 A/D轉換程序流程圖15</p><p> 6.3 顯示程序流程圖16</p><p> 6.4溫度控制總程序流程圖16</p><p><b> 心得體會17</b></p><p><b>
5、 參考文獻18</b></p><p> 附錄1:溫度控制系統(tǒng)總電路圖19</p><p> 附錄2:溫度控制系統(tǒng)程序清單21</p><p><b> 摘要</b></p><p> 溫度控制是工業(yè)生產(chǎn)過程中經(jīng)常遇到的過程控制,有些工藝過程對其溫度的控制效果直接影響著產(chǎn)品的質量,因而設計一種較
6、為理想的溫度控制系統(tǒng)是非常有價值的。本設計介紹了以AD590集成溫度傳感器為采集器、AT89C51為控制器、ADC0809為A/D轉換器對溫度進行智能控制的溫度控制系統(tǒng)。其主要過程如下:利用傳感器對將非電量信號轉化成電信號,轉換后的電信號再入A/D轉換成數(shù)字量,傳遞給單片機進行數(shù)據(jù)處理,并向外圍設備發(fā)出控制信號。</p><p> 論文首先介紹了單片機控制系統(tǒng)的整體方案設計及原理,然后具體介紹了控制系統(tǒng)的溫度傳
7、感器部分、A/D轉換部分、控制器89C51部分以及數(shù)碼管顯示和鍵盤控制部分,接著相信介紹了溫度控制系統(tǒng)各個單元電路的設計,最后闡述了溫度控制系統(tǒng)軟件設計的主程序和各個子程序。</p><p> 關鍵字:單片機89C51 溫度傳感器 A/D轉換器 溫度控制</p><p><b> 計算機溫度測控系統(tǒng)</b></p><p><b
8、> 1.設計目的</b></p><p> 設計制作和調試一個由工業(yè)控制機控制的溫度測控系統(tǒng)。通過這個過程學習溫度的采樣方法,A/D變換方法以及數(shù)字濾波的方法。通過實踐過程掌握溫度的幾種控制方法,了解利用計算機進行自動控制的系統(tǒng)結構。</p><p> 2.設計要求和設計指標</p><p> 1、每組4~5同學,每個小組根據(jù)設計室提供的設
9、備及設計要求,設計出實際電路組成一個完整的計算機溫度測控系統(tǒng)。</p><p> 2、根據(jù)設備情況以及被控對象,選擇1~2種合適的控制算法, </p><p> 框圖和源程序,并進行實際操作和調試通過。</p><p> 編制程序溫度指標:60~80℃之間任選;偏差:1℃。</p><p><b> 總體方案設計<
10、;/b></p><p> 本系統(tǒng)主要由數(shù)據(jù)采集、信號放大、模數(shù)轉換等模塊構成。設計思想是通過溫度傳感器將溫度信號轉變?yōu)殡娏鳎妷海┬盘?,但我們要知道?jīng)溫度變化引起電流(電壓)信號的改變是非常小的,此時如果被模數(shù)轉換器采集的話效果是非常不明顯的,因此我們將其通過一個信號放大模塊進行放大。再通過模數(shù)轉換器后送入單片機AT89C51,而單片機通過PID算法控制烘箱的電爐加熱,并且使數(shù)碼管顯示實時溫度,從而實現(xiàn)
11、溫度的高精度控制。</p><p> 4.硬件選擇以及相關電路設計</p><p> 4.1溫度傳感器的選擇</p><p> 傳感器的選取目前市場上溫度傳感器繁多就此我們提出了以下三種選取方案:</p><p> 方案一:選用鉑電阻溫度傳感器,此類溫度傳感器在各方面特性都比較優(yōu)秀,但其成本較高。</p><p&g
12、t; 方案二:采用熱敏電阻,選用此類元器件有價格便宜的優(yōu)點,但由于熱敏電阻的非線性特性會影響系統(tǒng)的精度。</p><p> 方案三:選用美國Analog Devices 公司生產(chǎn)的二端集成電流傳感器AD590,此器件具有體積小、質量輕、線形度好、性能穩(wěn)定等優(yōu)點。其測量范圍在-50℃--+150℃,滿刻度范圍誤差為±0.3℃,當電源電壓在5—10V之間,穩(wěn)定度為1﹪時,誤差只有±0.01℃,
13、其各方面特性都滿足此系統(tǒng)的設計要求。</p><p> 比較以上三種方案,方案三具有明顯的優(yōu)點,因此此次設計選用方案三。</p><p> 圖4-1 溫度采集電路</p><p> 選用溫度傳感器AD590,AD590具有較高精度和重復性(重復性優(yōu)于0.1℃,其良好的非線形可以保證優(yōu)于0.1℃的測量精度,利用其重復性較好的特點,通過非線形補償,可以達到0.1℃
14、測量精度)。超低溫漂移高精度運算放大器OP-07將“溫度-電壓”信號放大。便于A/D進行轉換,以提高溫度采集電路的可靠性。</p><p> 集成溫度傳感器的輸出形式分為電壓輸出和電流輸出兩種。電壓輸出型的靈敏度一般為10mV/K,溫度0℃時輸出為0,溫度25℃時輸出為2.982V。電流輸出型的靈敏度為1µA/K。這樣便于A/D轉換器采集數(shù)據(jù)。</p><p><b>
15、; 4.2 模數(shù)轉換器</b></p><p> ADC0809是M美國國家半導體公司生產(chǎn)的CMOS工藝8通道,8位逐次逼近式A/D轉換器。其內(nèi)部有一個8通道多路開關,它可以根據(jù)地址碼鎖存譯碼后的信號,只選通8路模擬輸入信號中的一個進行A/D轉換,其轉換時間為100μs左右。是目前國內(nèi)應用最廣泛的8位通用A/D芯片。</p><p> 圖4-2 ADC0809引腳圖<
16、;/p><p> 4.2.1ADC0809內(nèi)部結構</p><p> 圖中多路開關可選通8個模擬通道,允許8路模擬量分時輸入,共用一個A/D轉換器進行轉換,這是一種經(jīng)濟的多路數(shù)據(jù)采集方法。地址鎖存與譯碼電路完成對A、B、C 3個地址位進行鎖存和譯碼,其譯碼輸出用于通道選擇,其轉換結果通過三態(tài)輸出鎖存器存放、輸出,因此可以直接與系統(tǒng)數(shù)據(jù)總線相連,表4-1為通道選擇表。 </p>
17、<p> 圖4-3 ADC0809內(nèi)部結構圖</p><p><b> 表4-1通道選擇表</b></p><p><b> 4.2.2信號引腳</b></p><p> ADC0809的內(nèi)部結構和外部引腳分別如圖4-3和圖4-2所示。內(nèi)部各部分的作用和工作原理在內(nèi)部結構圖中已一目了然,在此就不再贅述,
18、下面僅對各引腳定義分述如下: </p><p> ?。?)IN0~IN7——8路模擬輸入,通過3根地址譯碼線ADDA、ADDB、ADDC來選通一路。</p><p> (2)D7~D0——A/D轉換后的數(shù)據(jù)輸出端,為三態(tài)可控輸出,故可直接和微處理器數(shù)據(jù)線連接。8位排列順序是D7為最高位,D0為最低位。</p><p> ?。?)ADDA、ADDB、ADDC——模擬
19、通道選擇地址信號,ADDA為低位,ADDC為高位。地址信號與選中通道對應關系如表4-1所示。</p><p> ?。?)VR(+)、VR(-)——正、負參考電壓輸入端,用于提供片內(nèi)DAC電阻網(wǎng)絡的基準電壓。在單極性輸入時,VR(+)=5V,VR(-)=0V;雙極性輸入時,VR(+)、VR(-)分別接正、負極性的參考電壓。</p><p> ?。?)ALE——地址鎖存允許信號,高電平有效。當
20、此信號有效時,A、B、C三位地址信號被鎖存,譯碼選通對應模擬通道。在使用時,該信號常和START 信號連在一起,以便同時鎖存通道地址和啟動A/D轉換。</p><p> START——A/D轉換啟動信號,正脈沖有效。加于該端的脈沖的上升沿使逐次逼近寄存止,重新從頭開始轉換器清零,下降沿開始A/D轉換。如正在進行轉換時又接到新的啟動脈沖,則原來的轉換進程被中。</p><p&g
21、t; ?。?)EOC——轉換結束信號,高電平有效。該信號在A/D轉換過程中為低電平,其余時間為高電平。該信號可作為被CPU查詢的狀態(tài)信號,也可作為對CPU的中斷請求信號。在需要對某個模擬量不斷采樣、轉換的情況下,EOC也可作為啟動信號反饋接到START端,但在剛加電時需由外電路第一次啟動。</p><p> (8)OE——輸出允許信號,高電平有效。當微處理器送出該信號時,ADC0808/0809的輸出三態(tài)門被打
22、開,使轉換結果通過數(shù)據(jù)總線被讀走。在中斷工作方式下,該信號往往是CPU發(fā)出的中斷請求響應信號。</p><p> 4.2.3工作時序與使用說明</p><p> 圖4-4 ADC0809工作時序圖</p><p> 用單片機控制ADC時,多數(shù)采用查詢和中斷控制兩種方式。查詢法是在單片機把啟動命令送到ADC之后,執(zhí)行別的程序,同時對ADC的狀態(tài)進行查詢,以檢查A
23、DC變換是否已經(jīng)完成,如查詢到變換已結束,則讀入轉換完畢的數(shù)據(jù)。中斷控制是在啟動信號送到ADC之后,單片機執(zhí)行別的程序。當ADC轉換結束并向單片機發(fā)出中斷請求信號時,單片機響應此中斷請求,進入中斷服務程序,讀入轉換數(shù)據(jù),并進行必要的數(shù)據(jù)處理,然后返回到原程序。這種方法單片機無需進行轉換時間管理,CPU效率高,所以特別適合于變換時間較長的ADC。本設計采用查詢方式進行數(shù)據(jù)收集。由于ADC0809片內(nèi)無時鐘,故運用8051提供的地址鎖存使能
24、信號ALE經(jīng)D觸發(fā)器二分頻后獲得時鐘。因為ALE信號的頻率是單片機時鐘頻率的1/6,如果時鐘頻率為6MHz,則ALE信號的頻率為1MHz,經(jīng)二分頻后為500kHz,與AD0809時鐘頻率的典型值吻合。由于AD0809具有三態(tài)輸出鎖存器,故其數(shù)據(jù)輸出引角可直接與單片機的總線相連。地址碼引腳ADDA~C分別與地址總線的低3位A0、A1、A2相連,以選通IN0~IN7中的一個通道。采用單片機的P2.7(地址總線最高位</p>&
25、lt;p> ADC0809是一個8路8位逐次逼近的A/D轉換器。AD0809的轉換時間為100µs。在CPU啟動A/D命令后,便執(zhí)行一個固定的延時程序,延時時間應略大于A/D的轉換時間;延時程序一結束,便執(zhí)行數(shù)據(jù)讀入指令,讀取轉換結果。我們只用了其一路AD轉換,參考電壓2.56V,即一位數(shù)字量對應10mV即1℃。所以用起來很方便。</p><p> ADC0809是帶有8路模擬開關的8位A/D
26、轉換芯片,所以它可有8個模擬量的輸入端,由芯片的A,B,C三個引腳來選擇模擬通道中的一個。A,B,C三端分別與AT89C51的P0.0~P0.2相接。地址鎖存信號(ALE)和啟動轉換信號(START),由P2.6和/WR或非得到。輸出允許,由P2.6和/RD或非得到。時鐘信號,可有89C51的ALE輸出得到,不過當采用12M晶振時,應該先進行二分頻,以滿足ADC0809的時鐘信號必須小于640K的要求。</p><p
27、> 4.3控制器89C51</p><p> AT89C51是美國ATMEL公司生產(chǎn)的低電壓 ,高性能CMOS 8位單片機,片內(nèi)含4k bytes的可反復擦寫的Flash只讀程序存儲器和128 bytes的隨機存取數(shù)據(jù)存儲器(RAM ),器件采用ATMEL公司的高密度、非易失性存儲技術生產(chǎn),兼容標準MCS-51指令系統(tǒng),片內(nèi)置通用8位中央處理器(CPU)和Flash存儲單元,功能強大AT89C51單片機
28、可為您提供許多高性價比的應用場合,可靈活應用于各種控制領域。</p><p> AT89C51單片機的主要特性:</p><p> (1)與MCS-51 兼容,4K字節(jié)可編程閃爍存儲器;</p><p> (2)靈活的在線系統(tǒng)編程,掉電標識和快速編程特性;</p><p> (3)壽命為1000次寫/擦周期,數(shù)據(jù)保留時間可10年以上;
29、</p><p> (4)全靜態(tài)工作模式:0Hz-33Hz;</p><p> (5)三級程序存儲器鎖定;</p><p> (6)128*8位內(nèi)部RAM,32可編程I/O線;</p><p> (7)兩個16位定時器/計數(shù)器,6個中斷源;</p><p> (8)全雙工串行UART通道,低功耗的閑置和掉電模
30、式;</p><p> (9)片內(nèi)振蕩器和時鐘電路;</p><p> 圖4-5 AT89C51結構圖</p><p> 4.4數(shù)碼管顯示電路</p><p> 4.4.1 LED數(shù)碼管的組成</p><p> LED數(shù)碼管顯示器是由發(fā)光二極管顯示字段的顯示器件,也稱為數(shù)碼管。其結構如圖4-6所示。它由8個發(fā)
31、光二極管構成,通過不同的組合可用來顯示0-9、A-F及小數(shù)點“.”等字符。</p><p> 數(shù)碼管有共陰極和共陽極兩種結構規(guī)格,電阻為外接。共陰極數(shù)碼管的發(fā)光二極管陰極共地,當某發(fā)光二極管的陽極為高電平時,二極管點亮;共陽極數(shù)碼管的發(fā)光二極管是陽極,并接高電平,對于需點亮的發(fā)光二極管將其陰極接低電平即可。</p><p> 圖4-6 LED數(shù)碼管顯示圖</p><
32、p> 4.4.2數(shù)碼管顯示方式</p><p> ?。?) 靜態(tài)顯示方式</p><p> 直接利用并行口輸出。LED顯示工作于靜態(tài)顯示方式時,各位的共陰極連接在一起接地;每位的段選線分別于一個8位的鎖存輸出相連。一般稱之為靜態(tài)顯示,是由于顯示器中的各位相互獨立。而且各位的顯示字符一經(jīng)確定,相應鎖存器的輸出將維持不變,直到顯示另一個字符為止。本實驗采用串入并出的靜態(tài)顯示方式。&l
33、t;/p><p> 利用通信號串行輸出。在實際應用中,多位LED顯示時,為了簡化電路,在系統(tǒng)不需要通信功能時,經(jīng)常采用串行通信口工作方式0,外接移位寄存器74LS164來實現(xiàn)靜態(tài)顯示。</p><p> (2) 動態(tài)顯示方式</p><p> 對多位LED顯示器的動態(tài)顯示,通常都時采用動態(tài)掃描的方法進行顯示,即逐個循環(huán)點亮各位顯示器。這樣雖然在任一時刻只有一位顯示
34、器被點亮,但是由于間隔時間較短,且人眼具有視覺殘留效應,看起來與全部顯示器持續(xù)點亮一樣。為了實現(xiàn)LED顯示器的動態(tài)掃描,除了要給顯示器提供的輸入之外,還要對顯示器加位選擇控制,這就是通常所說的段控和位控。因此多位LED顯示器接口電路需要有兩個輸出口,其中一個用于輸出8位控信號;另一個用于輸出段控信號,其連接圖如圖4-7所示。</p><p> 圖4-7 數(shù)碼管顯示電路</p><p>
35、 表4-2 七段LED段選碼表</p><p><b> 5.PID控制算法</b></p><p> 在工程實際中,應用最為廣泛的調節(jié)器控制規(guī)律為比例、積分、微分控制,簡稱PID控制,又稱PID調節(jié)。PID控制器問世至今已有近70年歷史,它 以其結構簡單、穩(wěn)定性好、工作可靠、調整方便而成為工業(yè)控制的主要技術之一。當被控對象的結構和參數(shù)不能完全掌握,或得不到精確的
36、數(shù)學模型時,控制理論的 其它技術難以采用時,系統(tǒng)控制器的結構和參數(shù)必須依靠經(jīng)驗和現(xiàn)場調試來確定,這時應用PID控制技術最為方便。即當我們不完全了解一個系統(tǒng)和被控對象,或 不能通過有效的測量手段來獲得系統(tǒng)參數(shù)時,最適合用PID控制技術。PID控制,實際中也有PI和PD控制。PID控制器就是根據(jù)系統(tǒng)的誤差,利用比例、 積分、微分計算出控制量進行控制的。 </p><p> 比例控制 比例控制是一種最簡單的控
37、制方式。其控制器的輸出與輸入誤差信號成比例關系。當僅有比例控制時系統(tǒng)輸出存在穩(wěn)態(tài)誤差。 </p><p> 積分控制 在積分控制中,控制器的輸出與輸入誤差信號的積分成正比關系。對一個自動控制系統(tǒng),如果在進入穩(wěn)態(tài)后存在穩(wěn)態(tài)誤差,則稱這個控制系統(tǒng)是有穩(wěn)態(tài)誤差的 或簡稱有差系統(tǒng)。為了消除穩(wěn)態(tài)誤差,在控制器中必須引入“積分項”。積分項對誤差取決于時間的積分,隨著時間的增加,積分項會增大。這樣,即便誤差很小,積
38、分項也會隨著時間的增加而加大,它推動控制器的輸出增大使穩(wěn)態(tài)誤差進一步減小,直到等于零。因此,比例+積分控制器,可以使系統(tǒng)在進入穩(wěn)態(tài)后無穩(wěn) 態(tài)誤差。 </p><p> 微分控制 在微分控制中,控制器的輸出與輸入誤差信號的微分(即誤差的變化率)成正比關系。 自動控制系統(tǒng)在克服誤差的調節(jié)過程中可能會出現(xiàn)振蕩甚至失穩(wěn)。其原因是由于存在有較大慣性組件(環(huán)節(jié))或有滯后組件,具有抑制誤差的作用, 其變化總是落后于誤
39、差的變化。解決的辦法是使抑制誤差的作用的變化“超前”,即在誤差接近零時,抑制誤差的作用就應該是零。這就是說,在控制器中僅引入 “比例”項往往是不夠的,比例項的作用僅是放大誤差的幅值,而目前需要增加的是“微分項”,它能預測誤差變化的趨勢,這樣,具有比例+微分的控制器,就能 夠提前使抑制誤差的控制作用等于零,甚至為負值,從而避免了被控量的嚴重超調。所以對有較大慣性或滯后的被控對象,比例+微分制器能改善系統(tǒng)在 調節(jié)過程中的動態(tài)特性。</
40、p><p> 各子程序設計及流程圖</p><p> 6.1 PID控制程序流程圖</p><p> 6.2 A/D轉換程序流程圖</p><p> 6.3 顯示程序流程圖</p><p> 6.4溫度控制總程序流程圖</p><p><b> 心得體會</b>&l
41、t;/p><p> 作為一名自動化專業(yè)的大三學生,我覺得做計算機控制系統(tǒng)課程設計是很有意義的,而且也是必要的。一個星期很快就過去了,計算機控制技術課程設計也告一段落。本次課程設計,我的題目是計算機溫度控制系統(tǒng)。溫度控制是工業(yè)生產(chǎn)過程中經(jīng)常遇到的過程控制,有些工藝過程對其溫度的控制效果直接影響著產(chǎn)品的質量,因而設計一種較為理想的溫度控制系統(tǒng)是非常有價值的,也是十分有必要的。</p><p>
42、 其次,在這次課程設計中,我們運用了以前學過的專業(yè)課知識,如:Proteus繪圖仿真、C語言、模擬和數(shù)字電路知識等。雖然以前在上課的時候學的都不是很好,很多知識都學習的模棱兩可,可是如果你懷著一種目的性去學習它,你就會發(fā)現(xiàn)學習的效率非常高,以前看了都頭痛的東西在你現(xiàn)在一定要用的時候再拿出來學習,會感覺其實也很簡單的。這是我做這次課程設計的又一收獲。</p><p> 最后,要做好一個課程設計,就必須做到:在做設
43、計之前,一定要對我們的對象有充分的了解,對所要用到的東西有深刻的認識,是指系統(tǒng)化、模塊化,必須有一個清晰的思路。在設計程序時,不能妄想一次將整個程序設計好,反復修改、不斷改進是程序設計的必經(jīng)之路;要養(yǎng)成注釋程序的好習慣,這樣為資料的保留和交流提供了方便;在設計中遇到的問題要記錄,以免下次遇到同樣的問題。</p><p> 總的來說,此次課程設計的過程比較輕松,從拿到問題到徹底解決問題,這是一個令人振奮并享受的過
44、程。經(jīng)過去圖書館大量的查閱書籍,我也學到了很多在課本上沒有的知識,收獲頗豐。這段過程讓我懂得了一個道理,那就是學生要學的絕對不該僅僅是課本上的東西,有些東西只有走進圖書館,你才可能學習到。也只有這樣,我們才能成為一個見多識廣、淵博的人。</p><p><b> 參考文獻</b></p><p> [1]. 于海生等編著.微型計算機控制技術[M].北京:機械工業(yè)出
45、版社,2007.</p><p> [2].邴志剛等編著.計算機控制:基礎?技術?工具?實例[M].北京:清華大學出版社, 2005.</p><p> [3]. 鄒伯敏主編.自動控制原理(第二版) [M]. 北京:機械工業(yè)出版社,2002.</p><p> [4]. 呂震中,劉吉臻,王志明編.計算機控制技術與系統(tǒng)(第二版)[M],北京:中國電力出版社,20
46、05.</p><p> [5].張宇河主編.計算機控制系統(tǒng)[M].北京:北京理工大學出版社, 2002.</p><p> [6].馮勇編,現(xiàn)代計算機控制系統(tǒng)[M].哈爾濱:哈爾濱工業(yè)大學出版社,2003</p><p> [7].karl J.Astrom,Bjorn Wittenmark著.計算機控制系統(tǒng)理論與設計:英文版[M].北京:清華大學出版社,2
47、002.</p><p> [8].Morris Driels著.線性控制系統(tǒng)工程(英文影印版)[M].北京:清華大學出版社,2000.</p><p> [9].John J.D'azzo & Constantine H.Houpis著.線性控制系統(tǒng)分析與設計(第4版)[M].北京:清華大學出版社,2000.</p><p> [10].韓建
48、國. Foundation and application of microcontroller .北京:高等教育出版社.2004.10</p><p> 附錄1:溫度控制系統(tǒng)總電路圖</p><p> 附錄2:溫度控制系統(tǒng)程序清單</p><p><b> ?。?)主函數(shù)如下:</b></p><p> #inc
49、lude <reg51.h></p><p> #include <absacc.h></p><p> #include"KEYSCAN.H"</p><p> #include"PID.H"</p><p> void PIDBEGIN(void); // PID
50、參數(shù)初始化// </p><p> void main()</p><p><b> {</b></p><p> unsigned char key1=0,i,k;</p><p> unsigned int tmp;</p><p> unsigned char shu[3]={13
51、,13,0};</p><p> unsigned char counter=0;</p><p> PIDBEGIN();</p><p><b> while(1)</b></p><p><b> { </b></p><p> if(counter-- =
52、= 0)</p><p><b> {</b></p><p> tmp = ReadTemperature(); </p><p> counter = 20;</p><p><b> }</b></p><p> view(tmp); //溫度顯示
53、;</p><p> compare_temper(); </p><p><b> } </b></p><p><b> }</b></p><p> ?。?) PID算法溫度控制程序</p><p> #ifndef _PID_H__</p>&l
54、t;p> #define _PID_H__</p><p> #include<intrins.h> </p><p> #include<math.h> </p><p> #include<string.h> </p><p> struct PID { </p><
55、p> unsigned int SetPoint; // 設定目標 Desired Value </p><p> unsigned int Proportion; // 比例常數(shù) Proportional Const </p><p> unsigned int Integral; // 積分常數(shù) Integral Const </p><p> u
56、nsigned int Derivative; // 微分常數(shù) Derivative Const </p><p> unsigned int LastError; // Error[-1] </p><p> unsigned int PrevError; // Error[-2] </p><p> unsigned int SumError; // Su
57、ms of Errors </p><p><b> } </b></p><p> struct PID spid; // PID Control Structure </p><p> unsigned int rout; // PID Response (Output) </p><p> unsigned
58、 int rin; // PID Feedback (Input) </p><p> sbit output=P3^4; </p><p> unsigned char high_time,low_time,count=0;//占空比調節(jié)參數(shù) </p><p> unsigned char set_temper=33; </p><p&g
59、t; void PIDInit (struct PID *pp) </p><p><b> { </b></p><p> memset ( pp,0,sizeof(struct PID)); </p><p><b> } </b></p><p> unsigned int PIDC
60、alc( struct PID *pp, unsigned int NextPoint ) </p><p><b> { </b></p><p> unsigned int dError,Error; </p><p> Error = pp->SetPoint - NextPoint; // 偏差 </p>&l
61、t;p> pp->SumError += Error; // 積分 </p><p> dError = pp->LastError - pp->PrevError; // 當前微分 </p><p> pp->PrevError = pp->LastError; </p><p> pp->LastError =
62、Error; </p><p> return (pp->Proportion * Error//比例 </p><p> + pp->Integral * pp->SumError //積分項 </p><p> + pp->Derivative * dError); // 微分項 </p><p><b
63、> } </b></p><p> /*********************************************************** </p><p> 溫度比較處理子程序 </p><p> ***********************************************************/ &
64、lt;/p><p> compare_temper() </p><p><b> { </b></p><p> unsigned char i; </p><p><b> //EA=0;</b></p><p> if(set_temper>temper)
65、</p><p><b> { </b></p><p> if(set_temper-temper>1) </p><p><b> { </b></p><p> high_time=100; </p><p> low_time=0; </p>
66、;<p><b> } </b></p><p><b> else </b></p><p><b> { </b></p><p> for(i=0;i<10;i++) </p><p> { get_temper(); </p>
67、<p> rin = s; // Read Input </p><p> rout = PIDCalc ( &spid,rin ); // Perform PID Interation </p><p><b> } </b></p><p> if (high_time<=100) </p>
68、<p> high_time=(unsigned char)(rout/800); </p><p><b> else </b></p><p> high_time=100; </p><p> low_time= (100-high_time); </p><p><b> } <
69、;/b></p><p><b> } </b></p><p> else if(set_temper<=temper) </p><p><b> { </b></p><p> if(temper-set_temper>0) </p><p>
70、<b> { </b></p><p> high_time=0; </p><p> low_time=100; </p><p><b> } </b></p><p><b> else </b></p><p><b> {
71、 </b></p><p> for(i=0;i<10;i++) </p><p> { get_temper(); </p><p> rin = s; // Read Input </p><p> rout = PIDCalc ( &spid,rin ); // Perform PID Interati
72、on </p><p><b> } </b></p><p> if (high_time<100) </p><p> high_time=(unsigned char)(rout/10000); </p><p><b> else </b></p><p&g
73、t; high_time=0; </p><p> low_time= (100-high_time);</p><p><b> //EA=1; </b></p><p><b> } </b></p><p><b> } </b></p><
74、p><b> } </b></p><p> /***************************************************** </p><p> T0中斷服務子程序,用于控制電平的翻轉 ,40us*100=4ms周期 </p><p> ********************************
75、**********************/ </p><p> void serve_T0() interrupt 1 using 1 </p><p><b> { </b></p><p> if(++count<=(high_time)) </p><p> output=1; </p&g
76、t;<p> else if(count<=100) </p><p><b> { </b></p><p> output=0; </p><p><b> } </b></p><p><b> else </b></p>&l
77、t;p><b> count=0; </b></p><p> TH0=0x2f; </p><p> TL0=0xe0; </p><p><b> }</b></p><p> void PIDBEGIN() </p><p><b> { &
78、lt;/b></p><p> TMOD=0x01; </p><p> TH0=0x2f; </p><p> TL0=0x40; </p><p><b> EA=1; </b></p><p><b> ET0=1; </b></p>&l
79、t;p><b> TR0=1; </b></p><p> high_time=50; </p><p> low_time=50; </p><p> PIDInit ( &spid ); // Initialize Structure </p><p> spid.Proportion = 1
80、0; // Set PID Coefficients </p><p> spid.Integral = 8; </p><p> spid.Derivative =6; </p><p> spid.SetPoint = 100; // Set PID Setpoint </p><p><b> } </b>
81、</p><p><b> #endif</b></p><p> (3)ADC0809轉換子程序</p><p> #define uchar unsigned char</p><p> #define uint unsigned int</p><p> #define IN0
82、XBYTE[0x7ff8] /*設置ADC0809的通道0地址*/</p><p> sbit ad_busy=P3^3; /*即EOC狀態(tài)*/</p><p> uint overflow_count = 0; /*T1中斷次數(shù)初值*/ </p><p> void ad0809(ucha
83、r xdata * x) /*采樣函數(shù),結果x[]放外部數(shù)據(jù)存儲器*/</p><p> { uchar i;</p><p> uchar idata * ad_adr;</p><p> ad_adr=&IN0;</p><p> for(i=0;i<8;i++) /*處理8通道
84、*/</p><p> { *ad_adr=0; /*啟動轉換*/</p><p> i=i; /*延時等待EOC變低*/</p><p><b> i=i;</b></p><p> while(ad_busy==0); /*查詢等待轉換結束*/</p><p> x
85、[i]=*ad_adr; /*存轉換結果*/</p><p> *(*(p+j)+i)=x[i];</p><p> ad_adr++; /*下一通道*/</p><p><b> }</b></p><p><b> }</b></p><p> /*
86、 定時器1中斷服務程序;每100ms執(zhí)行一次,fosc=6MHz*/</p><p> void timer1_ISR(void) interrupt 3</p><p> { TH1 = (65536 – 50000)/256; //定時器1賦初值</p><p> TL1 = (65536 – 50000)%256; // 10
87、0ms/1us=50000次計數(shù)</p><p> overflow_count++;</p><p><b> }</b></p><p> void main(void)</p><p> { static char xdata ad[10];</p><p> char (*p)[
88、8];</p><p> TMOD = 0X10; //設置定時器1工作方式1,</p><p> TH1 = (65536 – 50000)/256; //定時器1賦初值</p><p> TL1 = (65536 – 50000)%256;</p><p> EA = 1; //開定時
89、器1中斷</p><p><b> ET1 = 1;</b></p><p> TR1 = 1; //啟動定時器1</p><p> uchar j;</p><p> for(j=0;j<144;j++){ / *采樣24h*/</p><p
90、> if ( overflow_count == 6000){ /*10分鐘到,采樣ADC0809通道的值*/</p><p> uchar i,(*p)[8];</p><p> uchar idata * ad_adr;</p><p> ad_adr=&IN0;</p><p> for(i=0;i<8;
91、i++) /*處理8通道*/</p><p> { *ad_adr=0; /*啟動轉換*/</p><p> i=i; /*延時等待EOC變低*/</p><p><b> i=i;</b></p><p> while(ad_busy==0); /*查詢等待轉換結束*/</p>
92、;<p> x[i]=*ad_adr; /*存轉換結果*/</p><p> ad_adr++;}</p><p> for(i=0;i<8;i++)</p><p> { *(*(p+j)+i)=x[i]}</p><p><b> } </b></p><p&g
93、t;<b> }</b></p><p><b> }</b></p><p> (4) 數(shù)碼管顯示程序</p><p> unsigned char code DUAN_TABLE[]={0X3F, 0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0x77,0x7C,0x
94、39,0x5E,0x79,0x71}; //段碼 </p><p> void Delay(unsigned char n) //延時0.1*n毫秒 0 </p><p><b> { </b></p><p> unsigned char i; </p><p><b> do </b>&
95、lt;/p><p><b> { </b></p><p> for(i=0;i<23;i++) </p><p><b> ;;; </b></p><p> } while(n--); </p><p><b> } </b></p
96、><p><b> main() </b></p><p><b> { </b></p><p><b> while(1) </b></p><p><b> { </b></p><p> P1=0xfe; //位碼
97、左邊第1個 </p><p> P0=DUAN_TABLE[1];Delay(20); //顯示1 </p><p> P1=0xfd; //位碼左邊第2個 </p><p> P0=DUAN_TABLE[2];Delay(20); //顯示2 </p><p> //位碼左邊第3個 </p><p>&l
98、t;b> P1=0xfb; </b></p><p> P0=DUAN_TABLE[3];Delay(20); //顯示3 </p><p> P1=0xf7; //位碼左邊第4個 </p><p> P0=DUAN_TABLE[4];Delay(20); //顯示4 </p><p><b> } &l
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 計算機溫度控制系統(tǒng)課程設計
- 計算機控制課程設計--啤酒發(fā)酵計算機溫度控制系統(tǒng)設計
- 溫度控制系統(tǒng)計算機控制課程設計
- 溫度控制系統(tǒng)設計-計算機控制技術課程設計
- 溫度控制系統(tǒng)設計——計算機控制技術課程設計
- 計算機溫度控制課程設計
- 計算機控制課程設計---電加熱爐計算機溫度控制系統(tǒng)設計
- 計算機控制技術課程設計-溫度控制系統(tǒng)設計
- 課程設計---電加熱爐計算機溫度控制系統(tǒng)
- 計算機控制課程設計(電阻爐溫度控制系統(tǒng))
- 計算機控制課程設計(溫度控制系統(tǒng)的設計與實現(xiàn))
- 計算機控制課程設計(電阻爐溫度控制系統(tǒng))
- 計算機控制課程設計溫度控制系統(tǒng)的設計與實現(xiàn)
- 計算機控制課程設計---水位控制系統(tǒng)
- 計算機控制系統(tǒng)課程設計報告
- 計算機控制課程設計--電阻爐溫度控制系統(tǒng)的設計
- 計算機控制系統(tǒng)課程設計報告
- 計算機控制課程設計溫度控制
- 計算機控制系統(tǒng)課程設計--- 最少拍控制系統(tǒng)設計
- 計算機控制系統(tǒng)、過程控制系統(tǒng)課程設計
評論
0/150
提交評論