武汉理工大学《计算机控制技术》课程设计说明书
if (k==1&&DINcon==1){DIN=1;} //小数点显示 discan=scan_con[k]; //位选 delay(250); }
/--------温度数据处理--------/ work_temp(uint tem) { uchar n=0;
if(tem>6348) // 温度值正负判断
{tem=65536-tem;n=1;} // 负温度求补码,标志位置1 display[4]=tem&0x0f; // 取小数部分的值 display[0]=ditab[display[4]]; // 存入小数部分显示值
display[4]=tem>>4; // 取中间八位,即整数部分的值 display[3]=display[4]/100; // 取百位数据暂存 display[1]=display[4]0; // 取后两位数据暂存 display[2]=display[1]/10; // 取十位数据暂存 display[1]=display[1];
nowtp=display[3]*100+display[2]*10+display[1]; //计算当前温度 send_Da[0]=nowtp; //把当前温度储存到发送缓存区 /--------PID运算函数---------------/ voidpid()
{ static int diff[19]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; staticintsum_diff=0; //Σ(diff) staticuintcurr_=0;
21
武汉理工大学《计算机控制技术》课程设计说明书
floatp_out,i_out,d_out,temp_pid; float pwm_0; temp_pid=diff[curr_]; if(curr_+1>=19)curr_=0; elsecurr_+=1; sum_diff-=diff[curr_]; diff[curr_]=settp-nowtp; sum_diff+=diff[curr_];
p_out=KP*diff[curr_]; //比例项输出 i_out=KI*sum_diff; //积分项输出
d_out=KD*(diff[curr_]-temp_pid); //微分项输出 pwm_0=KC*settp; //维持功率项 if(i_out>100)i_out=100; //积分分离 if(i_out<-100)i_out=-100;
PWM=p_out+i_out+d_out+pwm_0; //总输出量 if(PWM<0)PWM=0;
积分改进PID控制
else if(PWM>=100)PWM=100; }
// 输出函数
void PWM_OUT(float PWM) {
static uchar t=1; //t=(1--100)周期为4秒 uchar limit; //pid_value输出百分比 limit=(uchar)PWM;
22
武汉理工大学《计算机控制技术》课程设计说明书
if(t<=limit)HEAT=0; //加热 else HEAT=1; //停止加热 t++; if(t>100)t=1; }
23