본문 바로가기

Software/C언어

PID 제어

728x90

동작 FLOW

 

#include <stdio.h>

// PID 구조체 정의
typedef struct {
  double Kp;         // 비례 상수
  double Ki;         // 적분 상수
  double Kd;         // 미분 상수
  double prev_error; // 이전 오차
  double integral;   // 적분 값
} PIDController;

// PID 초기화 함수
void PID_Init(PIDController *pid, double Kp, double Ki, double Kd) {
  pid->Kp = Kp;
  pid->Ki = Ki;
  pid->Kd = Kd;
  pid->prev_error = 0.0;
  pid->integral = 0.0;
}

// PID 계산 함수
double PID_Compute(PIDController *pid, double setpoint, double measured_value,
                   double dt) {
  double error = setpoint - measured_value;
  pid->integral += error * dt;
  double derivative = (error - pid->prev_error) / dt;
  double output =
      (pid->Kp * error) + (pid->Ki * pid->integral) + (pid->Kd * derivative);
  pid->prev_error = error;

  return output;
}

int main()
{
  PIDController pid;
  PID_Init(&pid, 1.0, 0.1, 0.01); // Kp, Ki, Kd 값 초기화

  double setpoint = 100.0;     // 목표 값
  double measured_value = 0.0; // 초기 측정 값
  double output = 0.0;
  double dt = 1; // 시간 간격 (초 단위)

  // 시뮬레이션 루프
  for (int i = 0; i < 100; i++)
  {
    output = PID_Compute(&pid, setpoint, measured_value, dt);
    // 여기서 measured_value는 시스템의 응답을 시뮬레이션하거나 실제 측정 값을
    // 사용
    measured_value += output * dt; // 단순 시뮬레이션을 위한 업데이트
    printf("시간: %.1f, 출력: %.2f, 측정 값: %.2f\n", i * dt, output,
           measured_value);
  }

  return 0;
}

 

# Kp, Ki, Kd 값을 조정하며 테스트하여 최적의 상태를 찾아야 함.

728x90