模糊PID控制温控系统设计方案C语言程序代码文档格式.docx

上传人:b****2 文档编号:3956123 上传时间:2023-05-02 格式:DOCX 页数:30 大小:18.54KB
下载 相关 举报
模糊PID控制温控系统设计方案C语言程序代码文档格式.docx_第1页
第1页 / 共30页
模糊PID控制温控系统设计方案C语言程序代码文档格式.docx_第2页
第2页 / 共30页
模糊PID控制温控系统设计方案C语言程序代码文档格式.docx_第3页
第3页 / 共30页
模糊PID控制温控系统设计方案C语言程序代码文档格式.docx_第4页
第4页 / 共30页
模糊PID控制温控系统设计方案C语言程序代码文档格式.docx_第5页
第5页 / 共30页
模糊PID控制温控系统设计方案C语言程序代码文档格式.docx_第6页
第6页 / 共30页
模糊PID控制温控系统设计方案C语言程序代码文档格式.docx_第7页
第7页 / 共30页
模糊PID控制温控系统设计方案C语言程序代码文档格式.docx_第8页
第8页 / 共30页
模糊PID控制温控系统设计方案C语言程序代码文档格式.docx_第9页
第9页 / 共30页
模糊PID控制温控系统设计方案C语言程序代码文档格式.docx_第10页
第10页 / 共30页
模糊PID控制温控系统设计方案C语言程序代码文档格式.docx_第11页
第11页 / 共30页
模糊PID控制温控系统设计方案C语言程序代码文档格式.docx_第12页
第12页 / 共30页
模糊PID控制温控系统设计方案C语言程序代码文档格式.docx_第13页
第13页 / 共30页
模糊PID控制温控系统设计方案C语言程序代码文档格式.docx_第14页
第14页 / 共30页
模糊PID控制温控系统设计方案C语言程序代码文档格式.docx_第15页
第15页 / 共30页
模糊PID控制温控系统设计方案C语言程序代码文档格式.docx_第16页
第16页 / 共30页
模糊PID控制温控系统设计方案C语言程序代码文档格式.docx_第17页
第17页 / 共30页
模糊PID控制温控系统设计方案C语言程序代码文档格式.docx_第18页
第18页 / 共30页
模糊PID控制温控系统设计方案C语言程序代码文档格式.docx_第19页
第19页 / 共30页
模糊PID控制温控系统设计方案C语言程序代码文档格式.docx_第20页
第20页 / 共30页
亲,该文档总共30页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

模糊PID控制温控系统设计方案C语言程序代码文档格式.docx

《模糊PID控制温控系统设计方案C语言程序代码文档格式.docx》由会员分享,可在线阅读,更多相关《模糊PID控制温控系统设计方案C语言程序代码文档格式.docx(30页珍藏版)》请在冰点文库上搜索。

模糊PID控制温控系统设计方案C语言程序代码文档格式.docx

floatP_temp=20.0。

floatKp。

floatKi。

floatKd。

floatErr=0.0。

floatLast_Err=0.0。

floatD_Err=0.0。

floatSum_Err=0.0。

floatU=0.0。

/******************************

函数功能:

延时

******************************/

voiddelay_ms(ucharz)

{

uchari。

ucharj。

for(i=z。

i>

0。

i--)

for(j=360。

j>

j--)。

}

voiddelay_us(ucharz)

i--)。

voidLCD_WriteData(ucharDat)

RS=1。

P1=Dat。

delay_us(10)。

EN=1。

EN=0。

voidLCD_WriteCOM(ucharcom)

RS=0。

P1=com。

voidShow_Num(ucharx,uchary,ucharn,floatnum)

uchara[3]。

uintTemp。

Temp=(int)num。

for(i=0。

i<

n。

i++)

{

a[i]=Temp%10。

Temp=Temp/10。

}

if(y%2==1)

LCD_WriteCOM(0x80+x)。

else

LCD_WriteCOM(0x80+0x40+x)。

