大部分时候可用例程,扔给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%之类的,反正你自己拿捏,这玩意要动手调了才知道