課程設計說明書
題 目:半導體制冷片溫度控制
摘 要 溫度是工業中非常關鍵的一項物理量,在農業,現代科學研究和各種高新技術的開發和研究中也是一個非常普遍和常用的測量參數。溫度控制的原理主要是:將隨溫度變化而變化的物理參數,通過溫度傳感器轉變成電信號,傳給計算機,與給定溫度相減后得到偏差,經過控制器后輸出給控制對象達到控溫的目的。 半導體制冷片是利用半導體材料的Peltier效應,當直流電通過兩種不同半導體材料串聯成的電偶時,在電偶的兩端即可分別吸收熱量和放出熱量,可以實現制冷的目的。制冷速度與通過的電流大小成正比。 本設計針對用半導體對水箱的制冷模型設計了相應模糊PI控制器對水箱進行計算機恒溫控制。
引言
1 課程設計概述 1.1 課程設計題目 1.2 主要儀器設備 2 硬件設計 2.1 單片機部分 2.2 串行接口部分 2.3驅動電路部分 3 軟件設計 3.1 流程圖設計 3.1.1 溫度控制主程序流程圖 3.2 控制算法設計 3.2.1 控制對象模型 3.2.2 PI控制器設計 3.2.3 控制器的設計 4 系統調試 4.1 單片機程序仿真 4.2 STC12C5A08S2單片機系統電路調試 4.3 驅動電路調試 4.4 系統調試 5 總結與改進展望 6 謝辭 引言 溫度作為一項熱工參數,在工業現場和過程控制中具有至關重要的作用。半導體制冷相對于傳統制冷方式,有著體積小,重量輕,無制冷劑而不污染環境,作用速度快,使用壽命長,且易于控制。本文介紹了使用DS18B20作為溫度傳感器的PWM半導體制冷控制系統。 1 課程設計概述1.1 課程設計題目設計半導體制冷片的線性驅動電路和熱敏元件的測溫電路,再設計PI控制器來調節制冷電壓,實現溫度控制,控制范圍15~25度,控制精度±0.5度,通過鍵盤進行溫度設置,實際溫度可以實時顯示。 *附加要求:通過RS232或RS485接口與PC機通信,在PC機上進行參數顯示和設置。
1.2 主要儀器設備半導體制冷片(連水箱) 1臺 示波器 1臺 直流穩壓電源 1臺 數字萬用表 1塊 PC機 1臺
2 硬件設計整個系統以單片機STC12C5A08S2為核心部件。在08S2最小系統外圍添加了按鍵,顯示,與PC機的通信接口,以及光電耦合PC817和MOS管IRF9540構成的驅動電路。 2.1 單片機部分 本設計選擇的單片機芯片是STC12C5A08S2,其原理圖如2-1所示。該芯片的P0.0-P0.3用作鍵盤數字量輸入,加入了上拉電阻按鍵未按下時始終處于高電平狀態,讀按鍵值前先給P0口賦值為0; P1.0作為DS18B20的數據輸入端口; P2.0-P2.7作LCD1602的數據輸出端口; P4.4-P4.6作LCD1602的控制信號; P1.3作為光耦合的控制信號; P3.0和P3.1是STC12C5A08S2的串口,實現上電復位程序下載。 圖 2-1 STC12C5A08S2最小系統原理圖 
2.2 串行接口部分MAX232通過內部電壓倍增及電壓反向電路,把TTL電平與RS232電平互換,實現單片機與PC機的串口通信。 圖 2-2 MAX232及串行接口原理圖 2.3驅動電路部分JPWM為P1.3口的PWM信號輸入,作為光耦PC817的觸發導通信號,從而產生MOS管IRP9540導通的觸發信號,實現對右端負載的控制。如圖2-3所示,本電路中還加入了撥動開關可對系統進行開關控制。 圖 2-3 驅動部分原理圖 3 軟件設計3.1 流程圖設計3.1.1 溫度控制主程序流程圖溫度控制主程序流程圖設計如圖 3-1所示。 STC12C5A08S2中的主程序需要完成下幾個工作: - 調用子函數對系統初始化,其中包括對自身的定時器T0,T1,I/O口,PWM口(P1.3),串口的初始化,以及對外部器件DS18B20和LCD1602的初始化;延時2S鐘顯示歡迎屏幕,等整個系統電壓穩定后讀取開機時的溫度;
- 調用子函數讀取當前溫度值
- 調用子函數把當前讀取的溫度以及設定值通過串口送入PC機顯示;
- 調用子函數判斷PC機是否有新的數據傳送到單片機;
- 調用子函數,把設定值與當前值相比較,對輸出PWM進行控制;
- 調用子函數刷新當前頁面;
- 調用子函數進行按鍵判斷,依據按鍵值調用不同的子函數進行翻頁或者設置;
 
