大部分时候可用例程,扔给ai修改变量

其中 data是一个结构体指针,其定义如下:

typedef struct  _PID{

float Kp;            //PID三个参数

float Ki;

float Kd;

float set;          //目标值

float fdb;          //当前值

float out;          //pid输出

float Pout;         //比例控制量

float Iout;         //积分控制量

float Dout;         //微分控制量

float Dbuf[3];      //微分项 0最新 1上一次 2上上次

float error[3];     //误差项 0最新 1上一次 2上上次

}PID_STRUCT;

请根据以上信息和网上查阅的资料,完成下面函数的编程,并将最终的控制量保存到结构体成员”out”中,(假设用于计算控制器输出的数据,比如目标值,微分项,误差项等,已经保存在输入的参数(即结构体指针data指向的结构体中)

void pid_calc( PID_STRUCT *data)

{

// 自己填充

}

void pid_calc(PID_STRUCT* data)

{

data->error[0] = data->set - data->fdb;

data->Pout = data->Kp * data->error[0];

data->Iout += data->Ki * data->error[0];

data->Dout = data->Kd * (data->error[0] - data->error[1]) + data->Dbuf[1] * data->Kd;

data->out = data->Pout + data->Iout + data->Dout;

data->error[2] = data->error[1];

data->error[1] = data->error[0];

data->Dbuf[2] = data->Dbuf[1];

data->Dbuf[1] = data->Dbuf[0];

data->Dbuf[0] = data->Dout;

}

积分应该要有个上下限,不能越积越多,到时候输出饱和就没用了

每次积分之前判断一下有没有越界

自己加判断,然后这个值是个经验值来着,比如限制积分项的输出不超过系统输出的50%之类的,反正你自己拿捏,这玩意要动手调了才知道