水温PID控制.doc
上传人:sy****28 上传时间:2024-09-14 格式:DOC 页数:4 大小:21KB 金币:16 举报 版权申诉
预览加载中,请您耐心等待几秒...

水温PID控制.doc

水温PID控制.doc

预览

在线预览结束,喜欢就下载吧,查找使用更方便

16 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

水温PID控制程序#include<reg52.h>#include<intrins.h>#include<string.h>#defineucharunsignedchar#defineuintunsignedint#defineIN00x7ff8sbitdula=P1^5;sbitwela=P1^6;sbitcs=P2^6;sbitEOC=P1^7;sbitoutput=P1^0;ucharhigh_time,low_time,count=0;uchartemper,SetPoint,out;ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};structPID{unsignedintSetPoint;unsignedintProportion;//比例常数ProportionalConstunsignedintIntegral;//积分常数IntegralConstunsignedintDerivative;//微分常数DerivativeConstunsignedintLastError;//Error[-1]unsignedintSumError;//SumsofErrors};structPIDspid;//PIDControlStructurevoiddelay(uintz){uintx,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}voiddelay_10us(ucharn)//延时10*n微秒{do{_nop_();_nop_();_nop_();n--;}while(n);}voiddisplay(uchartemp)//显示子程序{ucharshi,ge;shi=temp/10;ge=temp%10;dula=1;P0=table[shi];dula=0;wela=1;//开位选P0=0xfe;//选择第一个LED亮wela=0;//关位选delay(1);//延时dula=1;//打开段选P0=table[ge];//输出个位显示值dula=0;//关段选wela=1;//开位选P0=0xfd;//选择第二个LED亮wela=0;//关位选delay(1);//延时}ucharad0809()//AD转换子程序{ucharg,h;*((ucharxdata*)IN0)=0xff;//开启转换delay_10us(13);//延时130uswhile(EOC==0);//等待转换结束g=*((ucharxdata*)IN0);//取转换数据h=((5*g)/255)*90;return(h);}voidda0832(ucharw)//DA输出子程序{cs=0;P0=w;cs=1;}voidPIDInit(structPID*pp)//初始化PID参数子程序{memset(pp,0,sizeof(structPID));}uintPIDCalc(structPID*pp,uintNextPoint)//PID控制子程序{uintdError,Error;Error=pp->SetPoint-NextPoint;pp->SumError+=Error;dError=Error-pp->LastError;pp->LastError=Error;return(pp->Proportion*Error+pp->Integral*pp->SumError+pp->Derivative*dError);SetPoint=pp->SetPoint;}voidserve_T0()interrupt1using1//T0中断服务子程序,{//用于控制电平的翻转,40us*100=4ms周期if(++count<=(high_time))//把脉冲周期分100等分output=1;//当等分值count小于high_time值时,输出高电平elseif(count<=100){output=0;//否则低电平}elsecount=0;TH0=0xff;TL0=0xec;}voidcompare_temper()//温度比较处理确定占空比子程序{uchari;temper=ad0809();//取当时