圖 3-1溫度控制主程序流程圖
3.2 控制算法設計3.2.1 控制對象模型制冷片的水箱模型可近似地認為成一階慣性環節,從而測量系統階躍響應可模擬出系統的數學模型,G(s)=1/(T*s+1),其中T等于階躍響應中調節時間Ts的四分之一。給電流I=0.5A時階躍響應數據記錄如下,其中t=0時,溫度約為27℃;t=100時,溫度約為24℃。取終值11KΩ的98%,Ts約為54min=3240s,則G(s)=1/(810*s+1)。 1.由此看出,制冷系統是大慣性系統,制冷需要一段時間之后溫度才開始下降; 2.至停止制冷后,溫度還會有小幅度的下降,而設定溫度越低,下降的幅度越小; 3.由于與外界的熱交換,溫度越低時,水箱的自然升溫速度越快。 
圖 3-2 對象階躍響應擬合曲線
3.2.2 PI控制器設計PI調節器的微分方程為:y(t)=Kp[e(t)+1/Ti*∫e(t)dt]。控制器有兩種算法,位置型和增量型。位置型算法時,計算每次實際值與設定值的偏差為e0,上次的偏差為e1,則控制量u=kp*e0+ki*(e0+e1)。增量型算法時,u+=e0*ki+(e1-e0)*kp。本次系統中選用的是位置型算法。 3.2.3 控制器的設計 根據制冷片的滯后特點,為了使制冷片能迅速達到設定的溫度,應該在離設定溫度較遠時給負載加上最大功率;又為了防止制冷片的大慣性的特性使系統產生嚴重的超調,需要提前在一定的范圍內進行PI控制以達到最佳效果;而最后階段,需要預先判斷系統的停止工作點,讓制冷片的溫度擴散的整個水箱,此時停止制冷。 若設定溫度大于當前溫度時,系統也將停止制冷,等溫度慢慢回升。 現設定開始進入PI控制的溫度上限為設定值T+1℃,而停止制冷的溫度,根據多次實驗建立的數據庫如下: 4 系統調試4.1 單片機程序仿真 由于PROTEUS中沒有我們選用的STC12C5A08S2型號的單片機,因此使用AT89S2的單片機代替。仿真電路如下圖所示,仿真時除初始化時當前溫度顯示為85℃以外,一切工作正常。
圖 4-1 系統控制電路仿真電路圖
4.2 STC12C5A08S2單片機系統電路調試 STC12C5A08S2最小系統包括晶振和復位電路,按鍵電路,LCD顯示,以及通信下載接口。 由于以前沒有使用過這個型號的單片機,也沒有做過串口下載器,所以先把串口接口芯片MAX232及其外部電容和單片機的晶振電路接在面包板上,通過串口與單片機連接調試下載功能,由于一開始電源和地之間沒有接電容,因此系統不是很穩定,有時可以下載,有時不可以,接入電容之后系統比較穩定了。 依據插在面包板的電路圖畫原理圖以及PCB,板子做出來之后,用萬用表測試各點的連接特性,正常。上電,電源指示燈偏暗,把10K的限流電阻換為1K的之后指示燈工作正常。 由于STC12C5A08S2單片機運算速度比89S52快,因此程序中延時子函數一律乘以12。修改管腳使其適應實際的電路板,重新編譯后下載程序。液晶沒有顯示,調節液晶顯示偏壓信號端的電壓,使其接近地,液晶顯示正常。接上DS18B20,溫度顯示正常。用按鍵進行翻頁及設置,按鍵功能正常。據此,單片機系統板及程序完全工作正常。 4.3 驅動電路調試驅動電路板做好后進行測試。用外用表測量,各點連接特性正常。分別把PWM輸入端接地和接VCC,用示波器觀察負載輸出電壓,輸出電壓對應為零和為12伏,工作正常,接入PWM信號后,輸出變為零,不正常。 用示波器觀察MOS管G極電壓,發現為鋸齒波,上升部分傾斜,下降部分豎直。分析原因為MOS管的S極與電源之間的電阻太大,使通過MOS管的電流太小,MOS管的電容特性使其在一定充電時間內電壓不能達到導通,因此輸出恒為零。把電阻調小,鋸齒波頂部逐漸變平,電阻繼續調小,輸出的最低電壓開始升高不為零。此時繼續調節電阻已沒有意義,在程序中把PWM輸出的波形頻率降低,降到最低14HZ。此時G極波形已為方波,繼續減小電阻,直到G極輸出的最低電壓恰好為零,使其能通過更高頻率的信號。最后稍微增大該電阻,使其電壓被允許在一定范圍內波動。 測量連接負載的D極,D極波形為與輸入的PWM反向的方波,驅動電路工作正常。 4.4 系統調試各個部分的調試完成以后,對整個系統進行調試,從室溫約27.5℃開始,設置水箱的溫度分別為26℃,23℃,20℃。 具體記錄的數據如下所示。 表 6-5-1
加入算法后,超調量被控制在1%以下,溫度下降速度較快,較穩定。 5 總結與改進展望本次設計中,我完成了包括資料收集,系統設計及仿真,程序編寫,電路圖與PCB板的繪制腐蝕焊接及調試的全過程,整個系統完成測試后,性能穩定,基本達到了預期的目標。 水箱溫度在29~10攝氏度范圍內可控(設置值不大于當前室溫),LCD液晶溫度顯示穩定,與之前購買的溫度計有大約恒定1℃的溫差。傳送到PC機的數據顯示正常,可以從PC機接收數據對各個參數進行設置。 溫度控制算法的設計,在原模糊分段控制的基礎上,加上了PI控制,雖然最后由于時間關系,參數中只使用了P,但是可以證明,加入了PI控制的模糊算法比單純的模糊分段控制取得了更好的效果。 在本次設計中,也存在著可以改進的地方。例如程序中有部分程序段是幾乎重復使用的,但在各種情況下,只使用了switch函數分情況討論,沒有總結出特定的函數對所有的情況進行處理,這導致了程序過長,應該還有可以壓縮的空間。還有對于參數的調整,只使用了P,沒有用到I,而且對于停止控制的位置,也還應該重新配合。這都是需要作出調整的,而且DS18B20檢測溫度只能精確到0.0625℃,若要再進一步提升各種指標的話,最好換一個精度更高的溫度檢測手段。 6 謝辭本次設計能夠完成得到了許多幫助,首先感謝趙學軍老師,李平老師以及龍超老師的悉心指導,為我們提供了設計的思路,為我們指出了設計的各種不足指出,并一次次為我們解決了調試過程中出現的各種問題。正是有了他們的指導,我的設計才得以順利完成。 感謝一同進行設計的同學們,是他們在我對著板子一籌莫展地時候給我指出了可能的錯誤,在調試過程中給予我各種意見,并且測量數據時給予我各種幫助,沒有他們的幫助,我的設計不能得以完善。 感謝一直教導我的任課老師,是任課老師的諄諄教導,使得我們可以學以致用,完成本次設計一定是基于扎實的理論課基礎的。 最后感謝在本次設計中所有幫助過我的老師同學們。
附 錄

