單片機PID控制_第1頁
單片機PID控制_第2頁
單片機PID控制_第3頁
單片機PID控制_第4頁
免費預(yù)覽已結(jié)束,剩余1頁可下載查看

下載本文檔

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

文檔簡介

1、經(jīng)典 PID 調(diào)節(jié),恒溫控制。2009-08-11 20:37#include #include #include#include struct PID unsigned int SetPoint; / 設(shè)定目標(biāo) Desired Value unsigned int Proportion; / 比例常數(shù) Proportional Const unsigned int Integral; / 積分常數(shù) Integral Const unsigned int Derivative; / 微分常數(shù) Derivative Const unsigned int LastError; / Error-1

2、unsigned int PrevError; / Error-2 unsigned int SumError; / Sums of Errors ;struct PID spid; / PID Control Structure unsigned int rout; / PID Response (Output) unsigned int rin; / PID Feedback (Input)sbit data 仁 P1A0;sbit clk=P1Ai; sbit plus=P2A0;sbit subs=P2A1; sbit stop=P2A2; sbit output=P3A4; sbit

3、 DQ=P3A3; unsigned char flag,flag_1=0; unsigned char high_time,low_time,count=0;/ 占空比調(diào)節(jié)參數(shù) unsigned char set_temper=35;unsigned char temper; unsigned char i; unsigned char j=0; unsigned int s;/*延時子程序,延時時間以12M晶振為準(zhǔn),延時時間為30usX time*/void delay(unsigned char time)unsigned char m,n; for(n=0;ntime;n+) for(

4、m=0;m2;m+)/*寫一位數(shù)據(jù)子程序*/void write_bit(unsigned char bitval)EA=0;DQ=0; /* 拉低 DQ 以開始一個寫時序 */ if(bitval=1)_nop_();DQ=1; /* 如要寫 1,則將總線置高 */delay(5); /* 延時 90us 供 DA18B20 采樣 */DQ=1;/*釋放 DQ 總線 */_nop_();_nop_();EA=1;/* 寫一字節(jié)數(shù)據(jù)子程序*/void write_byte(unsigned char val)unsigned char i;unsigned char temp;EA=0;TR0

5、=0;for(i=0;ii; /*移位操作,將本次要寫的位移到最低位 */ temp=temp&1;write_bit(temp); /* 向總線寫該位 */ delay(7); /* 延時 120us 后 */ TR0=1;EA=1;/* 讀一位數(shù)據(jù)子程序*/unsigned char read_bit()unsigned char i,value_bit;EA=0;DQ=0;/*拉低 DQ ,開始讀時序 */_nop_();_nop_();DQ=1; /* 釋放總線 */for(i=0;i2;i+) value_bit=DQ;EA=1;return(value_bit);/* 讀一字節(jié)數(shù)據(jù)

6、子程序*/unsigned char read_byte()unsigned char i,value=0;EA=0;for(i=0;i8;i+)if(read_bit() /* 讀一字節(jié)數(shù)據(jù),一個時序中讀一次,并作移位處理 */ value|=0x01i;delay(4);/*延時 80us 以完成此次都時序,之后再讀下一數(shù)據(jù)*/EA=1;return(value);/*復(fù)位子程序* unsigned char reset()unsigned char presence;EA=0;DQ=0; /* 拉低 DQ 總線開始復(fù)位 */ delay(30); /* 保持低電平 480us*/DQ=1

7、; /* 釋放總線 */delay(3);presence=DQ;/* 獲取應(yīng)答信號 */delay(28); /* 延時以完成整個時序 */EA=1;return(presence);/* 返回應(yīng)答信號,有芯片應(yīng)答返回0,無芯片則返回 1*/* 獲取溫度子程序* void get_temper()unsigned char i,j;doi=reset(); /* 復(fù)位 */while(i!=0); /*1 為無反饋信號 */i=0xcc; /* 發(fā)送設(shè)備定位命令 */ write_byte(i);i=0x44; /* 發(fā)送開始轉(zhuǎn)換命令 */ write_byte(i);delay(180);

8、 /*延時 */doi=reset(); /* 復(fù)位 */while(i!=0);i=0xcc; /* 設(shè)備定位 */ write_byte(i);i=0xbe; /* 讀出緩沖區(qū)內(nèi)容 */ write_byte(i);j=read_byte();i=read_byte();i=(i4;temper=i|j; /* 獲取的溫度放在 temper 中 */ /*=Initialize PID Structure =*/ void PIDInit (struct PID *pp)memset ( pp,0,sizeof(struct PID);/*=PID 計算部分=*/ unsigned int

9、 PIDCalc( struct PID *pp, unsigned int NextPoint ) unsigned int dError,Error;Error = pp-SetPoint - NextPoint; / 偏差 pp-SumError += Error; / 積分 dError = pp-LastError - pp-PrevError; / 當(dāng)前微分 pp-PrevError = pp-LastError; pp-LastError = Error;return (pp-Proportion * Error / 比例項 + pp-Integral * pp-SumEror

10、/ 積分項 + pp-Derivative * dError); / 微分項 /* 溫度比較處理子程序*/ compare_temper() unsigned char i;if(set_tempertemper) if(set_temper-temper1) high_time=100; low_time=0; else for(i=0;i10;i+) get_temper(); rin = s; / Read Input rout = PIDCalc ( &spid,rin ); / Perform PID Interation if (high_time=100) high_time=(

11、unsigned char)(rout/800);else high_time=100;low_time= (100-high_time);else if(set_temper0) high_time=0; low_time=100;else for(i=0;i10;i+) get_temper();rin = s; / Read Inputrout = PIDCalc ( &spid,rin ); / Perform PID Interation if (high_time100)high_time=(unsigned char)(rout/10000);else high_time=0;l

12、ow_time= (100-high_time);/ else/ /*T0 中斷服務(wù)子程序,用于控制電平的翻轉(zhuǎn) ,40us*100=4ms 周期 */ void serve_T0() interrupt 1 using 1if(+count=(high_time) output=1;else if(count=100)output=0;elsecount=0;TH0=0x2f;TL0=0xe0;/* 串行口中斷服務(wù)程序,用于上位機通訊 */ void serve_sio() interrupt 4 using 2/* EA=0;RI=0;i=SBUF;if(i=2) while(RI=0) RI=0; set_temper=SBUF; SBUF=0x02; while(TI=0) TI=0;else if(i=3)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論