




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、*模糊PID控制溫控系統仿真設計C程序代碼*/#include<reg52.h>#define uchar unsigned char#define uint unsigned int#define PULSE 200#define number 0.035sbit SDO = P2A0;sbit SDI = P2A1;sbit CS = P2A2;sbit CLK = P2A3;sbit EOC = P2A4;sbit RS = P2A5;sbit RW = P2A6;sbit EN = P2A7;sbit KEY1= P3A0;sbit KEY2= P3A1;sbit KEY3
2、= P3A2;sbit KEY4= P3A3;sbit KEY5= P3A4;sbit IN1 = P3A5;sbit IN2 = P3A6;sbit ENA = P3A7;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;/*函數功能:延時*/void delay_ms(uchar z)uchar i;uc
3、har j;for(i=z;i>0;i-)for(j=360;j>0;j-);void delay_us(uchar z)uchar i;for(i=z;i>0;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
4、,float num)uchar a3;uchar i;uint Temp;Temp=(int)num;for(i=0;i<n;i+)ai = Temp%10;Temp = Temp/10;if(y%2 = 1)LCD_WriteCOM(0x80+x);elseLCD_WriteCOM(0x80+0x40+x);for(i=n;i>0;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);
5、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 = 1)LCD_WriteCOM(0x80+x);elseLCD_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);
6、/*函數功能:顯示函數*/void LCD_display(void)Show_char(1,1,'T');delay_us(10);Show_char(0,1,'P');delay_us(10);Show_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');
7、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);Show_Num(2,2,2,Kp);delay_us(10);Show_char(5,2,T);delay_us(10);Show_char(6,2,':');delay_us(10);Show_char(8,2,'.');
8、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);/*函數功能:定時器2初始化*/void Timer2_Init()RCAP2H =(65536-300)/256;RCAP2L =(65536-300)%256;TH2 = RCAP2H;TL2 = RCAP2L;ET2 = 1;TR2 = 1;EA = 1;/*函數功能:鍵盤掃描,調整設置
9、溫度*/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_temp>0)S_temp=S_temp-1;else if(S_temp<=0)S_temp=0; while(!KEY2);if(KEY3=0)delay_ms(1);if(KEY3=0)if(S_temp<=190)S_temp=S_temp+10;while(!KEY3);
10、if(KEY4=0)(delay_ms(1);if(KEY4=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);/*函數功能:PID的計算*/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;U=(int)U;if(U>=0)
11、if(U>=200)U=200;flag=1;elseU=-U;if(U>=200)U=200;flag=0;/*函數功能:PID參數Kp的計算*/Z/e,ec,表示誤差,誤差變化率float fuzzy_kp(float e, float 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 的模糊論 域隸屆于誤差E的隸屆程度隸
12、屆于誤差變化率EC的隸屆程度/Kp的模糊子集隸屆于Kp的隸屆程度/Kp的模糊控制表float eFuzzy2=0.0,0.0;float ecFuzzy2=0.0,0.0;float code kpRule4=0.0,8.0,16.0,24.0;float KpFuzzy4=0.0,0.0,0.0,0.0;int code KpRule77=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隸屆函數描述*/if(e<eRule0)eF
13、uzzy0 =1.0;pe = 0;else if(eRule0<=e && e<eRule1)eFuzzy0 = (eRule1-e)/(eRule1-eRule0); pe = 0;else if(eRule1<=e && e<eRule2)eFuzzy0 = (eRule2 -e)/(eRule2-eRule1); pe = 1;else if(eRule2<=e && e<eRule3)eFuzzy0 = (eRule3 -e)/(eRule3-eRule2);pe = 2;else if(eRule3
14、<=e && e<eRule4)( eFuzzy0 = (eRule4-e)/(eRule4-eRule3);pe = 3;else if(eRule4<=e && e<eRule5)(eFuzzy0 = (eRule5-e)/(eRule5-eRule4);pe = 4;else if(eRule5<=e && e<eRule6)(eFuzzy0 = (eRule6-e)/(eRule6-eRule5);pe = 5;else(eFuzzy0 =0.0;pe =5;eFuzzy1 =1.0 - eFuzzy0
15、;/*誤差變化率EC隸屆函數描述*/if(ec<ecRule0)(ecFuzzy0 =1.0;pec = 0;else if(ecRule0<=ec && ec<ecRule1)(ecFuzzy0 = (ecRule1 - ec)/(ecRule1-ecRule0);pec = 0 ;else if(ecRule1<=ec && ec<ecRule2)(ecFuzzy0 = (ecRule2 - ec)/(ecRule2-ecRule1);pec = 1;else if(ecRule2<=ec && ec<
16、;ecRule3)(ecFuzzy0 = (ecRule3 - ec)/(ecRule3-ecRule2); pec = 2 ;else if(ecRule3<=ec && ec<ecRule4)( ecFuzzy0 = (ecRule4-ec)/(ecRule4-ecRule3); pec=3;else if(ecRule4<=ec && ec<ecRule5)( ecFuzzy0 = (ecRule5-ec)/(ecRule5-ecRule4); pec=4;else if(ecRule5<=ec && ec&l
17、t;ecRule6)( ecFuzzy0 = (ecRule6-ec)/(ecRule6-ecRule5); pec=5;else(ecFuzzy0 =0.0;pec = 5;ecFuzzy1 = 1.0 - ecFuzzy0;/*查詢模糊規則表*/num =KpRulepepec;KpFuzzynum += eFuzzy0*ecFuzzy0;num =KpRulepepec+1;KpFuzzynum += eFuzzy0*ecFuzzy1;num =KpRulepe+1pec;KpFuzzynum += eFuzzy1*ecFuzzy0;num =KpRulepe+1pec+1;KpFuzz
18、ynum += eFuzzy1*ecFuzzy1;/* 加 權 平 均 法 解 模 糊*/Kp_calcu=KpFuzzy0*kpRule0+KpFuzzy1*kpRule1+KpFuzzy2*kpRule 2+KpFuzzy3*kpRule3;return(Kp_calcu);/*函數功能:PID參數Ki的計算*/ float fuzzy_ki(float e, float ec)float 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
19、.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,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;/*誤差隸屆函數描述*/if(e<eRule0)eFuzzy0 =1.0;pe =
20、0;else if(eRule0<=e && e<eRule1)eFuzzy0 = (eRule1-e)/(eRule1-eRule0);pe = 0;else if(eRule1<=e && e<eRule2)eFuzzy0 = (eRule2 -e)/(eRule2-eRule1);pe = 1;else if(eRule2<=e && e<eRule3)eFuzzy0 = (eRule3 -e)/(eRule3-eRule2);pe = 2;else if(eRule3<=e &&
21、e<eRule4) eFuzzy0 = (eRule4-e)/(eRule4-eRule3);pe = 3;else if(eRule4<=e && e<eRule5)eFuzzy0 = (eRule5-e)/(eRule5-eRule4);pe = 4;else if(eRule5<=e && e<eRule6)eFuzzy0 = (eRule6-e)/(eRule6-eRule5); pe = 5;else(eFuzzy0 =0.0;pe =5;eFuzzy1 =1.0 - eFuzzy0;/*誤差變化隸屆函數描述*/if(ec
22、<ecRule0)(ecFuzzy0 =1.0;pec = 0;else if(ecRule0<=ec && ec<ecRule1)(ecFuzzy0 = (ecRule1 - ec)/(ecRule1-ecRule0);pec = 0 ;else if(ecRule1<=ec && ec<ecRule2)(ecFuzzy0 = (ecRule2 - ec)/(ecRule2-ecRule1); pec = 1;else if(ecRule2<=ec && ec<ecRule3)(ecFuzzy0 = (
23、ecRule3 - ec)/(ecRule3-ecRule2); pec = 2 ;else if(ecRule3<=ec && ec<ecRule4)( ecFuzzy0 = (ecRule4-ec)/(ecRule4-ecRule3);pec=3;else if(ecRule4<=ec && ec<ecRule5)( ecFuzzy0 = (ecRule5-ec)/(ecRule5-ecRule4);pec=4;else if(ecRule5<=ec && ec<ecRule6)( ecFuzzy0 = (
24、ecRule6-ec)/(ecRule6-ecRule5);pec=5;elseecFuzzy0 =0.0;pec = 5;ecFuzzy1 = 1.0 - ecFuzzy0;/*查詢模糊規則表 */num =KiRulepepec;KiFuzzynum += eFuzzy0*ecFuzzy0;num =KiRulepepec+1;KiFuzzynum += eFuzzy0*ecFuzzy1;num =KiRulepe+1pec;KiFuzzynum += eFuzzy1*ecFuzzy0;num =KiRulepe+1pec+1;KiFuzzynum += eFuzzy1*ecFuzzy1;
25、/* 加 權 平 均 法 解 模 糊 */Ki_calcu=KiFuzzy0*kiRule0+KiFuzzy1*kiRule1+KiFuzzy2*kiRule2+KiFuzzy3*kiRule3;return(Ki_calcu);/*函數功能:PID參數Kd的計算*/ 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;f
26、loat 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,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;/*誤差隸屆函數描述*if(e<eRule0)(eFuzzy0 =1.0; pe = 0;else if(eRule0<=e &
27、;& e<eRule1)(eFuzzy0 = (eRule1-e)/(eRule1-eRule0);pe = 0;else if(eRule1<=e && e<eRule2)(eFuzzy0 = (eRule2 -e)/(eRule2-eRule1);pe = 1;else if(eRule2<=e && e<eRule3)(eFuzzy0 = (eRule3 -e)/(eRule3-eRule2);pe = 2;else if(eRule3<=e && e<eRule4)( eFuzzy0 =
28、(eRule4-e)/(eRule4-eRule3);pe = 3;else if(eRule4<=e && e<eRule5)(eFuzzy0 = (eRule5-e)/(eRule5-eRule4);pe = 4;else if(eRule5<=e && e<eRule6)(eFuzzy0 = (eRule6-e)/(eRule6-eRule5);pe = 5;else(eFuzzy0 =0.0;pe =5;eFuzzy1 =1.0 - eFuzzy0;/*誤差變化隸屆函數描述*/if(ec<ecRule0)(ecFuzzy0
29、=1.0;pec = 0;else if(ecRule0<=ec && ec<ecRule1)(ecFuzzy0 = (ecRule1 - ec)/(ecRule1-ecRule0); pec = 0 ;else if(ecRule1<=ec && ec<ecRule2)(ecFuzzy0 = (ecRule2 - ec)/(ecRule2-ecRule1); pec = 1;else if(ecRule2<=ec && ec<ecRule3)(ecFuzzy0 = (ecRule3 - ec)/(ecRule
30、3-ecRule2); pec = 2 ;else if(ecRule3<=ec && ec<ecRule4)( ecFuzzy0 = (ecRule4-ec)/(ecRule4-ecRule3); pec=3;else if(ecRule4<=ec && ec<ecRule5)( ecFuzzy0 = (ecRule5-ec)/(ecRule5-ecRule4); pec=4;else if(ecRule5<=ec && ec<ecRule6)( ecFuzzy0 = (ecRule6-ec)/(ecRule
31、6-ecRule5); pec=5;else(ecFuzzy0 =0.0;pec = 5;ecFuzzy1 = 1.0 - ecFuzzy0;/*查詢模糊規則表 */num =KdRulepepec;KdFuzzynum += eFuzzy0*ecFuzzy0;num =KdRulepepec+1;KdFuzzynum += eFuzzy0*ecFuzzy1;num =KdRulepe+1pec;KdFuzzynum += eFuzzy1*ecFuzzy0;num =KdRulepe+1pec+1;KdFuzzynum += eFuzzy1*ecFuzzy1;/* 加權平均法解模糊*/Kd_calcu=KdFuzzy0*kdRule0+KdFuzzy1*kdRule1+KdFuzzy2*kdRule 2+KdFuzzy3*kdRule3;return(Kd_calcu);/*函數功能:AD將采集到的溫度進行轉化*/ 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<8;i+)CLK = 0;if(Te
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 散打課件教學課件
- 教學課件配色
- 2025廣西來賓事業單位考試-方式筆試歷年典型考題及考點剖析附帶答案詳解
- 變形計教學課件
- 文字創作比賽活動方案
- 春季創業活動方案
- 文藝懷舊課堂活動方案
- 春季奔馳活動方案
- 明日擺攤活動方案
- 新家入伙活動方案
- 配電室巡檢記錄表
- 卓越績效評價準則概述(專業性權威性實用性)
- GB/T 30142-2013平面型電磁屏蔽材料屏蔽效能測量方法
- GB/T 29894-2013木材鑒別方法通則
- 國資進場交易工作流程講座
- 當代法律英語翻譯全
- 制冷操作證培訓教材制冷與空調設備運行操作作業培訓教程課件
- 湖南省長沙市望城區2020-2021學年八年級下學期期末考試歷史試卷
- 煙葉烘烤調制理論考試試題
- DB23-T 3336-2022懸掛式單軌交通技術標準-(高清最新)
- 服刑人員心理健康教育課件
評論
0/150
提交評論