for(i=n。

LCD_WriteData(a[i-1]+0x30)。

voidShow_Ki(ucharnum_Ki)

{

ucharTemp。

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)。

Show_Num(7,2,1,Temp)。

voidShow_char(ucharx,uchary,ucharch)

LCD_WriteData(ch)。

voidLCD_Init(void)

RW=0。

LCD_WriteCOM(0x38)。

LCD_WriteCOM(0x0c)。

LCD_WriteCOM(0x06)。

LCD_WriteCOM(0x01)。

/***********************************

显示函数

*************************************/

voidLCD_display(void)

Show_char(1,1,'

T'

)。

Show_char(0,1,'

P'

Show_char(2,1,'

:

'

Show_Num(3,1,3,P_temp)。

Show_char(10,1,'

S'

Show_char(11,1,'

Show_char(12,1,'

Show_Num(13,1,3,S_temp)。

Show_char(0,2,'

Show_char(1,2,'

Show_Num(2,2,2,Kp)。

Show_char(5,2,'

I'

Show_char(6,2,'

Show_char(8,2,'

.'

Show_Ki(Ki)。

Show_char(12,2,'

D'

Show_char(13,2,'

Show_Num(14,2,2,Kd)。

/************************************

定时器2初始化

voidTimer2_Init()

RCAP2H=(65536-300)/256。

RCAP2L=(65536-300)%256。

TH2=RCAP2H。

TL2=RCAP2L。

ET2=1。

TR2=1。

EA=1。

/*************************************

键盘扫描,调整设置温度

****************************************/

voidkey_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)

if(KEY2==0)

0)

S_temp=S_temp-1。

elseif(S_temp<

=0)

S_temp=0。

KEY2)。

}

if(KEY3==0)

if(KEY3==0)

if(S_temp<

=190)

S_temp=S_temp+10。

KEY3)。

}

if(KEY4==0)

{

if(KEY4==0)

=10)

S_temp=S_temp-10。

KEY4)。

if(KEY5==0)

if(KEY5==0)

flag_start=1。

KEY5)。

PID的计算

**********************************/

voidPID_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>

if(U>

U=200。

flag=1。

}

U=-U。

flag=0。

}

/***********************************************

PID参数Kp的计算

************************************************/

floatfuzzy_kp(floate,floatec)//e,ec,表示误差,误差变化率

{

floatKp_calcu。

ucharnum,pe,pec。

floatcodeeRule[7]={-3.0,-2.0,-1.0,0.0,1.0,2.0,3.0}。

//误差E的模糊论域

floatcodeecRule[7]={-3.0,-2.0,-1.0,0.0,1.0,2.0,3.0}。

//误差变化率EC的模糊论域

floateFuzzy[2]={0.0,0.0}。

//隶属于误差E的隶属程度

floatecFuzzy[2]={0.0,0.0}。

//隶属于误差变化率EC的隶属程度

floatcodekpRule[4]={0.0,8.0,16.0,24.0}。

//Kp的模糊子集

floatKpFuzzy[4]={0.0,0.0,0.0,0.0}。

//隶属于Kp的隶属程度

intcodeKpRule[7][7]=//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隶属函数描述*****/

if(e<

eRule[0])

eFuzzy[0]=1.0。

pe=0。

elseif(eRule[0]<

=e&

&

e<

eRule[1])

eFuzzy[0]=(eRule[1]-e)/(eRule[1]-eRule[0])。

elseif(eRule[1]<

eRule[2])

eFuzzy[0]=(eRule[2]-e)/(eRule[2]-eRule[1])。

pe=1。

elseif(eRule[2]<

eRule[3])

eFuzzy[0]=(eRule[3]-e)/(eRule[3]-eRule[2])。

pe=2。

elseif(eRule[3]<

eRule[4])

{eFuzzy[0]=(eRule[4]-e)/(eRule[4]-eRule[3])。

pe=3。

elseif(eRule[4]<

eRule[5])

eFuzzy[0]=(eRule[5]-e)/(eRule[5]-eRule[4])。

pe=4。

elseif(eRule[5]<

eRule[6])

eFuzzy[0]=(eRule[6]-e)/(eRule[6]-eRule[5])。

pe=5。

eFuzzy[0]=0.0。

pe=5。

eFuzzy[1]=1.0-eFuzzy[0]。

/*****误差变化率EC隶属函数描述*****/

if(ec<

ecRule[0])

ecFuzzy[0]=1.0。

pec=0。

elseif(ecRule[0]<

=ec&

ec<

ecRule[1])

ecFuzzy[0]=(ecRule[1]-ec)/(ecRule[1]-ecRule[0])。

pec=0。

elseif(ecRule[1]<

ecRule[2])

ecFuzzy[0]=(ecRule[2]-ec)/(ecRule[2]-ecRule[1])。

pec=1。

elseif(ecRule[2]<

ecRule[3])

ecFuzzy[0]=(ecRule[3]-ec)/(ecRule[3]-ecRule[2])。

pec=2。

elseif(ecRule[3]<

ecRule[4])

{ecFuzzy[0]=(ecRule[4]-ec)/(ecRule[4]-ecRule[3])。

pec=3。

elseif(ecRule[4]<

ecRule[5])

{ecFuzzy[0]=(ecRule[5]-ec)/(ecRule[5]-ecRule[4])。

pec=4。

elseif(ecRule[5]<

ecRule[6])

{ecFuzzy[0]=(ecRule[6]-ec)/(ecRule[6]-ecRule[5])。

pec=5。

ecFuzzy[0]=0.0。

pec=5。

ecFuzzy[1]=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[0]*kpRule[0]+KpFuzzy[1]*kpRule[1]+KpFuzzy[2]*kpRule[2]

+KpFuzzy[3]*kpRule[3]。

  return(Kp_calcu)。

PID参数Ki的计算

floatfuzzy_ki(floate,floatec)

floatKi_calcu。

floatcodekiRule[4]={0.00,0.01,0.02,0.03}。

floatKiFuzzy[4]={0.0,0.0,0.0,0.0}。

intcodeKiRule[7][7]=

0,0,0,0,0,0,0,

2,0,0,0,0,0,1,

/*****误差隶属函数描述*****/

  if(e<

/*****误差变化隶属函数描述*****/

/***********查询模糊规则表***************/

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]+=eFuzzy[1]*ecFuzzy[0]。

num=KiRule[pe+1][pec+1]。

KiFuzzy[num]+=eFuzzy[1]*ecFuzzy[1]。

/********加权平均法解模糊********/Ki_calcu=KiFuzzy[0]*kiRule[0]+KiFuzzy[1]*kiRule[1]+KiFuzzy[2]*kiRule[2]

+KiFuzzy[3]*kiRule[3]。

return(Ki_calcu)。

/*

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2