if( Key1 == 0) { Dly_ms(5); if( Key1 == 0) { Set_Temp ++ ; if( Set_Temp>= 99)
Set_Temp = 99 ;
}
while( Key1 ==0 ) { Show_Flag2 = 1; }
}
if( Key2 == 0) { Dly_ms(5); if( Key2 == 0) { Set_Temp -- ; if( Set_Temp<20)
Set_Temp = 20;
}
while( Key2 ==0 ) { Show_Flag2 = 1; }
}
}
}
附录
26
附录
//增量PID算法 #include \#include \extern unsigned intSet_Temp; extern signed intRG_tem_real; extern unsigned char Sw_Flag ;
unsigned char RG_Ki_time1,RG_Ki_time2; double RG_fErr0,RG_fErr1,RG_fErr2; double RG_tem_Err1; struct RG_PP { double Ki_ek0; double Ki_ek1; signed intSetPoint; double SumError; double Proportion; double Integral; double Derivative; double LastError; double PrevError; double Error; double dError;
double FDUk;
}RG_PID;
void RG_PID_Init(void) { RG_PID.Ki_ek0 = 0; RG_PID.Ki_ek1 = 0; RG_PID.SetPoint = Set_Temp; RG_PID.SumError = 0;
RG_PID.Proportion = 5;
27
附录
}
RG_PID.Integral = 0.005; RG_PID.Derivative = 1; RG_PID.LastError = 0; RG_PID.PrevError = 0; RG_PID.Error = 0; RG_PID.dError = 0; RG_PID.FDUk = 0;
void RG_PID_fErr1(void) { }
void RG_PID_fErr2(void)
if(((RG_PID.Error>1)||(RG_PID.Error<-1))&&(RG_fErr0==RG_PID.Error)) { } else { }
RG_Ki_time1=0; RG_PID.Ki_ek0=1;
RG_Ki_time1++; if(RG_Ki_time1==3) { } else { }
RG_PID.Ki_ek0=20;
RG_Ki_time1=0; RG_PID.Ki_ek0=40;
RG_fErr0=RG_PID.Error;
28
附录
{
if((((RG_tem_real-RG_tem_Err1)<2)&&((RG_tem_real-RG_tem_Err1)>-2))&&((RG_
PID.Error>10)||(RG_PID.Error<-10))) { RG_Ki_time2++; if(RG_Ki_time2==3) { RG_Ki_time2=0; RG_PID.Ki_ek1=20;
} else { RG_PID.Ki_ek1=10; }
}
else { RG_Ki_time2=0; RG_PID.Ki_ek1=1; }
RG_tem_Err1=RG_tem_real;
}
void RG_PID_fErr3(void) { if(RG_PID.Ki_ek0>RG_PID.Ki_ek1) { RG_PID.Ki_ek1=1; } else {
RG_PID.Ki_ek0=1; 29
附录
}
}
void RG_PID_Calc(void) { RG_PID.Error = RG_PID.SetPoint - RG_tem_real; // 当前误差 if( RG_PID.Error< 0) { RG_PID.FDUk = 1 ;
}
else if( RG_PID.Error> 10) { RG_PID.FDUk = 999 ; }
else { RG_PID_fErr1(); RG_PID_fErr2(); RG_PID_fErr3();
RG_PID.SumError += RG_PID.Ki_ek0*RG_PID.Error; RG_PID.dError = RG_PID.LastError - RG_PID.PrevError; RG_PID.PrevError = RG_PID.LastError; RG_PID.LastError = RG_PID.Error;
RG_PID.FDUk = RG_PID.Proportion * RG_PID.Error + RG_PID.Integral * RG_PID.SumError
+ RG_PID.Derivative * RG_PID.dError; }
}
void RG_Pwm_Control(void) {
30
// 积分 // 当前微分 // 比例 // 积分项 // 微分项