北京交通大學(xué)計(jì)算機(jī)控制課程設(shè)計(jì)方案報(bào)告說(shuō)明書_第1頁(yè)
北京交通大學(xué)計(jì)算機(jī)控制課程設(shè)計(jì)方案報(bào)告說(shuō)明書_第2頁(yè)
北京交通大學(xué)計(jì)算機(jī)控制課程設(shè)計(jì)方案報(bào)告說(shuō)明書_第3頁(yè)
北京交通大學(xué)計(jì)算機(jī)控制課程設(shè)計(jì)方案報(bào)告說(shuō)明書_第4頁(yè)
北京交通大學(xué)計(jì)算機(jī)控制課程設(shè)計(jì)方案報(bào)告說(shuō)明書_第5頁(yè)
已閱讀5頁(yè),還剩38頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

上圖為溫度的輸出結(jié)果,中圖為控制量,下圖為積分項(xiàng)。可看出與simulink仿真基本一致,為看出抗飽和積分的效果所以將積分項(xiàng)加大kp=32;ki=5;kd=0.0未加入抗飽和積分kp=32;ki=5;kd=0.0加入抗飽和積分后可看出加入抗飽和積分后超調(diào)量明顯下降,抗飽和積分可以使系統(tǒng)穩(wěn)定性得到改善。。m源程序:%PIDControlerwithintergrationsturationclearall;closeall;ts=1;sys=tf(41.7,[58430。5,10],'inputdelay’,20);dsys=c2d(sys,ts,’z');[num,den]=tfdata(dsys,'v');u_1=0.0;u_2=0。0;u_3=0.0;y_1=0;y_2=0;y_3=0;x=[0,0,0]';error_1=0;um=1000;kp=32;ki=5;kd=0.0;rin=30;%StepSignalfork=1:1:600time(k)=k*ts;u(k)=kp*x(1)+kd*x(2)+ki*x(3);%PIDControllerifu(k)〉=umu(k)=um;endifu(k)<=—umu(k)=—um;end%Linearmodel%yout(k)=-den(2)*y_1—den(3)*y_2-den(4)*y_3+num(2)*u_1+num(3)*u_2+num(4)*u_3;yout(k)=-den(2)*y_1+num(2)*u_1;error(k)=rin-yout(k);M=1;ifM==1%Usingintergrationsturationifu(k)>=umiferror(k)>0alpha=0;elsealpha=1;endelseifu(k)<=—umiferror(k)>0alpha=1;elsealpha=0;endelsealpha=1;endelseifM==2%Notusingintergrationsturationalpha=1;end%ReturnofPIDparametersu_3=u_2;u_2=u_1;u_1=u(k);y_3=y_2;y_2=y_1;y_1=y(tǒng)out(k);error_1=error(k);x(1)=error(k);%CalculatingPx(2)=(error(k)-error_1)/ts;%CalculatingDx(3)=x(3)+alpha*error(k)*ts;%CalculatingIxi(k)=x(3);endfigure(1);subplot(311);plot(time,rin,’b’,time,yout,'r');xlabel('time(s)’);ylabel('Tempereturetracking’);subplot(312);plot(time,u,'r');xlabel('time(s)’);ylabel('Controlleroutput');subplot(313);plot(time,xi,'r');xlabel('time(s)');ylabel('Integration’);七、PROTEUS仿真部分系統(tǒng)整體仿真圖如圖13所示圖13水溫控制系統(tǒng)整體proteus仿真圖圖14系統(tǒng)開(kāi)啟電源仿真圖八、結(jié)論及心得體會(huì)1、實(shí)驗(yàn)結(jié)論由以上的實(shí)驗(yàn)數(shù)據(jù)和實(shí)驗(yàn)對(duì)比分析可以得到PID各個(gè)環(huán)節(jié)的作用:比例系數(shù)KP決定控制作用的強(qiáng)弱,KP加大時(shí)可減少系統(tǒng)的穩(wěn)態(tài)誤差,提高系統(tǒng)的動(dòng)態(tài)響應(yīng)速度,但積分項(xiàng)Ki微分Kd在實(shí)驗(yàn)過(guò)程中,用的是試湊法進(jìn)行PID參數(shù)整定。通過(guò)實(shí)驗(yàn)大概體驗(yàn)出試湊法進(jìn)行PID參數(shù)整定的步驟,如下:(1)首先只整定比例部分。比例系數(shù)KP(2)若穩(wěn)態(tài)誤差不能滿足設(shè)計(jì)要求,則需加入積分控制。整定時(shí)先置積分時(shí)間Ti為一較大值,并將經(jīng)第1步整定得到的KP減小些,然后減小Ti,并使系統(tǒng)在保持良好動(dòng)態(tài)響應(yīng)的情況下,消除穩(wěn)態(tài)誤差。這種調(diào)整可根據(jù)響應(yīng)曲線的狀態(tài),反復(fù)改變K(3)若使用PI調(diào)節(jié)器消除了穩(wěn)態(tài)誤差,但動(dòng)態(tài)過(guò)程仍不能滿意,則可加入微分環(huán)節(jié)。在第2步整定的基礎(chǔ)上,逐步增大TD,同時(shí)相應(yīng)地改變KP和2、心得體會(huì)本次歷時(shí)近兩周的計(jì)算機(jī)控制課程設(shè)計(jì)即將畫上圓滿的句號(hào)。從最開(kāi)始的選題,本來(lái)想選擇的是小型無(wú)人直升機(jī)飛行高度的控制系統(tǒng)設(shè)計(jì),查閱了大量資料,但是最終因?yàn)閷?duì)直升機(jī)模型的不熟悉,很難進(jìn)行系統(tǒng)建模分析及仿真,無(wú)奈放棄。最終我選擇的是與我們生活非常接近的水溫自動(dòng)控制系統(tǒng)。從確定課題到查閱大量相關(guān)資料,第一次發(fā)現(xiàn)自己的所學(xué)能有所用,能夠在生活實(shí)際中解決問(wèn)題,讓我興奮不已。硬件的設(shè)計(jì)問(wèn)題并不多,因?yàn)樯蠈W(xué)期學(xué)過(guò)單片機(jī)課程,所以整個(gè)過(guò)程比較順利.其次是軟件系統(tǒng)的搭建,在編寫程序時(shí),一些子模塊都是在網(wǎng)上找的現(xiàn)成的,為此省去了不少時(shí)間和精力。MATLAB的仿真時(shí)比較得心應(yīng)手的,因?yàn)橹暗脑S多課程都是用的MATLAB或者MULTISIM進(jìn)行仿真實(shí)驗(yàn)的,自動(dòng)化專業(yè)實(shí)驗(yàn)也進(jìn)行過(guò)PID的參數(shù)整定,所以也比較順利.PROTEUS是我新掌握的一個(gè)軟件,對(duì)它的學(xué)習(xí)花去近兩天的學(xué)習(xí)時(shí)間,然后我利用PROTEUS進(jìn)行了電路的搭接仿真,可能是沒(méi)有實(shí)物的操作,仿真結(jié)果不是十分正確,只進(jìn)行了簡(jiǎn)單搭接和電源開(kāi)啟檢查了一下能否正常工作。最后由于時(shí)間有限,不能進(jìn)行硬件的焊接調(diào)試,做出實(shí)物,將理論帶入實(shí)踐中去,是比較遺憾的??偟膩?lái)說(shuō)通過(guò)這次課程設(shè)計(jì)我收獲到了很多東西,軟件、硬件、甚至是對(duì)電子課程設(shè)計(jì)信心倍增,雖然期間遇到各種問(wèn)題,但是最后經(jīng)過(guò)自己的努力都能夠解決,不僅提高了自己的技能,也看到了自己的不足,這次課程設(shè)計(jì)定讓我進(jìn)入了電子設(shè)計(jì)的新階段。最后,感謝老師和同學(xué)在此次計(jì)算機(jī)課程設(shè)計(jì)中給我的幫助.八、參考文獻(xiàn)《過(guò)程控制系統(tǒng)》,黃德先、王京春、金以慧編著,清華大學(xué)出版社。《計(jì)算機(jī)控制系統(tǒng)》,高金源、夏潔編著,清華大學(xué)出版社?!稒z測(cè)原理》,施文康、余曉芬主編,機(jī)械工業(yè)出版社.《單片機(jī)原理與應(yīng)用》,戴勝華、蔣大明主編,北京交通大學(xué)出版社?!稊?shù)字電子技術(shù)基礎(chǔ)》,侯建軍主編,高等教育出版社?!蹲詣?dòng)控制原理》,蔣大明、戴勝華主編,北京交通大學(xué)出版社。附件一:恒溫箱控制系統(tǒng)源程序#include<reg52.h>#include<intrins.h〉//空操作_nop_頭文件#defineucharunsignedchar#defineuintunsignedint#defineBUSY0x80//lcd忙檢測(cè)標(biāo)志#defineDATAPORTP0//定義P0口為L(zhǎng)CD通訊端口sbitBUZZER=P3^4;sbitP1_0=P1^0;????//時(shí)鐘調(diào)整P0口sbitP1_1=P1^1;????//時(shí)鐘加P1口sbitP1_2=P1^2;? ?//時(shí)鐘減P2口sbitled1=P3^2;sbitled2=P3^3;sbitDQ=P3^6;????//定義ds18b20通信端口sbitLCM_RS=P2^0; ?? ????//數(shù)據(jù)/命令端sbitLCM_RW=P2^1;???? ??//讀/寫選擇端sbitLCM_EN=P2^2;??? //LCD使能信號(hào)?? ????? ? ?sbitOUT=P3^7;?? ?? ??//光耦、繼電器驅(qū)動(dòng)信號(hào)?ucharseconde=0;? ??//定義并初始化時(shí)鐘變量ucharminite=0;ucharhour=12;ucharmstcnt=0;//時(shí)間計(jì)時(shí)中斷變量ucharidatavalue[2];?//存儲(chǔ)鍵盤輸入值ucharbuff,times,j;? ?????//用來(lái)處理按鍵值的全局變量uchartemp1,temp2,temp;?//溫度顯示變量temp1為整數(shù)部分,temp2為小數(shù)部分,temp為實(shí)際溫度ucharset;//定義全局變量set為工作模式選擇float(yī)K;//設(shè)定的溫度bitON_OFF=0;//加熱鍵控制總開(kāi)關(guān)bitoutflag;? ? ????//溫控標(biāo)志,為1時(shí)表示加熱,LCD上用|表示;為0時(shí)表示不加熱,LCD上用^表示unsignedintTIM; ??????//PID計(jì)時(shí)中斷變量bitstart_flag=0;???? ??//開(kāi)始PID運(yùn)算標(biāo)志位bitstart_key=0;?? ???//設(shè)置軟件輸入設(shè)定初值標(biāo)志位floatdiv,kp=1。5,kd=1;?? //用于PID計(jì)算的變量floatki=0.01;floatuk,uk0;uintTime_on;???????//控制加熱片加熱時(shí)間ucharcodestr0[]={"---::”};? ?//顯示字符串ucharcodestr1[]={"SET:CTP:。C"};ucharcodedigit[]={"0123456789"}?;??//顯示鍵值voiddelay_LCM(uint);//LCD延時(shí)子程序voidinitLCM(void);? ?? //LCD初始化子程序voidlcd_wait(void); ? ??//LCD檢測(cè)忙子程序voidWriteCommandLCM(ucharWCLCM,ucharBusyC);//寫指令到LCD子函數(shù)voidWriteDataLCM(ucharWDLCM);//寫數(shù)據(jù)到LCD子函數(shù)voidDisplayOneChar(ucharX,ucharY,ucharDData);//顯示指定坐標(biāo)的一個(gè)字符子函數(shù)voidDisplayListChar(ucharX,ucharY,ucharcode*DData);//顯示指定坐標(biāo)的一串字符子函數(shù)voidinit_timer0(void);??????? //定時(shí)器初始化voiddisplayfun1(void);//顯示模式子函數(shù)voiddisplayfun2(void);voiddisplayfun3(void);voidkeyscan(void);?? ??? ???//鍵盤掃描子程序voidkeydown(void);?? ??//判斷按鍵按下子程序voidset_adj(void); ????????? //設(shè)定工作模式子程序voidinc_key(void); ????? ? ?//時(shí)鐘加子程序voiddec_key(void);? ???????//時(shí)鐘減子程序voiddelay_18B20(unsignedinti);//18B20延時(shí)子程序voidInit_DS18B20(void);//18B20初始化子程序ucharReadOneChar(void);//向18B20度數(shù)據(jù)子函數(shù)voidWriteOneChar(unsignedchardat);//往18b20寫一個(gè)數(shù)據(jù)子函數(shù)voidReadTemperature(void);//從18B20讀溫度子函數(shù)voidPID(void); ? ? ???//PID計(jì)算子程序/*********延時(shí)K*1ms,12.000mhz**********/voiddelay_LCM(unsignedintk){unsignedinti,j;for(i=0;i<k;i++){for(j=0;j<60;j++)?{;}}}/**************4*4鍵盤掃描子函數(shù)******************/voidkeyscan(void){?ucharhang,lie,key;//局部變量?P1=0xf0;?if(P1!=0xf0)//檢測(cè)是否有按鍵 { delay_LCM(20);??if(P1!=0xf0)//消抖? {?? {hang=0xfe;//逐行掃描times++;if(times==3)times=1;while((hang&0x10)!=0)//掃描完4行后跳出{P1=hang;if((P1&0xf0)!=0xf0)//本行有鍵按下{lie=(P1&0xf0)|0x0f;buff=((~hang)+(~lie));switch(buff){case0x81:key=0;break;case0x11:key=1;break;case0x12:key=2;break;case0x14:key=3;break;case0x21:key=4;break;case0x22:key=5;break;case0x24:key=6;break;case0x41:key=7;break;case0x42:key=8;break;case0x44:key=9;break;case0x18:set_adj();break; ??case0x28:inc_key();break;case0x48:dec_key();break;case0x88:break;case0x82:ON_OFF=!ON_OFF;break;case0x84:break;}value[times-1]=key;//按下的鍵值}elsehang=(hang〈<1)|0x01;//下一行掃描}}}}}/****************判鍵是否按下子函數(shù)*****************/voidkeydown(){P1=0xf0;if((P1&0xf0)!=0xf0){keyscan();}}/**********寫指令到LCD子函數(shù)************/voidWriteCommandLCM(unsignedcharWCLCM,unsignedcharBusyC){if(BusyC)lcd_wait();//BusyC=1,則檢測(cè)忙信號(hào)。BusyC=0則不檢測(cè)忙信號(hào)?DATAPORT=WCLCM;//寫數(shù)據(jù)LCM_RS=0;//選中數(shù)據(jù)寄存器LCM_RW=0;?//寫模式LCM_EN=1; _nop_();?_nop_();?_nop_();LCM_EN=0;}/**********寫數(shù)據(jù)到LCD子函數(shù)************/voidWriteDataLCM(ucharWDLCM){lcd_wait();//檢測(cè)忙信號(hào)?DATAPORT=WDLCM;LCM_RS=1;//選中數(shù)據(jù)寄存器LCM_RW=0;?//寫模式LCM_EN=1;_nop_(); _nop_();?_nop_();LCM_EN=0;}/***********LCD內(nèi)部等待函數(shù)*************/voidlcd_wait(void){DATAPORT=0xff; ?LCM_EN=1;LCM_RS=0;???LCM_RW=1; ?//讀狀態(tài)_nop_();while(DATAPORT&BUSY)?{LCM_EN=0;?_nop_();?_nop_();?LCM_EN=1;?_nop_(); _nop_();?} LCM_EN=0;?}/**********LCD初始化子函數(shù)***********/voidinitLCM(){?DATAPORT=0;??delay_LCM(15);?WriteCommandLCM(0x38,0);//三次顯示模式設(shè)置,確保命令寫入,不檢測(cè)忙信號(hào)delay_LCM(5);WriteCommandLCM(0x38,0);delay_LCM(5);WriteCommandLCM(0x38,0);delay_LCM(5);WriteCommandLCM(0x38,1);//8bit數(shù)據(jù)傳送,2行顯示,5*7字型,檢測(cè)忙信號(hào)WriteCommandLCM(0x08,1);//關(guān)閉顯示,檢測(cè)忙信號(hào)WriteCommandLCM(0x01,1);//清屏,檢測(cè)忙信號(hào)WriteCommandLCM(0x06,1);//顯示光標(biāo)右移設(shè)置,檢測(cè)忙信號(hào)WriteCommandLCM(0x0c,1);//顯示屏打開(kāi),光標(biāo)不顯示,不閃爍,檢測(cè)忙信號(hào)}/****************顯示指定坐標(biāo)的一個(gè)字符子函數(shù)*************/voidDisplayOneChar(ucharX,ucharY,ucharDData)//x表示行坐標(biāo),表示列坐標(biāo)DData表示顯示數(shù)據(jù){Y&=1;X&=15;if(Y)X|=0x40;//若y為1(顯示第二行),地址碼+0X40X|=0x80;//指令碼為地址碼+0X80WriteCommandLCM(X,0);//寫指令,不顯示忙信號(hào)WriteDataLCM(DData);//寫數(shù)據(jù)}/***********顯示指定坐標(biāo)的一串字符子函數(shù)***********/voidDisplayListChar(ucharX,ucharY,ucharcode*DData){ucharListLength=0;Y&=0x01;X&=0x0f;while(X〈16)???? ?//16位字符全部顯示{DisplayOneChar(X,Y,DDat(yī)a[ListLength]);ListLength++;X++;}}/***********ds18b20延遲子函數(shù)(晶振12MHz)*******/voiddelay_18B20(unsignedinti){?while(i--);}/**********ds18b20初始化函數(shù)**********************/voidInit_DS18B20(void){ unsignedcharx=0; DQ=1;//DQ復(fù)位?delay_18B20(8);//稍做延時(shí)?DQ=0;//單片機(jī)將DQ拉低?delay_18B20(80);//精確延時(shí)大于480us?DQ=1;//拉高總線 delay_18B20(14);?x=DQ;//稍做延時(shí)后如果x=0則初始化成功x=1則初始化失敗?delay_18B20(20);}/***********ds18b20讀一個(gè)字節(jié)**************/unsignedcharReadOneChar(void){?uchari=0;?uchardat(yī)=0;?for(i=8;i〉0;i-—)?{? DQ=0;//給脈沖信號(hào)??dat〉〉=1;??DQ=1;//給脈沖信號(hào)??if(DQ) dat|=0x80;//如果DQ=1,則寫1??delay_18B20(4);?}?return(dat(yī));}/*************ds18b20寫一個(gè)字節(jié)****************/voidWriteOneChar(uchardat){?unsignedchari=0;?for(i=8;i〉0;i--)?{??DQ=0;? DQ=dat&0x01;?delay_18B20(5);? DQ=1; dat>>=1;?? ?? ?//右移}}/**************讀取ds18b20當(dāng)前溫度************/voidReadTemperature(void){?unsignedchara=0;?unsignedcharb=0;?unsignedchart=0; Init_DS18B20();//18B20初始化?WriteOneChar(0xCC); //跳過(guò)讀序號(hào)列號(hào)的操作?WriteOneChar(0x44);?//啟動(dòng)溫度轉(zhuǎn)換 delay_18B20(100);//轉(zhuǎn)換需要一點(diǎn)時(shí)間,延時(shí)?Init_DS18B20(); WriteOneChar(0xCC);?//跳過(guò)讀序號(hào)列號(hào)的操作?WriteOneChar(0xBE);?//讀取溫度寄存器前兩個(gè)就是溫度地位和高位 delay_18B20(100);?a=ReadOneChar(); //讀取溫度值低位?b=ReadOneChar(); //讀取溫度值高位 temp1=b<〈4;?temp1+=(a&0xf0)>>4;//temp1為溫度數(shù)據(jù)高6位,即溫度的整數(shù)部分?temp2=a&0x0f;//temp2為溫度數(shù)據(jù)地4位,即溫度的小數(shù)部分(測(cè)得數(shù)據(jù)乘以0.0625即為實(shí)際溫度)temp=((b*256+a)>〉4);//當(dāng)前采集溫度值除16得實(shí)際溫度值}/***************液晶顯示子函數(shù)1正常顯示*****************/voiddisplayfun1(void){? WriteCommandLCM(0x0c,1);? ???//顯示屏打開(kāi),光標(biāo)不顯示,不閃爍,檢測(cè)忙信號(hào)??DisplayListChar(0,0,str0); ?DisplayListChar(0,1,str1); ??? ??? ? ?DisplayOneChar(3,0,hour/10+0x30); //液晶上顯示小時(shí)?DisplayOneChar(4,0,hour%10+0x30);?DisplayOneChar(6,0,minite/10+0x30);? ?//液晶上顯示分?DisplayOneChar(7,0,minite%10+0x30);??DisplayOneChar(9,0,seconde/10+0x30);?//液晶上顯示秒?DisplayOneChar(10,0,seconde%10+0x30);?DisplayOneChar(4,1,digit[value[0]]); DisplayOneChar(5,1,digit[value[1]]);//液晶上顯示預(yù)設(shè)的溫度?DisplayOneChar(11,1,temp1/10+0x30);//液晶上顯示測(cè)得的溫度?DisplayOneChar(12,1,temp1%10+0x30);?DisplayOneChar(14,1,temp2/10+0x30);? ?//temp2不顯示不知道為什么?if(ON_OFF==0)? ? ?//若溫控標(biāo)志為0?{??? ? DisplayOneChar(15,0,’N'); //液晶上顯示不控溫的標(biāo)志N }?elseif(ON_OFF==1)?{?? ???DisplayOneChar(15,0,'Y’);????//液晶上顯示控溫的標(biāo)志?Y if(outflag==1)??DisplayOneChar(0,0,'|’);? ?//控溫,|表示加熱?elseif(outflag==0) ??DisplayOneChar(0,0,’^'); ??//控溫,^表示不加熱? ??}?????? ??? ??}????? ? ?? ??/************液晶顯示子函數(shù)2***************/voiddisplayfun2(void){?WriteCommandLCM(0x0c,1);//顯示屏打開(kāi),光標(biāo)不顯示,不閃爍,檢測(cè)忙信號(hào) ?DisplayListChar(0,0,str0);??DisplayListChar(0,1,str1);????DisplayOneChar(6,0,minite/10+0x30);?DisplayOneChar(7,0,minite%10+0x30);??DisplayOneChar(9,0,seconde/10+0x30);?DisplayOneChar(10,0,seconde%10+0x30);????DisplayOneChar(11,1,temp1/10+0x30);?DisplayOneChar(12,1,temp1%10+0x30);?DisplayOneChar(14,1,temp2/10+0x30);?WriteCommandLCM(0x0f,1); ????//顯示屏打開(kāi),光標(biāo)顯示,閃爍,檢測(cè)忙信號(hào)?DisplayOneChar(3,0,hour/10+0x30);?DisplayOneChar(4,0,hour%10+0x30);}/**************液晶顯示子函數(shù)3*****************/voiddisplayfun3(void){ WriteCommandLCM(0x0c,1); ? ?//顯示屏打開(kāi),光標(biāo)不顯示,不閃爍,檢測(cè)忙信號(hào)??DisplayListChar(0,0,str0);??DisplayListChar(0,1,str1);? ?DisplayOneChar(3,0,hour/10+0x30); DisplayOneChar(4,0,hour%10+0x30);?DisplayOneChar(9,0,seconde/10+0x30); DisplayOneChar(10,0,seconde%10+0x30);?DisplayOneChar(11,1,temp1/10+0x30);?DisplayOneChar(12,1,temp1%10+0x30);?DisplayOneChar(14,1,temp2/10+0x30);?WriteCommandLCM(0x0f,1); //顯示屏打開(kāi),光標(biāo)顯示,閃爍,檢測(cè)忙信號(hào)?DisplayOneChar(6,0,minite/10+0x30);?DisplayOneChar(7,0,minite%10+0x30);}/**************設(shè)定工作模式子函數(shù)****************/voidset_adj(void){?delay_LCM(50);?set++;if(set>=3)set=0;//3種工作模式:正常、調(diào)時(shí)、調(diào)分??}/****************按鍵加法子函數(shù)******************/voidinc_key(void){?delay_LCM(50);???switch(set)?{??case0:if(P1==0x18)ON_OFF=?。螻_OFF;break;?//加熱控制總開(kāi)關(guān)??case1:hour++;if(hour>=23)hour=23;break;??case2:minite++;if(minite〉=59)minite=59;break;??default:break;?} ?}/****************按鍵減法子函數(shù)*****************/voiddec_key(void){?delay_LCM(50);? switch(set)?{??case0:if(P1==0x18)ON_OFF=!ON_OFF;break;??case1:hour--;if(hour<=0)hour=0;break; ?case2:minite--;if(minite<=0)minite=0;break;? default:break; } ?}/***************定時(shí)器t0初始化*******************/voidinit_timer0(void){?TMOD=0x01;//time0為定時(shí)器,方式1TH0=0x3c;//預(yù)置計(jì)數(shù)初值?? 50ms中斷一次TL0=0xb0;EA=1;????? ??ET0=1;???? ??????TR0=1;??}/***********定時(shí)器t0中斷子函數(shù)**************/voidtimer0(void)interrupt1using0//定時(shí)器0方式1,50ms中斷一次{?TIM+=1;?? ?????//PID計(jì)時(shí)中斷TH0=0x3c;TL0=0xb0;mstcnt++;if(mstcnt>=20){seconde++;mstcnt=0;}?if(seconde〉=60){minite++;seconde=0;}?if(minite>=60){hour++;minite=0;}?if(hour>=24){hour=0;} }/**************************PID計(jì)算子函數(shù)*******************************/voidPID(void){floatek,ek1,ek2,ek_sum;uinta;? ????????ek=K-temp;??? ??????//計(jì)算誤差while(1){ ?????????? //溫控開(kāi)關(guān)開(kāi)if(ON_OFF==1){ ? ? ????????if(ek>=15){outflag=1;OUT=0;Time_on=100;break;}//溫差大于15度,不用PID調(diào)節(jié)? ? ? ????? elseif(ek〈0){ek=0;outflag=0;OUT=1;Time_on=0;break;}//溫差小于等于0不調(diào)節(jié)else{if(ek〉5) a=0;? if(ek<5)??a=1;ek2=ek1;?ek1=ek; ek_sum+=ek; uk=kp*ek+ki*ek_sum+kd*(ek1-ek2); ? ?//計(jì)算PID輸出uk?if(start_flag==0)?? ?? ? //PID運(yùn)算標(biāo)志位{uk0=uk;? ?? ???//uk初值,用于參考以后uk加熱時(shí)間start_flag=1;div=100/uk0;}?? ? ?? ? ? ?//開(kāi)始PID計(jì)算elseif(start_flag==1){??? ?????? ? ?//加熱片加熱時(shí)間Time_on=uk*div

溫馨提示

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