PID小算法

typedef struct _PID
{uchar const code ucAddWater_pwm_def[]={80,80,80,70,70,70,60,60,60,55,55};
uchar HeatEnable; //加热使能
float Kp; //比例系数
float Ki; //积分系数
float Kd; //微分系数
float PrevError; //最后第二次误差数Er[-2]
float LastError; //最后 一次误差数Er[-1]
float SumError; //误差积分
float dError; //微分项
float Result;
uchar Max; //限幅
uchar Min; //限幅
uchar HeatState; //加热状态
uchar ConstTempBit; //进入恒温状态
uint PWM_Result; //最终PWM占空比
uint TimeS; //时间(秒)
}xdata PID;

// PID初始化
void Clean_PIDData(PID *pid)
{        
    pid->Kp         = 1;
    pid->Ki         = 0.2;
    pid->Kd         = 0.1;
    pid->Max           = 0;
    pid->Min              = 0;
    pid->PrevError  = 0;
    pid->LastError  = 0;
    pid->SumError   = 0;
    pid->dError     = 0;
    pid->Result     = 0;
    pid->HeatState  = 0;
    pid->PWM_Result = 0;
    pid->TimeS      = 0;
}

uchar PIDCalc(PID *pp, float reference,float CurrentPoint,float DefPoint)
{
    float  Error;                                 //偏差
    float Calc_Result;
    
    Error         = reference - CurrentPoint;  //偏差值   = 设定值-输入值(当前值)
    pp->SumError += Error;                        //积分     = 积分+偏差  --偏差的累加
    pp->dError    = pp->LastError - pp->PrevError;//当前微分 = 最后误差 - 之前误差
    pp->PrevError = pp->LastError;                //更新“之前误差”
    pp->LastError = Error;                        //更新“最后误差”


    if(pp->TimeS==0){pp->TimeS=1;pp->SumError = (PWM_MAX-DefPoint)/pp->Ki;}//开始运算时补偿
    
    LIMIT(pp->SumError,PWM_MIN,PWM_MAX);//积分必须限制

    Calc_Result = pp->Kp * pp->LastError          //比例项   = 比例常数 * 偏差
                 +pp->Ki * pp->SumError           //积分项   = 积分常数 * 误差积分
                 +pp->Kd * pp->dError;            //微分项   = 微分常数 * 当前微分           
    pp->Result = Calc_Result;
        
    LIMIT(pp->Result,0,PWM_MAX-PWM_MIN);//输出限幅
    pp->Result =(float)PWM_MAX-pp->Result;//最终输出
    return Calc_Result;
}
PIDCalc(&pid,uc_Set_Temp,ucOut_Temp,ucAddWater_pwm_def[uc_Set_Temp/10]);

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值