PID 温度控制的实现(3)
时间:2025-07-07
时间:2025-07-07
ID 温度控制的实现
int dError,Error;
Error = pp->SetPoint*10 - NextPoint; // 偏差,设定值减去当前采样值
pp->SumError += Error; // 积分,历史偏差累加
dError = Error-pp->LastError; // 当前微分,偏差相减
pp->PrevError = pp->LastError; // 保存
pp->LastError = Error;
+ pp->Integral * pp->SumError // 积分项
- pp->Derivative * dError // 微分项
);
}
在实际运算时,由于水具有很大的热惯性,而且PID 运算中的I(积分项)具有非常明显的延迟效应所以不能保留,我们必须把积分项去掉,相反D(微分项)则有很强的预见性,能够加快反应速度,抑制超调量,所以积分作用应该适当加强才能达到较佳的控制效果,系统最终选择PD 控制方案,下面C 代码所示为PD 控制的实现过程:
float PIDCalc( PID *pp, int NextPoint )
{
int dError,Error;
Error = pp->SetPoint*10 - NextPoint; // 偏差,设定值减去当前采样值
dError = Error-pp->LastError; // 当前微分,偏差相减
pp->PrevError = pp->LastError; // 保存
pp->LastError = Error;
return (pp->Proportion * Error // 比例项
- pp->Derivative * dError // 微分项
);
}
温度控制实现
通过温度的PID 运算,产生结果fOut,该参数决定是否加热,加热时间是多长。该程序如下:
stPID.Proportion = 2; //设置PID 比例值
stPID.Integral = 0; //设置PID 积分值
stPID.Derivative = 5; //设置PID 微分值
fOut = PIDCalc ( &stPID,(int)(fT*10) ); //PID 计算
if(fOut<=0)
*P_IOA_Buffer &= 0xff7f; //温度高于设定值,关闭加热器
else
*P_IOA_Buffer |= 0x0080; //温度低于设定值,打开加热器
加热时间由主函数计算,由TimerB 中断控制。主程序中通过PIDCalc 函数得到fOut 参数,如果该参数大于“0”,则开启加热器。IRQ2_TMB 中断一直处于允许状态,每进入一次IRQ2_TMB 中断,fOut 参数减1,直到fOut = 0,停止加热。如果PIDCalc 计算结果比较大说明离目标温度相差较大,则加热时间比较长,如果计算结果比较小,说明离目标温度相差较小,加热时间相对较短。
下一篇:红旗品牌发展历程