PID代码解读 (c语言版本)
PID的控制流程
根据流程一步步描述代码:
PID代码流程
创建变量
typedef struct
{
float Kp, Ki, Kd;
float error,last_error;
float integral,max_intergral;
float output,max_output;
}PID;
初始化PID的各类参数
void PID_Init(PID *pid,float Kp,float Ki,float Kd,float max_output,float max_intergral)
{
pid->Kp = Kp;
pid->Ki = Ki;
pid->Kd = Kd;
pid->max_output = max_output;
pid->max_intergral = max_intergral;
进行PID的简单运算
float PID_Calc(PID *pid,float setpoint,float feedback)
{
pid->last_error = pid->error;
pid->error = setpoint - feedback;
pid->integral += pid->error;
if(pid->integral > pid->max_intergral)
{
pid->integral = pid->max_intergral;
}
else if(pid->integral < -pid->max_intergral)
{
pid->integral = -pid->max_intergral;
}
pid->output = pid->Kp * pid->error + pid->Ki * pid->integral + pid->Kd * (pid->error - pid->last_error);
if(pid->output > pid->max_output)
{
pid->output = pid->max_output;
}
else if(pid->output < -pid->max_output)
{
pid->output = -pid->max_output;
}
return pid->output;
}
主函数
PID my_pid={0};
int main()
{
PID_Init(&my_pid,0.5,0.5,0.5,100,100);
while(1)
{
float setpoint=scanf("%f",setpoint);
float feedback=scanf("%f",feedback);
float output=PID_Calc(&my_pid,setpoint,feedback);
printf("%f\n",output);
}
return 0;
}
滤波算法
平滑输出:滤波器可以平滑控制信号,减少快速变化的控制输入,这对于需要平滑运动或减少机械磨损的应用非常重要。
减少超调:在某些情况下,未过滤的输入信号可能会导致PID控制器产生过大的控制动作,从而引起系统的超调。滤波器可以通过平滑输入信号来减少这种超调现象。
改善稳定性:滤波器可以帮助稳定控制系统的动态响应,特别是在面对快速变化的输入或外部干扰时。
提高响应速度:虽然滤波器通常会引入一些延迟,但适当设计的滤波器可以确保系统响应既快速又平滑,避免因响应过快而导致的振荡。
一阶滤波算法
//一阶滤波算法
float Filter(float input,float output,float alpha)
{
return alpha * input + (1 - alpha) * output;
}
alpha的大小影响新数据的占比权重,通常来说,alpha越小,新数值占比权重越小,数据变化幅度越小,数据更加平缓,但是灵敏性差。
二阶滤波算法
等学了再写!