自己写的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;
}
参考:

本文介绍了如何使用C语言实现位置型和增量型PID控制器。位置型PID通过累计误差进行积分,而增量型PID则利用偏差的变化率进行微分计算。代码示例展示了两种PID算法的基本结构和计算过程。
828

被折叠的 条评论
为什么被折叠?



