PID执行

PID Implementation

我正在查看 arduino 中简单 PID 实现的代码参考。

这些是为数不多的实现 YMFC

  pid_error_temp = gyro_pitch_input - pid_pitch_setpoint;
  pid_i_mem_pitch += pid_i_gain_pitch * pid_error_temp;
  if(pid_i_mem_pitch > pid_max_pitch)pid_i_mem_pitch = pid_max_pitch;
  else if(pid_i_mem_pitch < pid_max_pitch * -1)pid_i_mem_pitch = pid_max_pitch * -1;

  pid_output_pitch = pid_p_gain_pitch * pid_error_temp + pid_i_mem_pitch + pid_d_gain_pitch * (pid_error_temp - pid_last_pitch_d_error);
  if(pid_output_pitch > pid_max_pitch)pid_output_pitch = pid_max_pitch;
  else if(pid_output_pitch < pid_max_pitch * -1)pid_output_pitch = pid_max_pitch * -1;

  pid_last_pitch_d_error = pid_error_temp;

lobodol

 error_sum[PITCH] += errors[PITCH];
 deltaErr[PITCH] = errors[PITCH] - previous_error[PITCH];
 previous_error[PITCH] = errors[PITCH];
 pitch_pid = (errors[PITCH] * Kp[PITCH]) + (error_sum[PITCH] * Ki[PITCH]) + (deltaErr[PITCH] * Kd[PITCH]);

Arduino Forum Post

 double PTerm = kp * error;
  integral += error * (double) (timeChange * .000001);
  ITerm = ki * integral;
  // Derivative term using angle change
  derivative = (input - lastInput)  / (double)(timeChange * .000001);
  DTerm =  (-kd * derivative);
  //Compute PID Output
  double output = PTerm + ITerm + DTerm ;

brettbeauregard

void Compute()
{
   /*How long since we last calculated*/
   unsigned long now = millis();
   double timeChange = (double)(now - lastTime);

   /*Compute all the working error variables*/
   double error = Setpoint - Input;
   errSum += (error * timeChange);
   double dErr = (error - lastErr) / timeChange;

   /*Compute PID Output*/
   Output = kp * error + ki * errSum + kd * dErr;

   /*Remember some variables for next time*/
   lastErr = error;
   lastTime = now;
}

任何人都可以给我解释以下内容:

  1. lobodol & YMFC 忽略时间常数。它如何影响 pid 计算
  2. YMFC代码第i项是

    pid_i_mem_pitch += pid_i_gain_pitch * pid_error_temp;

为什么他乘以错误? labodol 只是将先前的错误与当前的错误相加,其他两个将其与时间变化相乘

也欢迎任何其他简单的实施建议。

lobodol 和 YMFC 系统在不使用时间常数的情况下工作,因为代码的编写方式使得 Arduino 除了控制之外不会做任何事情。

因此,P、I 和 D 误差计算之间的时间差将保持不变。

调整这些系统的方式与调整任何其他 PID 系统的方式没有区别。

虽然该系统有效,但这也意味着最终调整的 PID 值将仅用于这些系统,而不用于任何其他系统。

在计算中使用时差的其他系统。这意味着调整后的 PID 值也可以用于其他系统(与 lobodol 和 YMFC 相比更可靠)。

在YMFC实现中

pid_i_mem_pitch += pid_i_gain_pitch * pid_error_temp;
                ^

注意“=”号之前的“+”号。这意味着正在添加错误。只是增益乘法是在加法之前完成的,而不是在加法之后。

两种方法产生相同的(理论上)结果。

希望对您有所帮助。