PID实施

时间:2018-06-05 12:44:23

标签: arduino pid

我正在查看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&amp; YMFC忽略时间常数。它如何影响pid计算
  2. YMFC代码,我的术语是

    pid_i_mem_pitch + = pid_i_gain_pitch * pid_error_temp;

  3. 为什么他会乘以错误? labodol只是添加了前一个错误和当前错误,其他两个正在将它与时间变化相乘

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

1 个答案:

答案 0 :(得分:0)

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

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

将这些系统调整为如何调整任何其他PID系统没有区别。

虽然这个系统有效,但这也意味着最终调谐的PID值只能用于这些系统,而不能用于任何其他系统。

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

在YMFC实施中

pid_i_mem_pitch += pid_i_gain_pitch * pid_error_temp;
                ^

注意'='符号前面的'+'符号。这意味着错误正在增加。只是在加法之前进行增益乘法而不是在加法之后。

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

我希望这会有所帮助。