自己写的pid代码
//位置型PID
typedef struct _position_pid{
float target_value; //定义设定值
float measure_value; //定义实际值
float output_value; //定义输出值
float output_max;
float output_min;
float err; //定义偏差值
float err_last; //定义上一个偏差值
float integral; //定义积分值
float Kp; //比例系数
float Ki; //积分系数
float Kd; //微分系数
}position_pid_t;
float position_pid_calc(position_pid_t *pid, float target_value, float measure_value)
{
pid->target_value = target_value;
pid->measure_value = measure_value;
pid->output_value = 0;
pid->err = pid->target_value - pid->measure_value;
//pid->integral += (pid->Ki * pid->err);
//pid->output_value += pid->integral;
pid->output_value += (pid->Kp * pid->err) + pid->Kd*(pid->err - pid->err_last);
pid->err_last = pid->err;
return pid->output_value;
}
//增量型PID
typedef struct _increment_pid{
float target_value; //定义设定值
float measure_value; //定义实际值
float output_value; //定义输出值
float output_max;
float output_min;
float err; //定义偏差值
float err_last; //定义上一个偏差值
float err_last_last; //定义上一个的上一个偏差值
float Kp; //比例系数
float Ki; //积分系数
float Kd; //微分系数
}increment_pid_t;
float increment_pid_calc(increment_pid_t *pid, float target_value, float measure_value)
{
pid->target_value = target_value;
pid->measure_value = measure_value;
pid->err = pid->target_value - pid->measure_value;
pid->output_value = (pid->Kp * pid->err) - (pid->Ki* pid->err_last) + (pid->Kd * pid->err_last_last);
pid->err_last_last = pid->err_last;
pid->err_last = pid->err;
return pid->output_value;
}
参考:
PID控制算法的C语言实现_沐白001的博客-CSDN博客_pid 实现
位置式PID与增量式PID的介绍和代码实现_【ql君】qlexcel的博客-CSDN博客_pid位置式和增量式详解



