




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、/*模糊pid控制溫控系統(tǒng)仿真設(shè)計(jì)c程序代碼*/#include#define uchar unsigned char#define uint unsigned int#define pulse 200#define number 0.035 sbit sdo = p20; sbit sdi = p21;sbit cs = p22;sbit clk = p23;sbit eoc = p24;sbit rs = p25; sbit rw = p26;sbit en = p27;sbit key1= p30;sbit key2= p31; sbit key3= p32;sbit key4= p33
2、;sbit key5= p34; sbit in1 = p35; sbit in2 = p36;sbit ena = p37;uchar flag; uchar flag_start;float s_temp=60.0; float p_temp=20.0; float kp;float ki;float kd;float err=0.0;float last_err=0.0;float d_err=0.0;float sum_err=0.0;float u=0.0;/* 函數(shù)功能:延時*/void delay_ms(uchar z) uchar i; uchar j; for(i=z;i0;
3、i-) for(j=360;j0;j-); void delay_us(uchar z) uchar i; for(i=z;i0;i-);void lcd_writedata(uchar dat) rs = 1; p1 = dat; delay_us(10); en = 1; delay_us(10); en = 0;void lcd_writecom(uchar com) rs = 0; p1 = com; delay_us(10); en = 1; delay_us(10); en = 0;void show_num(uchar x,uchar y,uchar n,float num) u
4、char a3; uchar i; uint temp; temp=(int)num; for(i=0;i0;i-) lcd_writedata(ai-1+0x30); void show_ki(uchar num_ki)uchar temp;num_ki=ki*100;temp=(uchar)num_ki; show_num(10,2,1,temp%10);temp=temp/10;show_num(9,2,1,temp%10); temp=temp/10;show_num(7,2,1,temp);void show_char(uchar x,uchar y,uchar ch) if(y%2
5、 = 1) lcd_writecom(0x80+x); else lcd_writecom(0x80+0x40+x); lcd_writedata(ch); void lcd_init(void) rw = 0; en = 0; lcd_writecom(0x38); lcd_writecom(0x0c); lcd_writecom(0x06); lcd_writecom(0x01);/* 函數(shù)功能:顯示函數(shù)*/void lcd_display(void) show_char(1,1,t); delay_us(10); show_char(0,1,p); delay_us(10); show_
6、char(1,1,t); delay_us(10); show_char(2,1,:); delay_us(10); show_num(3,1,3,p_temp); delay_us(10); show_char(10,1,s); delay_us(10); show_char(11,1,t); delay_us(10); show_char(12,1,:); delay_us(10); show_num(13,1,3,s_temp); delay_us(10); show_char(0,2,p); delay_us(10); show_char(1,2,:); delay_us(10); s
7、how_num(2,2,2,kp); delay_us(10); show_char(5,2,i); delay_us(10); show_char(6,2,:); delay_us(10); show_char(8,2,.); delay_us(10); show_ki(ki); delay_us(10); show_char(12,2,d); delay_us(10); show_char(13,2,:); delay_us(10); show_num(14,2,2,kd); delay_us(10);/* 函數(shù)功能:定時器2初始化*/void timer2_init() rcap2h =
8、(65536-300)/256; rcap2l =(65536-300)%256; th2 = rcap2h; tl2 = rcap2l; et2 = 1; tr2 = 1; ea = 1;/* 函數(shù)功能:鍵盤掃描,調(diào)整設(shè)置溫度*/void key_scan(void)if(key1=0) delay_ms(1);if(key1=0)s_temp=s_temp+1;if(s_temp=200)s_temp=200;while(!key1);if(key2=0)delay_ms(1);if(key2=0)if(s_temp0)s_temp=s_temp-1;else if(s_temp=0)s_
9、temp=0;while(!key2);if(key3=0) delay_ms(1);if(key3=0)if(s_temp=10)s_temp=s_temp-10;while(!key4);if(key5=0) delay_ms(1);if(key5=0)flag_start=1; while(!key5);/* 函數(shù)功能:pid的計(jì)算*/void pid_calculate() err = s_temp - p_temp; sum_err += err; d_err = err - last_err; last_err = err; u=kp*err+ki*sum_err+kd*d_err
10、; u=(int)u; if(u=0) if(u=200)u=200;flag=1; else u=-u;if(u=200)u=200;flag=0; /* 函數(shù)功能:pid參數(shù)kp的計(jì)算 */ float fuzzy_kp(float e, float ec)/e,ec,表示誤差,誤差變化率 float kp_calcu;uchar num,pe,pec; float code erule7=-3.0,-2.0,-1.0,0.0,1.0,2.0,3.0; /誤差e的模糊論域float code ecrule7=-3.0,-2.0,-1.0,0.0,1.0,2.0,3.0; /誤差變化率ec的
11、模糊論域float efuzzy2=0.0,0.0; /隸屬于誤差e的隸屬程度float ecfuzzy2=0.0,0.0; /隸屬于誤差變化率ec的隸屬程度float code kprule4=0.0,8.0,16.0,24.0;/kp的模糊子集float kpfuzzy4=0.0,0.0,0.0,0.0;/隸屬于kp的隸屬程度int code kprule77= /kp的模糊控制表3,3,3,3,3,3,3,2,2,2,2,1,2,2,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,0,1,0,0,1,0,0,1,0,1,0,0,2,3,3,3,3,3,3,3; /*誤差e隸屬
12、函數(shù)描述*/ if(eerule0)efuzzy0 =1.0; pe = 0;else if(erule0=e & eerule1)efuzzy0 = (erule1-e)/(erule1-erule0);pe = 0;else if(erule1=e & eerule2)efuzzy0 = (erule2 -e)/(erule2-erule1);pe = 1;else if(erule2=e & eerule3)efuzzy0 = (erule3 -e)/(erule3-erule2);pe = 2; else if(erule3=e & eerule4) efuzzy0 = (erule4
13、-e)/(erule4-erule3); pe = 3; else if(erule4=e & eerule5)efuzzy0 = (erule5-e)/(erule5-erule4);pe = 4;else if(erule5=e & eerule6)efuzzy0 = (erule6-e)/(erule6-erule5);pe = 5;elseefuzzy0 =0.0;pe =5; efuzzy1 =1.0 - efuzzy0;/*誤差變化率ec隸屬函數(shù)描述*/ if(ececrule0)ecfuzzy0 =1.0;pec = 0;else if(ecrule0=ec & ececrule
14、1)ecfuzzy0 = (ecrule1 - ec)/(ecrule1-ecrule0);pec = 0 ;else if(ecrule1=ec & ececrule2)ecfuzzy0 = (ecrule2 - ec)/(ecrule2-ecrule1);pec = 1;else if(ecrule2=ec & ececrule3)ecfuzzy0 = (ecrule3 - ec)/(ecrule3-ecrule2);pec = 2 ; else if(ecrule3=ec & ececrule4) ecfuzzy0 = (ecrule4-ec)/(ecrule4-ecrule3); pe
15、c=3; else if(ecrule4=ec & ececrule5) ecfuzzy0 = (ecrule5-ec)/(ecrule5-ecrule4); pec=4; else if(ecrule5=ec & ececrule6) ecfuzzy0 = (ecrule6-ec)/(ecrule6-ecrule5); pec=5; elseecfuzzy0 =0.0;pec = 5;ecfuzzy1 = 1.0 - ecfuzzy0; /*查詢模糊規(guī)則表*/num =kprulepepec;kpfuzzynum += efuzzy0*ecfuzzy0;num =kprulepepec+1;
16、kpfuzzynum += efuzzy0*ecfuzzy1;num =kprulepe+1pec;kpfuzzynum += efuzzy1*ecfuzzy0;num =kprulepe+1pec+1;kpfuzzynum += efuzzy1*ecfuzzy1;/*加權(quán)平均法解模糊*/ kp_calcu=kpfuzzy0*kprule0+kpfuzzy1*kprule1+kpfuzzy2*kprule2+kpfuzzy3*kprule3;return(kp_calcu);/* 函數(shù)功能:pid參數(shù)ki的計(jì)算 */ float fuzzy_ki(float e, float ec) floa
17、t ki_calcu;uchar num,pe,pec;float code erule7=-3.0,-2.0,-1.0,0.0,1.0,2.0,3.0;float code ecrule7=-3.0,-2.0,-1.0,0.0,1.0,2.0,3.0;float efuzzy2=0.0,0.0;float ecfuzzy2=0.0,0.0; float code kirule4=0.00,0.01,0.02,0.03; float kifuzzy4=0.0,0.0,0.0,0.0;int code kirule77= 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
18、,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,1,3,3,3,3,3,3,3; /*誤差隸屬函數(shù)描述*/if(eerule0)efuzzy0 =1.0; pe = 0;else if(erule0=e & eerule1)efuzzy0 = (erule1-e)/(erule1-erule0);pe = 0;else if(erule1=e & eerule2)efuzzy0 = (erule2 -e)/(erule2-erule1);pe = 1;else if(erule2=e & eerule3)efuzzy0 = (erule3 -e)/(e
19、rule3-erule2);pe = 2; else if(erule3=e & eerule4) efuzzy0 = (erule4-e)/(erule4-erule3); pe = 3; else if(erule4=e & eerule5)efuzzy0 = (erule5-e)/(erule5-erule4);pe = 4;else if(erule5=e & eerule6)efuzzy0 = (erule6-e)/(erule6-erule5);pe = 5;elseefuzzy0 =0.0;pe =5; efuzzy1 =1.0 - efuzzy0;/*誤差變化隸屬函數(shù)描述*/
20、if(ececrule0)ecfuzzy0 =1.0;pec = 0;else if(ecrule0=ec & ececrule1)ecfuzzy0 = (ecrule1 - ec)/(ecrule1-ecrule0);pec = 0 ;else if(ecrule1=ec & ececrule2)ecfuzzy0 = (ecrule2 - ec)/(ecrule2-ecrule1);pec = 1;else if(ecrule2=ec & ececrule3)ecfuzzy0 = (ecrule3 - ec)/(ecrule3-ecrule2);pec = 2 ; else if(ecrul
21、e3=ec & ececrule4) ecfuzzy0 = (ecrule4-ec)/(ecrule4-ecrule3); pec=3; else if(ecrule4=ec & ececrule5) ecfuzzy0 = (ecrule5-ec)/(ecrule5-ecrule4); pec=4; else if(ecrule5=ec & ececrule6) ecfuzzy0 = (ecrule6-ec)/(ecrule6-ecrule5); pec=5; elseecfuzzy0 =0.0;pec = 5;ecfuzzy1 = 1.0 - ecfuzzy0; /*查詢模糊規(guī)則表*/num
22、 =kirulepepec;kifuzzynum += efuzzy0*ecfuzzy0;num =kirulepepec+1;kifuzzynum += efuzzy0*ecfuzzy1;num =kirulepe+1pec;kifuzzynum += efuzzy1*ecfuzzy0;num =kirulepe+1pec+1;kifuzzynum += efuzzy1*ecfuzzy1;/*加權(quán)平均法解模糊*/ ki_calcu=kifuzzy0*kirule0+kifuzzy1*kirule1+kifuzzy2*kirule2+kifuzzy3*kirule3; return(ki_ca
23、lcu);/* 函數(shù)功能:pid參數(shù)kd的計(jì)算 */ float fuzzy_kd(float e, float ec) float kd_calcu;uchar num,pe,pec; float code erule7=-3.0,-2.0,-1.0,0.0,1.0,2.0,3.0;float code ecrule7=-3.0,-2.0,-1.0,0.0,1.0,2.0,3.0;float efuzzy2=0.0,0.0;float ecfuzzy2=0.0,0.0; float code kdrule4=0.0,1.0,2.0,3.0;float kdfuzzy4=0.0,0.0,0.0
24、,0.0;int code kdrule77=3,3,3,2,2,2,2,2,2,2,1,1,1,1,1,1,2,1,1,2,1,1,1,0,1,0,1,1,1,1,0,0,0,1,1,2,2,1,0 ,1,1,1,3,3,3,3,2,3,2; /*誤差隸屬函數(shù)描述*/if(eerule0)efuzzy0 =1.0; pe = 0;else if(erule0=e & eerule1)efuzzy0 = (erule1-e)/(erule1-erule0);pe = 0;else if(erule1=e & eerule2)efuzzy0 = (erule2 -e)/(erule2-erule
25、1);pe = 1;else if(erule2=e & eerule3)efuzzy0 = (erule3 -e)/(erule3-erule2);pe = 2; else if(erule3=e & eerule4) efuzzy0 = (erule4-e)/(erule4-erule3); pe = 3; else if(erule4=e & eerule5)efuzzy0 = (erule5-e)/(erule5-erule4);pe = 4;else if(erule5=e & eerule6)efuzzy0 = (erule6-e)/(erule6-erule5);pe = 5;e
26、lseefuzzy0 =0.0;pe =5; efuzzy1 =1.0 - efuzzy0; /*誤差變化隸屬函數(shù)描述*/ if(ececrule0)ecfuzzy0 =1.0;pec = 0;else if(ecrule0=ec & ececrule1)ecfuzzy0 = (ecrule1 - ec)/(ecrule1-ecrule0);pec = 0 ;else if(ecrule1=ec & ececrule2)ecfuzzy0 = (ecrule2 - ec)/(ecrule2-ecrule1);pec = 1;else if(ecrule2=ec & ececrule3)ecfuz
27、zy0 = (ecrule3 - ec)/(ecrule3-ecrule2);pec = 2 ; else if(ecrule3=ec & ececrule4) ecfuzzy0 = (ecrule4-ec)/(ecrule4-ecrule3); pec=3; else if(ecrule4=ec & ececrule5) ecfuzzy0 = (ecrule5-ec)/(ecrule5-ecrule4); pec=4; else if(ecrule5=ec & ececrule6) ecfuzzy0 = (ecrule6-ec)/(ecrule6-ecrule5); pec=5; elsee
28、cfuzzy0 =0.0;pec = 5;ecfuzzy1 = 1.0 - ecfuzzy0; /*查詢模糊規(guī)則表*/num =kdrulepepec;kdfuzzynum += efuzzy0*ecfuzzy0;num =kdrulepepec+1;kdfuzzynum += efuzzy0*ecfuzzy1;num =kdrulepe+1pec;kdfuzzynum += efuzzy1*ecfuzzy0;num =kdrulepe+1pec+1;kdfuzzynum += efuzzy1*ecfuzzy1;/*加權(quán)平均法解模糊*/ kd_calcu=kdfuzzy0*kdrule0+kdfuzzy1*kdrule1+kdfuzzy2*kdrule2+kdfuzzy3*kdrule3; return(kd_calcu);/*函數(shù)功能:ad將采集到的溫度進(jìn)行轉(zhuǎn)化*/uint read_tlc2543(uchar port) static uchar port = 0; uchar temp,i,k=0; uint ad_value=0; temp = port; cs = 1; clk = 0; temp=4; cs = 0; while(1) for(i=0;i
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 精英團(tuán)隊(duì)廠房設(shè)施養(yǎng)護(hù)與維護(hù)服務(wù)協(xié)議
- 餐廳資產(chǎn)重組與股份購買及經(jīng)營管理權(quán)交接合同
- 老兵短線技術(shù)課件
- 美術(shù)說課課件教學(xué)
- 瓷器考試題及答案
- 消防安全工作考評與獎懲制度
- 特種設(shè)備的安全操作規(guī)程
- 班組崗位安全生產(chǎn)責(zé)任制
- 火災(zāi)隱患排查整治總結(jié)
- 礦山安全生產(chǎn)責(zé)任制
- 銀行保密知識培訓(xùn)課件
- 高校學(xué)科重塑路徑研究
- DB12T 1444-2025 博物館消防安全管理導(dǎo)則
- 硫化氫題庫及答案
- 2025年中國農(nóng)機(jī)流通行業(yè)市場全景評估及發(fā)展戰(zhàn)略規(guī)劃報(bào)告
- 低壓培訓(xùn)課件
- 2025-2030中國洗胃機(jī)產(chǎn)業(yè)運(yùn)營現(xiàn)狀分析與未來前景趨勢展望報(bào)告
- Unit 2 Home Sweet Home 第3課時(Section A 3a-3c) 2025-2026學(xué)年人教版英語八年級下冊
- 安全生產(chǎn)月題庫-安全生產(chǎn)知識競賽題庫(1800道)
- 教師團(tuán)隊(duì)協(xié)作與溝通能力
- 保安公司薪酬管理制度
評論
0/150
提交評論