PID

来自Jack's Lab
(版本间的差异)
跳转到: 导航, 搜索
(Reference)
第1行: 第1行:
 
== Overview ==
 
== Overview ==
 +
 +
<source lang=cpp>
 +
typedef struct {
 +
    float Kp;      // 比例系数
 +
    float Ki;      // 积分系数 
 +
    float Kd;      // 微分系数
 +
    float integral; // 积分项
 +
    float prev_error; // 上次误差
 +
    float setpoint;  // 目标电流
 +
} PID_Controller;
 +
 +
float PID_Calculate(PID_Controller *pid, float actual)
 +
{
 +
    float error = pid->setpoint - actual;
 +
   
 +
    // 比例项
 +
    float p_out = pid->Kp * error;
 +
   
 +
    // 积分项(防饱和)
 +
    pid->integral += error;
 +
    if(pid->integral > 1000) pid->integral = 1000;
 +
    if(pid->integral < -1000) pid->integral = -1000;
 +
    float i_out = pid->Ki * pid->integral;
 +
   
 +
    // 微分项
 +
    float d_out = pid->Kd * (error - pid->prev_error);
 +
    pid->prev_error = error;
 +
   
 +
    // 输出
 +
    float output = p_out + i_out + d_out;
 +
   
 +
    // 限幅
 +
    if(output > 0.95) output = 0.95;
 +
    if(output < 0.05) output = 0.05;
 +
   
 +
    return output;
 +
}
 +
</source>
  
 
<br><br>
 
<br><br>

2026年1月29日 (四) 11:22的版本

1 Overview

typedef struct {
    float Kp;      // 比例系数
    float Ki;      // 积分系数  
    float Kd;      // 微分系数
    float integral; // 积分项
    float prev_error; // 上次误差
    float setpoint;   // 目标电流
} PID_Controller;

float PID_Calculate(PID_Controller *pid, float actual)
{
    float error = pid->setpoint - actual;
    
    // 比例项
    float p_out = pid->Kp * error;
    
    // 积分项(防饱和)
    pid->integral += error;
    if(pid->integral > 1000) pid->integral = 1000;
    if(pid->integral < -1000) pid->integral = -1000;
    float i_out = pid->Ki * pid->integral;
    
    // 微分项
    float d_out = pid->Kd * (error - pid->prev_error);
    pid->prev_error = error;
    
    // 输出
    float output = p_out + i_out + d_out;
    
    // 限幅
    if(output > 0.95) output = 0.95;
    if(output < 0.05) output = 0.05;
    
    return output;
}



2 Reference







个人工具
名字空间

变换
操作
导航
工具箱