主要電路PCB:
STC89C5A08S2最小系統驅動電路 STC12C5A08S2單片機源程序如下:
- #include<STC_NEW_8051.h>
- #include<DS18B20.h>
- #include<LCD1602.h>
- #define keys P0
- sbit PWM=P1^3;
- uchar settemp[12]={'S','e','t',':',' ','2','6','.','0',' ',0xdf,'C'};
- ucharnowtemp[12]={'N','o','w',':','0','2','6','.','5','0',0xdf,'C'};
- uchar welcome[16]="Welcome! O(^_^)O";
- uchar number[13]="0800320101 CC";
- uchar e[4]={0,0,0,0};
- uchar us[4]={0,0,0,0};
- uchar shou[4];
- uchar TL,TH,page,num=0,whi=0;
- int fub=100,ki=0,kp=50;
- uchar fus[8]="Fu: 100 ",kps[8]="Kp: 050 ",kis[8]="Ki: 000 ";
- int TN,TD,Ntemp100,Stemp100=2600,e1=0,e0=0,u=0;
- bit busy;
-
- /***************顯示設置**********************/
- void page0()//初始化歡迎頁
- {
- int i;
- _1602_init();
- _1602_writecode(0x00+0x80);//設置顯示地址
- for(i=0;i<16;i++) //顯示歡迎
- _1602_writedata(welcome[i]);
- _1602_writecode(0x40+0x80);//設置顯示地址
- for(i=0;i<13;i++) //顯示學號姓名
- _1602_writedata(number[i]);
- for(i=0;i<40;i++)
- delay(5000);
- }
-
- void page1() //溫度顯示頁
- {
- int i;
- _1602_writecode(0x00+0x80);//設置顯示地址
- for(i=0;i<12;i++) //顯示設定溫度
- _1602_writedata(settemp[i]);
- _1602_writecode(0x40+0x80);//設置顯示地址
- for(i=0;i<12;i++) //顯示現在溫度
- if(Stemp100>2300) stop=Stemp100*3/500; //關斷值的模糊控制
- else if(1900<Stemp100<=2300) stop=7;
- else stop=0;
- e1=e0;
- e0=Ntemp100-Stemp100;
- e[3]=e0%10;
- e[2]=(e0/10)%10;
- e[1]=(e0/100)%10;
- e[0]=(e0/1000);
- _1602_writecode(0x0c+0x80);//設置顯示地址
- for(i=0;i<4;i++) //顯示誤差
- _1602_writedata(e[i]+0x30);
- if(stop<e0<fub)//PI運算
- {
- u=e0*kp/10;
- u+=(e1+e0)*ki/10;
- if(u>255) u=255;
- if(u<0) u=0;
- }
- if(e0>=fub) u=0xff; //全開
- if(e0<=stop) u=0x00;//關斷
- us[3]=u%10;
- us[2]=(u/10)%10;
- us[1]=(u/100)%10;
- us[0]=(u/1000);
- _1602_writecode(0x4c+0x80);//設置顯示地址
- for(i=0;i<4;i++) //顯示控制量
- _1602_writedata(us[i]+0x30);
- CCAP0H=u;
- }
- /***********數據處理,控制********************/
- //改變占空比:CCAP0H=0xff-0xff*占空比/100=0xff-51/20*占空比 ;0x00,輸出100%,停止制冷;
- /************按鍵判斷處理********************/
- uchar keyin(void) //單按鍵值判斷,1--setting,2--up,4--down,8--enter
- {
- uchar key,come=0;
- keys=0x00;
- delay(2);
- key=keys&0x0f;
- if(key!=0) //防抖
- s=settemp[6]-0x30;
- x=seting2(0x06,s);
- settemp[6]=x+0x30;
- Stemp100+=x*100;
-
- s=settemp[8]-0x30;
- x=seting2(0x08,s);
- settemp[8]=x+0x30;
- Stemp100+=x*10;
- }
- void setingc(uchar n) //按鍵的參數設置
- {
- uchar s,i;
- switch(n)
- {
- case 0:{ fub=0; //模糊量
- for(i=4;i<7;i++)
- {
- s=fus[i]-0x30;
- s=seting2(i,s);
- fub=fub*10+s;
- fus[i]=s+0x30;
- }
- break;
- }
- case 1:{ kp=0;
- for(i=4;i<7;i++)
- {
- s=kps[i]-0x30;
- s=seting2(i+0x40,s);
- kp=kp*10+s;
- kps[i]=s+0x30;
- }
- break;
- }
- case 2:{ ki=0;
- for(i=4;i<7;i++)
- {
- s=kis[i]-0x30;
- s=seting2(i+0x48,s);
- ki=ki*10+s;
- kis[i]=s+0x30;
- }
- break;
- {
- kps[i+3]=shou[i];
- s=shou[i]-0x30;
- kp=kp*10+s;
- }
- shou[0]=0;
- break;
- }
- case 'I': { //變量ki
- ki=0;
- for(i=1;i<4;i++)
- {
- kis[i+3]=shou[i];
- s=shou[i]-0x30;
- ki=ki*10+s;
- }
- shou[0]=0;
- break;
- }
- }
- }
- /***********按鍵判斷處理**********************/
- /*************PWM初始化********************/
- void PWM_init() //PWM初始化
- {
- TMOD=0x22;//T0工作在方式2,8位重裝
- TH0=0x00;
- TR0=1; //開始計數
- CCON=0x00;//關PCA
- CH=0; CL=0; //計數寄存器清零
- CMOD=0x04;//始終工作;f=定時器0溢出頻率;PWM模式禁止中斷
- CCAPM0=0X42; //PCA0工作在PWM模式
- PCA_PWM0=0x00; //若此為為0x02,則輸出恒為0;若要調整占空比,需賦值為0;
- CCAP0H=0x00;//輸出占空比100%
- CR=1; //開始計數
- }
-
- /**************PWM初始化*******************/
- /*************串口初始化********************/
- void Uart_init(void)
- {
- IE=0x90;
- void main()
- {
- uchar key,i;
- P4SW=0x70;//P4為IO口
- page=1; //默認頁為第一頁
- PWM_init();
- _1602_init();
- Uart_init(); //串口初始化
- page0(); //顯示初始化歡迎頁
- _1602_writecode(0x01);//清屏
- delay(50);//清屏后若無延時則第一個字符顯示不出
- sent_pc(welcome,16);
- sent_pc_byte('\r'); //13,10合起來為回車
- sent_pc_byte('\n');
- sent_pc(settemp,10);
- sent_pc(nowtemp,10);
- while(1)
- {
- k1: gets(); //讀取當前溫度
- sent_pc_byte('\r'); //13,10合起來為回車
- sent_pc_byte('\n');
- sent_pc(settemp,10); //給PC機送設定溫度以及當前溫度
- sent_pc(nowtemp,10);
- control(); //進行控制
- if(page==1)
- {
- page1(); //顯示當前溫度頁
- key=keyin();//判斷鍵值
- switch(key)
- {
- case 1: {CCAP0H=0x00;setingt(); goto k1;} //進行設置
- case 2:
- case 4: { _1602_writecode(0x01);
- delay(50);//清屏
- page=2; } //上下翻頁
- }
- }
- if(page==2)
- {
- page2(); //顯示參數設定頁
- key=keyin();//判斷鍵值
- switch(key)
- _1602_writedata(nowtemp[i]);
- }
- void page2()//參數顯示頁
- {
- int i;
- _1602_writecode(0x00+0x80);//設置顯示地址
- for(i=0;i<8;i++) //顯示Fuzzy
- _1602_writedata(fus[i]);
- _1602_writecode(0x40+0x80);//設置顯示地址
- for(i=0;i<8;i++) //顯示kp
- _1602_writedata(kps[i]);
- for(i=0;i<8;i++) //顯示ki
- _1602_writedata(kis[i]);
- _1602_writecode(0x0c+0x80);//設置顯示地址
- _1602_writedata(whi+0x30);
- _1602_writedata(' ');
- _1602_writedata(' ');
- _1602_writedata(' ');
- }
- /**************顯示設置*********************/
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
完整的Word格式文檔51黑下載地址:
半導體制冷片溫度控制.doc
(228.5 KB, 下載次數: 98)
2018-4-17 15:56 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|