还剩16页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
/■1,7,7,L*7,■£7,1•\],♦],7,7,l•7,7,7,7*£•7,■£\]“7,*!7,■1,■1,7,7,l•7,7,7,7,L*7,■£\]“7,l7,■1,\],\]“7,l•7,/,
1、[•q、,卜,卜•[■,.•q、,卜―卜•卜,[••]、,卜,卜,卜•卜,[-
4、,卜,卜,I、,.、
4、,卜,卜■卜,[••]、,卜,卜•卜•卜
4、,卜,卜”I、,.、«、,卜,卜•卜,[•■]、,卜,卜•卜•卜
4、,卜,卜”I、-I、,.\模糊控制温控系统仿真设计PID C程序代码*!*!7,K!T****L**!*.!■[,■[”KI*.!■,,■£*!K|K!*1**1**1**1**1*Kt*K!K**.!*1*1**1**1*■£*Kt*KJ*•、以■Kt**1*•■£*K|*1*K!*1**1*1*\£*Kt*K|T/*7*/#includereg
52.h#define ucharunsigned char#define uintunsigned int#define PULSE200#define number
0.035sbit SDO=P2A0;sbit SDI=P2A1;sbit CS=P2A2;sbit CLK=P2A3;sbit EOC=P2A4;sbit RS=P25;八sbit RW=P2A6;sbit EN=P2A7;sbit KEYl=P3A0;sbit KEY2=P3A1;sbit KEY3=P3A2;sbit KEY4P3A3;二sbit KEY5=P3A4;sbit INI=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 SumErr=
0.0;float U=
0.0;/7*1**.1**.£**1*
7.1*•*1*.t\£*KL
1、[■1*1**.£*/^Tw rT*rT rTrT*rT rTw^Tw rT•函数功能延时1^^9^/*T**1^*T**T**1*/void delay_msuchar zfloat code kiRule
[4]={
0.00,
0.01,
0.02,
0.03;float KiFuzzy
[4]={
0.0,
0.0,
0.0,
0.0};int codeKiRule
[7]
[7]=0,0,000,0,0,0,0,00,0,0,0,000,0,0,00,0,0,0,0,0,0,0,00,0,0,0,2,0,000,0/3,3,333,3,3};/*****误差隶属函数描述*****/ifeeRule
[0]eFuzzy
[0]=
1.0;pe=0;else ifeRule
[0]=eeeRule
[1]eFuzzy
[0]=eRule
[1]-e/eRule
[1]-eRule
[0];二;peelse ifeRule[l]=eeeRule
[2]eFuzzy
[0]=eRule
[2]-e/eRule
[2]-eRule
[1];pe=1;else ifeRule
[2]=eeeRule[3JeFuzzy
[0]=eRule
[3]-e/eRule
[3]-eRule
[2];pe=2;else ifeRule
[3]=eeeRule[4|{eFuzzy
[0]=eRule
[4]-e/eRule
[4]-eRule
[3];pe=3;else ifeRule
[4]=eeeRule
[5]eFuzzy
[0]=eRule
[5]-e/eRule
[5]-eRule
[4];pe=4;else ifeRule
[5]=eeeRule
[6]eFuzzy[O]=eRule
[6]-e/eRule
[6]-eRule
[5];pe=5;else eFuzzy[O]=
0.0;pe=5;eFuzzy[l]=
1.0-eFuzzy
[0];/*****误差变化隶属函数描述*****/ifececRule
[0]ecFuzzy
[0]=
1.0;pec=0;else ifecRule
[0]=ecececRule[l]ecFuzzy
[0]=ecRule[l]-ec/ecRule
[1]-ecRule
[0];pec=0;else ifecRule[l]=ecececRule
[2]ecFuzzy
[0]=ecRule
[2]-ec/ecRule
[2]-ecRule
[1];pec=1;else ifecRule
[2]=ecececRule
[3]ecFuzzy
[0]=ecRule
[3]-ec/ecRule
[3]-ecRule
[2];pec=2;}else ifecRule
[3]=ecececRule
[4]{ecFuzzy
[0]=ecRule
[4]-ec/ecRule
[4]-ecRule
[3];pec=3;}else ifecRule
[4]=ecececRule
[5]{ecFuzzy
[0]=ecRule
[5]-ec/ecRule
[5]-ecRule
[4];pec=4;else ifccRulc
[5]=ccccccRulc
[6]{ecFuzzy
[0]=ecRule
[6]-ec/ecRule
[6]-ecRule
[5];pec=5;elseecFuzzy[O]=
0.0;pec=5;ecFuzzy[l]=
1.0-ecFuzzy
[0];num=KiRule[pe][pec];KiFuzzy[num]+=eFuzzy
[0]*ecFuzzy
[0];num=KiRule[pe][pec+1];KiFuzzy[num]+=eFuzzy
[0]*ecFuzzy
[1];num=KiRule[pe+1][pec];KiFuzzy[num]+=eF uzzy
[1]*ecF uzzy
[0];num=KiRule[pe+1][pec+1];KiFuzzy[num]+=eFuzzy
[1]*ecFuzzy
[1];/********加权平山法解模糊Ki_calcu=KiFuzzy
[0]*kiRule[O]+KiFuzzy
[1]*kiRule
[1]+KiFuzzy
[2]*kiRule
[2]+KiFuzzy
[3]*kiRule
[3];returnKi_calcu;/7,7,7,7,7,7,7,7,7”7,7,7,7,/函数功能参数的计算PID KdK£•/•卜・卜•卜•]-«•・[、•卜q.,[、・卜■,、・卜・卜•卜«•・[、•卜,]、q.,[、・卜■]、•卜・卜•卜«••[、•卜•卜/float fuzzy_kdfloat e,float ecfloat Kd_calcu;uchar num,pe,pec;float codeeRule
[7]={-
3.0,-
2.0,-
1.0,
0.0,
1.0,
2.0,
3.0};float codeecRule
[7]={-
3.0,-
2.0,-
1.0,
0.0,
1.0,
2.0,
3.0};float eFuzzy
[2]={
0.0,
0.0};float ecFuzzy
[2]={
0.0,
0.0};;float codekdRule
[4]={
0.0,
1.0,
2.0,3-0float KdFuzzy
[4]={
0.0,
0.0,
0.0,
0.0};int codeKdRule
[7]
[7]=3,332,2,2,2,,222,1,1,111J2L12L」,1,1,01,0,1」,1,1,01」」」,221,3,3,3,323,2};/*****误差隶属函数描述*****/ifeeRule
[0]eFuzzy[O]=
1.0;pe=0;else ifeRule
[0]=eeeRule
[1]eFuzzy
[0]=eRule
[1]-e/eRule
[1]-eRule
[0];二;peelse ifeRule
[1]=eeeRule
[2]eFuzzy
[0]=eRule
[2]-e/eRule
[2]-eRule
[1];;pe=1else ifeRule
[2]=eeeRule
[3]eFuzzy
[0]=eRule
[3]-e/eRule
[3]-eRule
[2];pe=2;else ifeRule
[3]=eeeRule
[4]{eFuzzy
[0]=eRule
[4]-e/eRule
[4]-eRule
[3];pe=3;else ifeRule
[4]=eeeRule
[5]eFuzzy
[0]=eRule
[5]-e/eRule
[5]-eRule
[4];pe=4;else ifeRule
[5]=eeeRule
[6]eFuzzy
[0]=eRule
[6]-e/eRule
[6]-eRule
[5];pe=5;elseeFuzzy
[0]=
0.0;pe=5;eFuzzy[l]=
1.0-eFuzzy
[0];/*****误差变化隶属函数描述*****/ifececRule
[0]ecFuzzy
[0]=
1.0;pec=0;else ifecRule[O]=ecececRule[l]ecFuzzy[O]=ecRule[l]-ec/ecRule[l]-ecRule[O];pec=0;else ifecRule[l]=ecececRule
[2]ecFuzzy[O]=ecRule
[2]-ec/ecRule
[2]-ecRule[l];pec=1;else ifecRule
[2]=ecececRule
[3]ecFuzzy[O]=ecRule
[3]-ec/ecRule
[3]-ecRule
[2];pec=2;}else ifecRule
[3]=ecececRule
[4]{ecFuzzy[O]=ecRule
[4]-ec/ecRule
[4]-ecRule
[3];pec=3;}else ifecRule
[4]=ecececRule
[5]{ecFuzzy[O]=ecRule
[5]-ec/ecRule
[5]-ecRule
[4];pec=4;else ifecRule
[5]=ecececRule
[6]{ecFuzzy[O]=ecRule
[6]-ec/ecRule
[6]-ecRule
[5];pec=5;elseecFuzzy[O]=
0.0;pec=5;}ecFuzzy[l]=
1.0-ecFuzzy[O];/***********查询模糊规贝表*************/ijnum=KdRule[pe][pec];KdFuzzy[num]+=eFuzzy[O]*ecFuzzy[O];num=KdRule[pe][pec+1];KdFuzzy[num]+=cFuzzy[01*ccFuzzy
[1];num=KdRule[pe+1][pec];KdFuzzy[num]+=eFuzzy
[1]*ecFuzzy
[0];num=KdRule[pe+1][pec+1];二KdFuzzy[num]+eFuzzy
[1]*ecFuzzy
[1];/********力口权平均法解模糊********/Kd_calcu=KdFuzzy
[0]*kdRule[O]+KdFuzzy
[1]*kdRule
[1]+KdFuzzy
[2]*kdRule
[2]+KdFuzzy
[3]*kdRule
[3];returnKd_calcu;/^1^xl*KIX/,卜,卜q、,、.
1、•卜.卜,[、•、.,、,[、•卜・卜.卜•卜,;、■;、■卜―卜,卜,卜q、,;、.
1、•卜.卜,卜•[、.,、,[、•卜・卜.卜•卜,;、■;、■卜―卜,卜,卜才、函数功能将采集到的温度进行转化AD7,7,KJ K|7“K1KA K*K{7,7,K.J K*.f7,7,7,7,7,7,7,KJ K*7,7,KL*/*y»*y»*y**y»*y**y»*y»*j**y*/uint read_tlc2543uchar portstatic ucharPORT=0;uchar Temp,i,k=0;uint AD_value=0;Temp=port;CS=1;CLK=0;Temp«=4;CS=0;whilelfori=0;i8;i++CLK=0;ifTemp0x80SDI=1;elseSDI=0;AD value«=l;ifSDOAD_value|=0x01;CLK=1;Temp«=l;fori=8;i12;i++CLK=0;AD value«=l;ifSDOAD_value|=0x01;delay_us10;CLK=1;CLK=0;cs1;ifPORT=port break;elseTemp=port;Temp«=4;delay_us10;CS=0;AD value=0;k++;ifk2PORT=port;return ADvalue;float AD_dealvoiduint AD_value;float temp;AD_value=read_tlc25430x00;temp=AD_value*number;return temp;/*********主函数**********/void mainvoiducharAD_value=0;flag=0;flag_start=O;ENA=1;IN1=0;IN2=0;」LCD nit;LCD_display;」Timcr2nit;whilelifflag_start==Okey_scan;Show_Num13,1,3S_temp;9』Show_Num3,3,P_temp;else ifflag_start~lP_temp=AD_deal;』Show_Num3,3,P_temp;PID_Calculate;量化因子Kp=fuzzy_kpErr/5,D_Err;//E5Ki=fuzzy_kiErr/5,D_Err;Kd=fuzzy_kdErr/5,D_Err;Show_Num2,2,2,Kp;Show_KiKi;Show_Num14,2,2,Kd;key_scan;Show_N um13,1,3,S_temp;}/***************定时器中断**************/2void timer2interrupt5static uchar num1=0;TF2=0;numl++;ifnuml=Uifflag==lINI=0;IN2=1;elseINI=1;IN2=0;elseENA=0;ifnumlPULSE{numl=0;ENA=l;}uchar i;uchar j;fori=z;i0;i—;forj=360;j0;j-void delay_usuchar zuchar i;fori=z;i0;i-;}void LCD_WriteDatauchar DatRS=1;Pl=Dat;delay_us10;EN=1;delay_us10;EN=0;void LCD_WriteCOMuchar comRS=0;Pl=com;delay_us10;EN=1;delay_us10;EN=0;void Show_Numuchar x,uchar y,ucharn,float numuchar a
[3];uchari;uint Temp;Temp=intnum;fori=0;in;i++a[i]=Temp%10;Temp=Temp/10;ify%2=1LCD_WriteCOM0x80+x;elseLCD_WriteCOM0x80+0x40+x;fori=n;i0;i—LCD_WriteDataa[i-1]+0x30;}void Show_Kiuchar num_Kiuchar Temp;num Ki=Ki*100;Temp=ucharnum_Ki;Show_N um10,2,1,Temp%10;Temp=Temp/10;Show_Num9,2,l,Temp%10;Temp=Temp/10;Show_Num7,2,1,Temp;void Show_charuchar x,uchar y,uchar chify%2=1LCD_WriteCOM0x80+x;elseLCD_WriteCOM0x80+0x40+x;LCD_WriteDatach;void LCD_InitvoidRW=0;EN=0;LCD_WriteCOMOx38;LCD_WriteCOMOxOc;LCD_WriteCOM0x06;LCD_WriteCOM0x01;}//•卜■、•卜•[、•[、■;、•卜•[、•卜-j、•卜•[、..、■[、•[、•[、函数功能显示函数7,7,7,7,7,7,7,7,7,KJ7,7,7,K|7,7,/*7**1^/void LCD_displayvoid Show_charl,1,T;delay_us10;;Show_char0J P;;delay_us10;Show_charl,l T;delay_us10;Show_char2,l/:1;delay_us10;Show_Num3,1,3,P_temp;delay_us10;Show_char10,l,S;delay_us10;;Show_charll,l T;delay_us10;Show_charl2,1delay_us10;Show_Num13,1,3,S_temp;delay_us10;Show_char0,2;Pf;delay_us10;Show_charl,2/:1;delay_us10;Show_Num2,2,2,Kp;delay_us10;Show_char5,2/F;delay_us10;;Sho w_char6,2,delay_us10;Show_char8,2,7;delay_us10;Show_KiKi;delay_us10;Show_char12,2;D,;delay_us10;Show_char13,2/:*;delay_us10;Show_Num14,22Kd;delay_us10;/KJ**1*S1^*1^^1*/—J、.J、q.函数功能定时器初始化2vt**!77,77777,7”7*
7.7“/rT*rT*rTw^rw rT*/void Timer2_InitRCAP2H=65536-300/256;RCAP2L=65536-300%256;TH2=RCAP2H;TL2=RCAP2L;ET21;二TR2=1;EA=1;/*1^*1^*£**1**1**1**1^^£*^9^/,卜,卜q、,、.
1、•卜.卜,[、•、.,、,[、•卜・卜.卜•卜,;、■;、■卜―卜,卜,卜q、,;、.
1、•卜.卜,卜•[、.,、,[、•卜・卜.卜•卜,;、■;、■卜函数功能键盘扫描,调整设置温度、!7,K1K*K1*KI7,KI K|K®^1*7*7^K
1.f*7**1^1K*K1*7,*1K|^1*■!7,7*K1KJ7,7,/*y»*y»*y**y»*y**y»^p»*y»*j**y*/void key_scanvoidifKEYl=0delay_msl;ifKEYl==0S_temp=S_temp+1;ifS_temp=200S_temp=200;while!KEYl;ifKEY2=0delay_msl;ifKEY2==0ifS_temp0S_temp=S_temp-1;else ifS_temp=0S_temp=0;while!KEY2;ifKEY3==0delay_msl;ifKEY3==0ifS_temp=190S_temp=S_temp+10;while!KEY3;ifKEY4=0delay_msl;ifKEY4=0ifS_temp=10S_temp=S_temp-10;while!KEY4;ifKEY5==0delay_msl;ifKEY5=0flag_start=l;while!KEY5;/six*1^si*^1^sl/q、q、•[、q、q、..、,门•卜•卜q、q、■]、-R-[、q、q、-R•卜•[、q、q、.,、,A•卜•卜q、q、,]、函数功能的计算PTD7,7,KJ^KJ KF7,7,KI7“7,KJ KJK1KF7”7,7,7,^1*K17“7,/*y**y**y»*y»/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=intU;ifU=0{ifU=200U=200;flag=l;elseU=-U;ifU=200U=200;flag=0;/KL*KL*/*7^rr*«、〃、?、力、函数功能参数的计算PID Kp,,*.!7]U*7■/,表示误差,误差变化率float fuzzy_kpfloat e,float ecyj*[float Kp_calcu;uchar num,pe,pec;〃误差的模糊论域float codeeRule
[7]={-
3.
02.0,-
1.0,
0.0,1,0,
2.0,
3.0};E;〃误差变化率的模糊论float codeecRule
[7]={-
3.0,-
2.0,-L0,
0.M.02030}EC域〃隶属于误差的隶属程度float eFuzzy
[2]={
0.0,
0.0};E〃隶属于误差变化率的隶属程度float ecFuzzy
[2]={
0.0,
0.0};ECfloat codekpRule
[4]={
0.0,
8.0,
16.0,
24.0};的模糊子集//Kpfloat KpFuzzy
[4]={
0.0,
0.0,
0.0,
0.0};〃隶属于的隶属程度Kpint codeKpRule
[7]
[7]=的模糊控制表//Kp333,3,333,2,222,122,』0,0,1AO,1,0,0,1,0,0,0233333,3,3;/*****误差隶属函数描述*****/E ifeeRule
[0]eFuzzy
[0]=
1.0;pe=0;else ifeRule[O]=eeeRule[l]eFuzzy
[0]=eRule
[1]-e/eRule
[1]-eRule
[0];pe=0;else ifeRule[l]=eeeRule
[2]eFuzzy
[0]=eRule
[2]-e/eRule
[2]-eRule
[1];pe=1;else ifeRule
[2]=eeeRule[31eFuzzy[O]=eRule
[3]-e/eRule
[3]-eRule
[2];pe=2;else ifeRule
[3]=eeeRule[4|{eFuzzy[O]=eRule
[4]-e/eRule
[4]-eRule
[3];pe=3;else ifeRule
[4]=eeeRule
[5]eFuzzy[O]=eRule
[5]-e/eRule
[5]-eRule
[4];pe=4;else ifeRule
[5]=eeeRule
[6]eFuzzy[O]=eRule
[6]-e/eRule
[6]-eRule
[5];pe=5;elseeFuzzy[O]=
0.0;pe=5;eFuzzy[l]=
1.0-eFuzzy
[0];/*****误差变化率隶属函数描述*****/ECifececRule
[0]ecFuzzy
[0]=
1.0;pec=0;else ifecRule
[0]=ecececRule[l]ecFuzzy
[0]=ecRule[l]-ec/ecRule[l]-ecRule[O];pec=0;}else ifecRule[l]=ecececRule
[2]ecFuzzy
[0]=ecRule
[2]-ec/ecRule
[2]-ecRule
[1];pec=1;}else ifecRule
[2]=ecececRule
[3]ecFuzzy
[0]=ecRule
[3]-ec/ecRule
[3]-ecRule
[2];pec=2;else ifecRule
[3]=ecececRule
[4]{ecFuzzy[O]=ecRule
[4]-ec/ecRule
[4]-ecRule
[3];pec=3;else ifecRule
[4]=ecececRule
[5]{ecFuzzy[O]=ecRule
[5]-ec/ecRule
[5]-ecRule
[4];pec=4;else ifecRule
[5]=ecececRule[6|{ecFuzzy[O]=ecRule
[6]-ec/ecRule
[6]-ecRule
[5];pec=5;elseecFuzzy[O]=
0.0;pec=5;ecFuzzy[l]=
1.0-ecFuzzy
[0];num=KpRule[pe][pec];KpFuzzy[num]+=eFuzzy
[0]^ecFuzzy
[0];num=KpRule[pe][pec+1];KpFuzzy[num]+=eFuzzy
[0]*ecFuzzy
[1];num=KpRule[pe+1][pec];KpFuzzy[num]+=eFuzzy
[1]*ecFuzzy
[0];num=KpRule[pe+1][pec+1];KpFuzzy[num]+=eFuzzy
[1]*ecFuzzy
[1];/*********加权平均法解模糊Kp_calcu=KpFuzzy[0J*kpRule[0J+KpFuzzy[l]*kpRule[l]+KpFuzzy[2J*kpRule
[2]+KpFuzzy
[3]*kpRule
[3];returnKp_calcu;/7,*1*^1*^1*7,*1**1*7,7,7,7,7,7,7,f函数功能参数的计算,,,PID Ki.[―7•777“K*\]■//float fuzzy_kifloat e,float ecfloatKi_calcu;uchar num,pe,pec;float codeeRule
[7]={-
3.0,-
2.0,-
1.0,
0.0,
1.0,
2.0,
3.0};floatcodeecRule
[7]={-
3.0,-
2.0,-
1.0,
0.0,
1.0,
2.0,
3.0};float eFuzzy
[2]={
0.
00.0};float ecFuzzy
[2]={
0.0,
0.0};。
个人认证
优秀文档
获得点赞 0