pid温度调节


/温度控制
typedef struct
{
u8 HeatEnable; //加热使能
float SetPoint; //设定值
float Kp; //比例系数
float Ki; //积分系数
float Kd; //微分系数
float PrevError; //最后第二次误差数Er[-2]
float LastError; //最后 一次误差数Er[-1]
float SumError; //误差积分
float dError; //微分项
u16 Result;
u8 HeatState; //加热状态
u8 SkipHeat37Bit; //跳过预温
u8 ConstTempBit; //进入恒温状态
u16 PWM_Result; //最终PWM占空比
u16 TimeS; //时间(秒)
}PIDType;

PIDType PID;

void
Init_PIDData(u8 En1Dis0) { //根据调试结果确认的变量(除非加热曲线异常,否则不改) PID.SetPoint = 设定值;// 2 PID.Kp = 3.9; PID.Ki = 0; PID.Kd = 0;//PID过程变量清0 PID.PrevError = 0; // 6 PID.LastError = 0; // 7 PID.SumError = 0; // 8 PID.dError = 0; // 9 PID.Result = 0; // 10 PID.HeatState = 0; // 11 PID.PWM_Result = 0; // 12 PID.TimeS = 0; // 13 } u8 PIDCalc(PIDType *pp, float CurrentPoint) { float Error; //偏差 float Calc_Result; Error = pp->SetPoint - CurrentPoint; //偏差值 = 设定值-输入值(当前值) pp->SumError += Error; //积分 = 积分+偏差 --偏差的累加 pp->dError = pp->LastError - pp->PrevError;//当前微分 = 最后误差 - 之前误差 pp->PrevError = pp->LastError; //更新“之前误差” pp->LastError = Error; //更新“最后误差” Calc_Result = pp->Kp * pp->LastError //比例项 = 比例常数 * 偏差 +pp->Ki * pp->SumError //积分项 = 积分常数 * 误差积分 +pp->Kd * pp->dError; //微分项 = 微分常数 * 当前微分 pp->Result = Calc_Result; //超限处理 if(Calc_Result < 0 ) Calc_Result = 0; if(Calc_Result > 100) Calc_Result = 100; return Calc_Result; }

void PWM_Control
{
  Jmp = PIDCalc(&PID, 实际温度);
  if(Jmp >= 100)
  {
    TIMx->CCR3 = arr*0.5;//50%
  }
  if(Jmp <= 0)
  {
    TIMx->CCR3 = arr*0.99;
  }
  if((Jmp>0)&&(Jmp<100))
  {
    TIMx->CCR3 = arr*((100-Jmp*0.5)/100);
  }

}

 



 

posted @ 2020-09-22 19:59  北ღ冥  阅读(891)  评论(0编辑  收藏  举报