|
楼主 |
发表于 2012-12-10 18:35:51
|
显示全部楼层
//实例,三路预测式负反馈控温,1片89S52,注释没那么详细,大家就将就看吧
//-------------------定时中断5,使用定时器2-----------------------
void int_time_st(void) interrupt 5 using 1 // 31.25ms timer
{
CountT++;
if(CountT>159) { CountT=0; }
TF2=0;
}
void HeatControlPre(void)
{
static unsigned int CountHeat,MaxCounHeat,pPhPWM=9000; //以5秒为周期的计数器及计数最大值,当前pwm指针
static uint idata Last_temPT[5],vPT,ErrorPT,EPT_adj; //前5秒内记忆的温度数据(每一秒一个数据),温升速率,温度偏差,调整后的温度偏差
static uchar plvPT,plErrorPT,plEPT_adj,kP_Pre=0; //温升速率正负,温度偏差正负,调整后的温度偏差正负,预测k系数
static uint idata pHhPWM=100,Last_temHT[5],vHT,ErrorHT,EHT_adj;
static uchar plvHT,plErrorHT,plEHT_adj,kH_Pre=0;
static uint idata pKhPWM=100,Last_temKT[5],vKT,ErrorKT,EKT_adj;
static uchar plvKT,plErrorKT,plEKT_adj,kK_Pre=0;
if(PHToDeal)
{
PHToDeal=0; SetPT&=0xfff0; SetPT|=0x08;
if((CountHeat>1000)&&((CountT>>5)==4)) { MaxCounHeat=CountHeat; CountHeat=0; }
if(temPT>SetPT) { ErrorPT=temPT-SetPT; plErrorPT=1; } else {ErrorPT=SetPT-temPT; plErrorPT=0;}
if(temPT>Last_temPT[CountT>>5]) { vPT=temPT-Last_temPT[CountT>>5]; plvPT=1; } else { vPT=Last_temPT[CountT>>5]-temPT; plvPT=0;}
if(plErrorPT)
{
if(plvPT) { EPT_adj=kP_Pre*vPT+ErrorPT; plEPT_adj=1; }
else {
if(ErrorPT>(kP_Pre*vPT)) { EPT_adj=ErrorPT-kP_Pre*vPT; plEPT_adj=1; }
else { EPT_adj=kP_Pre*vPT-ErrorPT; plEPT_adj=0; }
}
}
else
{
if(plvPT==0) { EPT_adj=kP_Pre*vPT+ErrorPT; plEPT_adj=0; }
else {
if(ErrorPT>(kP_Pre*vPT)) { EPT_adj=ErrorPT-kP_Pre*vPT; plEPT_adj=0; }
else { EPT_adj=kP_Pre*vPT-ErrorPT; plEPT_adj=1; }
}
}
if(plEPT_adj) //re
{
if((pPhPWM+(EPT_adj>>2))<MaxCounHeat) pPhPWM+=((EPT_adj>>2));
}
else
{
if(pPhPWM>((EPT_adj>>2))) pPhPWM-=((EPT_adj>>2));
}
Last_temPT[CountT>>5]=temPT;
if(80>(EPT_adj>>2)) kP_Pre=82-(EPT_adj>>2);
}
if(HHToDeal)
{
HHToDeal=0; SetHT&=0xfff0; SetHT|=0x08;
// if(CountT==1) { MaxCounHeat=CountHeat; CountHeat=0; }
if(temHT>SetHT) { ErrorHT=temHT-SetHT; plErrorHT=1; } else {ErrorHT=SetHT-temHT; plErrorHT=0;}
if(temHT>Last_temHT[CountT>>5]) { vHT=temHT-Last_temHT[CountT>>5]; plvHT=1; } else { vHT=Last_temHT[CountT>>5]-temHT; plvHT=0;}
if(plErrorHT)
{
if(plvHT) { EHT_adj=kH_Pre*vHT+ErrorHT; plEHT_adj=1; }
else {
if(ErrorHT>(kH_Pre*vHT)) { EHT_adj=ErrorHT-kH_Pre*vHT; plEHT_adj=1; }
else { EHT_adj=kH_Pre*vHT-ErrorHT; plEHT_adj=0; }
}
}
else
{
if(plvHT==0) { EHT_adj=kH_Pre*vHT+ErrorHT; plEHT_adj=0; }
else {
if(ErrorHT>(kH_Pre*vHT)) { EHT_adj=ErrorHT-kH_Pre*vHT; plEHT_adj=0; }
else { EHT_adj=kH_Pre*vHT-ErrorHT; plEHT_adj=1; }
}
}
if(plEHT_adj) //re
{
if((pHhPWM+(EHT_adj>>1))<MaxCounHeat) pHhPWM+=((EHT_adj>>1));
}
else
{
if(pHhPWM>((EHT_adj>>1))) pHhPWM-=((EHT_adj>>1));
}
Last_temHT[CountT>>5]=temHT;
if(40>(EHT_adj>>3)) kH_Pre=50-(EHT_adj>>3);
}
if(KHToDeal)
{
KHToDeal=0; SetKT&=0xfff0; SetKT|=0x08;
// if(CountT==1) { MaxCounHeat=CountHeat; CountHeat=0; }
if(temKT>SetKT) { ErrorKT=temKT-SetKT; plErrorKT=1; } else {ErrorKT=SetKT-temKT; plErrorKT=0;}
if(temKT>Last_temKT[CountT>>5]) { vKT=temKT-Last_temKT[CountT>>5]; plvKT=1; } else { vKT=Last_temKT[CountT>>5]-temKT; plvKT=0;}
if(plErrorKT)
{
if(plvKT) { EKT_adj=kK_Pre*vKT+ErrorKT; plEKT_adj=1; }
else {
if(ErrorKT>(kK_Pre*vKT)) { EKT_adj=ErrorKT-kK_Pre*vKT; plEKT_adj=1; }
else { EKT_adj=kK_Pre*vKT-ErrorKT; plEKT_adj=0; }
}
}
else
{
if(plvKT==0) { EKT_adj=kK_Pre*vKT+ErrorKT; plEKT_adj=0; }
else {
if(ErrorKT>(kK_Pre*vKT)) { EKT_adj=ErrorKT-kK_Pre*vKT; plEKT_adj=0; }
else { EKT_adj=kK_Pre*vKT-ErrorKT; plEKT_adj=1; }
}
}
if(plEKT_adj) //re
{
if((pKhPWM+(EKT_adj)>>1)<MaxCounHeat) pKhPWM+=((EKT_adj)>>1);
}
else
{
if(pKhPWM>((EKT_adj)>>1)) pKhPWM-=((EKT_adj)>>1);
}
Last_temKT[CountT>>5]=temKT;
if(40>(EKT_adj)>>3) kK_Pre=(40-(EKT_adj>>3));
}
if((CountHeat>pPhPWM)&&(temPT<0x5D0)) PHeaterOn;
else if(CountHeat<pPhPWM) PHeaterOff;
if((CountHeat>pHhPWM)&&(temHT<0x5D0)) HHeaterOn;
else if(CountHeat<pHhPWM) HHeaterOff;
if((CountHeat>pKhPWM)&&(temKT<0x5D0)) KHeaterOn;
else if(CountHeat<pKhPWM) KHeaterOff;
CountHeat++;
}
main()
{
uchar idata temk;
SP=0x4F;
InitSys();
while(1)
{
if(setitem==0)
{
Ttick=CountT;
temk=GetKey();
switch(temk)
{
case NoKeyPressed: nop; break;
case KeySetPressed: { setitem=1; } break;
case KeyHeatPressed: { if(Heating) Heating=0; else Heating=1; } break;
case KeyUpPressed: { PassWordCnt++; } break;
case KeyDnPressed: { PwDeal(); } break;
case KeySetLasted: { setitem=4; } break;
case KeyHeatLasted: nop; break;
case KeyUpLasted: { setitem=6; } break;
case KeyDnLasted: { setitem=5; } break;
case KeyRollPressed: { TankSel++; if(TankSel>2) TankSel=0; } break;
case KeyMultiPressed: nop; break;
default : nop; break;
}
SetMenuDeal();
RefreshSegLed();
if(TankSel==0) { ShowT(temPT); BLedPiaoOff=0; BLedHongOff=1; BLedKaoOff=1; }
if(TankSel==1) { ShowT(temKT); BLedPiaoOff=1; BLedHongOff=0; BLedKaoOff=1; }
if(TankSel==2) { ShowT(temHT); BLedPiaoOff=1; BLedHongOff=1; BLedKaoOff=0; }
Ttick_cmp=Ttick;
}
else BLedTestOff=1;
if((setitem>0)&&(setitem<4)) SetMenuDeal();
if(setitem==4) ShowVerMenu();
if(setitem==5) RuntimeMenu();
if(setitem==6) ErrorRocMenu();
HeatDeal();
ErrorDeal();
}
nop;
} |
|