Реализация PID - PullRequest
       30

Реализация PID

0 голосов
/ 05 июня 2018

Я смотрю ссылки на код для простой реализации PID в Arduino.

это несколько реализаций 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;

лободол

 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

 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. лободол и YMFC, игнорируя постоянную времени.как это влияет на вычисления pid
  2. код YMFC, термин i

    pid_i_mem_pitch + = pid_i_gain_pitch * pid_error_temp;

почему он умножаетсяс ошибкой?labodol просто добавляет предыдущую ошибку с текущей ошибкой, а две другие умножают ее на изменение времени

также приветствуются любые другие простые предложения по реализации.

1 Ответ

0 голосов
/ 06 июня 2018

Системы lobodol и YMFC работают без использования постоянной времени, потому что код написан таким образом, что Arduino не будет делать ничего, кроме управления.

Таким образом, разница во времени между вычислениямиОшибки P, I и D остаются неизменными.

Нет разницы в том, как вы настроите эти системы, как в любой другой системе PID.

Пока эта система работает, этатакже означает, что окончательно настроенные значения PID будут использоваться только с этими системами, а не с какими-либо другими.

Другие системы, которые используют разницу во времени в своих расчетах.Это означает, что настроенные значения PID могут быть использованы (более надежно по сравнению с лободолом и YMFC) и с другими системами.

В реализации YMFC

pid_i_mem_pitch += pid_i_gain_pitch * pid_error_temp;
                ^

Обратите внимание на '+'знак перед знаком «=».Это означает, что ошибка добавляется.Просто умножение усиления выполняется перед сложением, а не после сложения.

Оба метода дают одинаковый (теоретически) результат.

Надеюсь, это поможет.

...